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

标签 android heroku parse-platform

问题已解决

请注意,我在 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/

相关文章:

android - 从谷歌应用引擎数据存储获取数据到 Android 应用程序

ios - 在 Swift 中更新 Parse currentUser() 的缓存副本

swift - tableView重新加载数据+解析

android - 如何修复索引 1 处的绑定(bind)值在 android 中为 null

android - 我如何在 Material Design 的工具栏上添加共享图标以执行共享操作

android - 如何在 Intellij IDEA 中运行 Proguard

ruby - 来自 heroku 的 git diff

database - 使用 pgAdmin III 客户端连接到 Heroku DB 时出现问题

ruby-on-rails - 在 S3 上存储系统生成的 PDF

ios - 如何在 PFQueryTableViewController 中调用 queryForTable 从 Parse 云重新加载数据?