问题已解决
请注意,我在 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 版本应用程序创建了安装记录,从而使新的解析服务器版本能够向 iOS 发送推送。然而,Android 不会以这种方式工作,因为安装记录需要 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/
但是,客户端 key 和 AppId 与 Parse 没有变化。另外,我现在也通过新的模拟器获得了这个。
我之前也使用过“saveInBackground”而不是“saveEventually”,并且看到一条说明说未经授权的错误可能会被它修复。
我正在使用当前的 android sdk 进行解析:(来 self 的 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...");
(是的,我意识到我应该将这些值存储在另一个表中 - 待定)
... 从最初的帖子中删除了不相关的信息
最佳答案
请注意,我在 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 版本的应用程序创建了安装记录,从而使新的解析服务器版本能够向 iOS 发送推送。然而,Android 不会以这种方式工作,因为安装记录需要 SenderID,因此 Android 的解析服务器版本在升级后无法工作(就像 iOS 一样)。
关于android - 在 Android 设备上保存解析安装记录时获得授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41928377/