在 Android 台设备上保存解析安装记录时获得授权

Getting unauthorized when saving parse installation record on Android devices

问题已解决

请注意,我在 index.js 中的解析配置不包含 clientKey,但我的应用正在为 clientKey 传递一个值。

这是 index.js 的更新部分,添加了 clientKey:

var api = new ParseServer({
databaseURI: databaseUri || 'mongodb://mymongodb,
cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
appId: process.env.APP_ID || 'myappid',
masterKey: process.env.MASTER_KEY || 'mymasterkey',
restAPIKey: process.env.REST_API_KEY || 'myrestapikey',
clientKey: 'myclientkey'
....

我在测试时犯的第二个错误是认为 iOS 正在创建新的安装记录 - 我错了,它没有工作......我相信已经测试了升级流程,并且应用程序的旧 Parse 版本创建了安装记录,从而使新的 parse-server 版本能够将推送发送到 iOS。然而,Android 不会以这种方式工作 b/c 安装记录需要 SenderID,因此 Android 的解析服务器版本在升级后无法工作(如 iOS是)。


下面的原始问题

我已按照所有迁移说明从 Parse 切换到 parse-server。解析服务器在 iOS.

上运行良好

使用 Android,我 有时 在尝试保存解析安装时获得授权。我会一直在特定设备上获得授权,直到它工作一次。

安装记录保存成功后,所有后续保存安装记录的调用似乎都有效。

这是相关的 Android 代码:

String parseAppId = getString(R.string.parse_app_id);
String parseClientKey = getString(R.string.parse_client_key);
String parseServer = getString(R.string.parse_server);

Parse.initialize(new Parse.Configuration.Builder(this)
     .applicationId(parseAppId)
     .clientKey(parseClientKey)
     .server(parseServer)
     .build()
);

ParseInstallation parseInstallation = ParseInstallation.getCurrentInstallation();
parseInstallation.saveEventually(new SaveCallback() {
    @Override
    public void done(ParseException e) {
                // e = com.parse.ParseRequest$ParseRequestException: unauthorized
    }
}

这是我在 index.js 中的服务器配置(已编辑实际值):

var api = new ParseServer({
    databaseURI: databaseUri || 'mongodb://mymongodb,
    cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
    appId: process.env.APP_ID || 'myappid',
    masterKey: process.env.MASTER_KEY || 'mymasterkey',
    restAPIKey: process.env.REST_API_KEY || 'myrestapikey',
    serverURL: process.env.SERVER_URL || 'https://my.server.com/parse',
    liveQuery: {
        classNames: ["Posts", "Comments"] // List of classes to support for query subscriptions
    },
    push: {
        android: {
            senderId: 'mysenderid',
            apiKey: 'myapikey'
        },
        ios: {
            pfx: __dirname + '/certs/myp12file.p12',
            bundleId: 'my.bundle.id',
            production: true
        }
    },
    verbose: true
});

我已经验证并重新验证了 AppId、ClientKey 和服务器设置一百万次...它们与我在 index.js 文件中的解析配置中的相同,并且 iOS 和 Android 值相同(已复制和粘贴),除了 Android 在服务器 URL 末尾有一个额外的尾部斜杠“/”(如前所述在设置文档和其他 SO 问题中)。

我发现的一个类似问题是:https://github.com/ParsePlatform/parse-server/issues/635

但由于我的 AppId 匹配,所以这不可能导致发生的事情。

本网站指出,当更新 AppId 时,可能会导致 403 响应,因为解析会缓存旧的 AppId 和 ClientKey 值:

http://androidetc.com/android/tutorial_parse_server_android_heroku_mongodb/

但是,客户端密钥和 AppId 与 Parse 没有变化。另外,我现在也在用新的模拟器来获得这个。

我之前也使用 'saveInBackground' 而不是 'saveEventually',并且看到一条注释说未经授权的错误可能会被它修复。

我正在使用当前的 android sdk 进行解析:(来自我的 build.gradle)

compile 'com.parse:parse-android:1.13.1'

我也有两个模拟器能够在 运行 相同的代码时保存解析安装,但是如果我尝试用任何其他值保存会失败(我将其他值分离到一个单独的调用中我在第一次安装保存尝试后进行 - 我想看看如果我尝试使用或不使用附加值进行保存是否会有所不同......对于某些设备,它会吗?):

parseInstallation.put("email", email);
parseInstallation.put("userID", userID);
parseInstallation.put("campusID", campusID);
parseInstallation.put("GCMSenderId", "...senderid...");

(是的,我意识到我应该将这些值存储在另一个 table - 稍后待定)

... 删除了与初始 post

无关的信息

请注意,我在 index.js 中的解析配置不包含 clientKey,但我的应用正在为 clientKey 传递一个值。

这是 index.js 的更新部分,添加了 clientKey:

var api = new ParseServer({
databaseURI: databaseUri || 'mongodb://mymongodb,
cloud: process.env.CLOUD_CODE_MAIN || __dirname + '/cloud/main.js',
appId: process.env.APP_ID || 'myappid',
masterKey: process.env.MASTER_KEY || 'mymasterkey',
restAPIKey: process.env.REST_API_KEY || 'myrestapikey',
clientKey: 'myclientkey'

我在测试时犯的第二个错误是认为 iOS 正在创建新的安装记录 - 我错了,它 没有 工作.. . 我相信已经用 iOS 测试了升级流程,旧的 Parse 版本的应用程序创建了安装记录,从而使新的 parse-server 版本能够向 iOS 发送推送。 Android,但是,不会以这种方式工作 b/c 安装记录需要 SenderID,因此 Android 的 parse-server 版本在升级后无法工作(如 iOS 是)。