Ios版本的应用程序可以运行,但Android因为没有为React Native App的AccessToken找到合适的构造函数而失败

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (196)

正如标题中所提到的,此应用程序的Ios版本在物理设备上运行良好。但是,当我尝试在Android设备上构建它时,我收到一个错误

error: no suitable constructor found for AccessToken(String,String,String,<null>,<null>,<null>,<null>,<null>)
constructor AccessToken.AccessToken(String,String,String,Collection<String>,Collection<String>,AccessTokenSource,Date,Date,Date) is not applicable
(actual and formal argument lists differ in length)
constructor AccessToken.AccessToken(Parcel) is not applicable
(actual and formal argument lists differ in length)

此错误在FBGraphRequestModule.java文件中突出显示,特别是在此方法中

    private void setConfig(GraphRequest graphRequest, ReadableMap configMap) {
            if (configMap == null) {
                graphRequest.setAccessToken(AccessToken.getCurrentAccessToken());
                return;
            }
            if (configMap.hasKey("parameters")) {
                graphRequest.setParameters(buildParameters(configMap.getMap("parameters")));
            }
            if (configMap.hasKey("httpMethod")) {


graphRequest.setHttpMethod(HttpMethod.valueOf(configMap.getString("httpMethod")));
    }
    if (configMap.hasKey("version")) {
        graphRequest.setVersion(configMap.getString("version"));
    }
    if (configMap.hasKey("accessToken")) {
        graphRequest.setAccessToken(new AccessToken(
            configMap.getString("accessToken"),
            AccessToken.getCurrentAccessToken().getApplicationId(),
            AccessToken.getCurrentAccessToken().getUserId(),
            null,
            null,
            null,
            null,
            null));
    } else {
        graphRequest.setAccessToken(AccessToken.getCurrentAccessToken());
    }
}

进一步来说,

if (configMap.hasKey("accessToken")) {
            graphRequest.setAccessToken(new AccessToken(
                configMap.getString("accessToken"),
                AccessToken.getCurrentAccessToken().getApplicationId(),
                AccessToken.getCurrentAccessToken().getUserId(),
                null,
                null,
                null,
                null,
                null));

我的Java技能很差,所以我不知道如何解决这个问题。

提问于
用户回答回答于

我有同样的问题,我的理解是react-native-fbsdk v0.7.0没有锁定依赖项com.facebook.android:facebook-android-sdk的次要版本。看到compile 'com.facebook.android:facebook-android-sdk:4+'node_modules/react-native-fbsdk/android/。Facebook发布了一个新版本4.38.1,以前称为工作版本 4.37.0。由于次要版本未被锁定,因此较新版本com.facebook.android:facebook-android-sdk:4被拆除并导致破损。

升级到react-native-fbsdk v0.8.0并com.facebook.android:facebook-android-sdk:4.38.1更改二进制包,迫使我们进行完整的应用更新(与仅通过Code-Push更新的UI内容相对)。我们尝试限制二进制版本,因为它们更大,我们的用户不会被迫更新应用程序。

强制解决com.facebook.android:facebook-android-sdk:4+为我们工作的版本

在根build.gradle文件中添加或合并以下内容

allprojects {
    configurations.all {
        resolutionStrategy {
            force 'com.facebook.android:facebook-android-sdk:4.37.0'
        }
    }
}

本文描述了拥有动态依赖性的一些缺点。我建议当你包含一个新的模块锁定所有的动态依赖。这将有助于确保每次重建都能产生可预测的输出。

用户回答回答于

我今天也遇到了这个问题,并通过修改包来获得最后一个参数 - dataAccessExpirationTime来解决。

new AccessToken(
            configMap.getString("accessToken"),
            AccessToken.getCurrentAccessToken().getApplicationId(),
            AccessToken.getCurrentAccessToken().getUserId(),
            null,
            null,
            null,
            null,
            null,
            null)

您将在FBGraphRequestModule.java和Utility.java文件中看到此问题。所以请修复这两个文件。

扫码关注云+社区

领取腾讯云代金券