0

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

当我使用一些分析代码从我的 Android 应用程序中查看问题时,我发现ParseInstallation.getCurrentInstallation().getObjectId()即使 Parse 初始化过程已正确完成,它也会为用户返回 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 并正常工作,没有任何问题。但是,一旦用户遇到问题,即使用户再次安装应用程序,也不会在安装表中为用户创建该对象。

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

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

4

2 回答 2

1

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

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

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

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

如果还有其他问题,我会与您分享。

于 2019-07-26T14:33:46.377 回答
1

我认为 objectId 为空,因为由于某种原因没有保存安装。我建议您使用以下代码并再次检查:

// 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'
于 2019-07-12T02:38:28.203 回答