ParseInstallation.getCurrentInstallation().getObjectId() returns 在特定用户的智能手机中为空

ParseInstallation.getCurrentInstallation().getObjectId() returns null in the particular user's smartphone

我的 Android 应用程序使用 Parse 服务器作为后端服务。 许多用户目前正在使用我的 Android 应用程序。 但是,某些特定用户在安装应用程序时遇到问题,即即使在登录后也没有在安装中创建对象table。

当我使用一些 Analytics 代码查看 Android 应用程序的问题时,我发现即使 Parse 初始化过程已完成,用户的 ParseInstallation.getCurrentInstallation().getObjectId() returns null适当地。 使用 Analytics 代码,在 Parse 初始化后的 10 分钟内,我每 10 秒检查一次该方法,但该方法总是为特定用户返回 null。

// Parse initialization in the onCreate() of Application class
Parse.enableLocalDatastore(this);
Parse.initialize(new Parse.Configuration.Builder(this)
        .applicationId(getString(R.string.parse_app_id))
        .clientKey(getString(R.string.parse_client_key))
        .server(getString(R.string.parse_server_api))
        .build());
ParseUser.enableAutomaticUser();
ParseACL.setDefaultACL(new ParseACL(), true);

// After Log-In, Save the installation.
// (My app user normally would come here 20 ~ 30 seconds or long after the above Parse initialization.) 
ParseInstallation installation = ParseInstallation.getCurrentInstallation();
if (!TextUtils.isEmpty(installation.getObjectId()) { // installation.getObjectId() returns null for the particular user.
    installation.put("GCMSenderId", getString(R.string.fcm_sender_id));
    installation.saveInBackground(
        // will associate the Installation with the User in new SaveCallback()
    );
}

// build.gradle(Module: app)
implementation 'com.github.parse-community.Parse-SDK-Android:parse:1.18.5' 
implementation 'com.github.parse-community.Parse-SDK-Android:fcm:1.18.5'

大多数用户获得有效的 ObjectId 并正常工作,没有任何问题。 但是,一旦用户遇到问题,即使用户再次安装该应用程序,也不再为用户在安装 table 中创建该对象。

我不知道这是否是 Parse 服务器的根本问题。

任何建议都会对我有所帮助。

我认为objectId为null是因为某些原因没有保存安装。我建议您使用以下代码并再次检查:

// Parse initialization in the onCreate() of Application class
Parse.enableLocalDatastore(this);
Parse.initialize(new Parse.Configuration.Builder(this)
        .applicationId(getString(R.string.parse_app_id))
        .clientKey(getString(R.string.parse_client_key))
        .server(getString(R.string.parse_server_api))
        .build());
ParseUser.enableAutomaticUser();
ParseACL.setDefaultACL(new ParseACL(), true);

// After Log-In, Save the installation.
// (My app user normally would come here 20 ~ 30 seconds or long after the above Parse initialization.) 
ParseInstallation installation = ParseInstallation.getCurrentInstallation();
if (TextUtils.isEmpty(installation.getObjectId())) { // installation.getObjectId() returns null for the particular user.
    installation.save();
}
installation.put("GCMSenderId", getString(R.string.fcm_sender_id));
installation.saveInBackground(
    // will associate the Installation with the User in new SaveCallback()
);

// build.gradle(Module: app)
implementation 'com.github.parse-community.Parse-SDK-Android:parse:1.18.5' 
implementation 'com.github.parse-community.Parse-SDK-Android:fcm:1.18.5'

以下是使用 Davi Macêdo 提示的结果:

installation.save() 之后,有时 installation.get("deviceToken") return 无效。 所以我使用了一个迭代例程来等待 installation.get("deviceToken") 到 return 一个有效值。然后我打电话给 installation.saveInBackground()。 在这 10 天里,我一直在观察我的应用程序用户的结果,到目前为止它似乎运行良好。

如果您在 Android phone 等电池供电设备上使用 Parse Client,您将面临与我类似的问题。 最重要的一点是,当phone处于省电模式时,installation.get("deviceToken") returns null的频率更高。 因此,在调用 installation.save()installation.saveInBackground() 之前,您需要确保 phone 未处于省电模式并且网络连接良好。

顺便说一句,在大维的帮助下,我解决了这个问题。感谢 Davi。

如果还有什么问题,我再跟大家分享。