解析推送通知错误

Posted

技术标签:

【中文标题】解析推送通知错误【英文标题】:Push notification Error with Parse 【发布时间】:2015-02-12 10:35:12 【问题描述】:

情况

我已经在 ANDROID 中使用 Parse 实现了推送通知。一切都很好(我可以接收推送/发送等),唯一的事情是当我安装我的应用程序时会发生这种情况:

如果这是设备上的第一次安装:没问题 如果不是第一次安装(这意味着设备已经进行了 PARSE/GCM 注册),则会生成以下错误:

产生错误

02-12 11:12:28.054  15564-15579/com.hoxell.hoxellbrowser E/ParseCommandCache﹕ Failed to run command.
com.parse.ParseException: at least one ID field (installationId,deviceToken) must be specified in this operation
        at com.parse.ParseCommand.onPostExecute(ParseCommand.java:404)
        at com.parse.ParseRequest$5.then(ParseRequest.java:342)
        at com.parse.ParseRequest$5.then(ParseRequest.java:339)
        at bolts.Task$10.run(Task.java:486)
        at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97)
        at bolts.Task.completeAfterTask(Task.java:482)
        at bolts.Task.continueWithTask(Task.java:358)
        at bolts.Task.continueWithTask(Task.java:369)
        at bolts.Task$8.then(Task.java:415)
        at bolts.Task$8.then(Task.java:407)
        at bolts.Task$10.run(Task.java:486)
        at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97)
        at bolts.Task.completeAfterTask(Task.java:482)
        at bolts.Task.access$200(Task.java:27)
        at bolts.Task$6.then(Task.java:351)
        at bolts.Task$6.then(Task.java:348)
        at bolts.Task.runContinuations(Task.java:515)
        at bolts.Task.access$600(Task.java:27)
        at bolts.Task$TaskCompletionSource.trySetResult(Task.java:570)
        at bolts.Task$TaskCompletionSource.setResult(Task.java:604)
        at bolts.Task$10$1.then(Task.java:498)
        at bolts.Task$10$1.then(Task.java:490)
        at bolts.Task$9.run(Task.java:453)
        at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97)
        at bolts.Task.completeImmediately(Task.java:449)
        at bolts.Task.access$100(Task.java:27)
        at bolts.Task$5.then(Task.java:316)
        at bolts.Task$5.then(Task.java:313)
        at bolts.Task.runContinuations(Task.java:515)
        at bolts.Task.access$600(Task.java:27)
        at bolts.Task$TaskCompletionSource.trySetResult(Task.java:570)
        at bolts.Task$TaskCompletionSource.setResult(Task.java:604)
        at bolts.Task$10$1.then(Task.java:498)
        at bolts.Task$10$1.then(Task.java:490)
        at bolts.Task$9.run(Task.java:453)
        at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97)
        at bolts.Task.completeImmediately(Task.java:449)
        at bolts.Task.access$100(Task.java:27)
        at bolts.Task$5.then(Task.java:316)
        at bolts.Task$5.then(Task.java:313)
        at bolts.Task.runContinuations(Task.java:515)
        at bolts.Task.access$600(Task.java:27)
        at bolts.Task$TaskCompletionSource.trySetResult(Task.java:570)
        at bolts.Task$TaskCompletionSource.setResult(Task.java:604)
        at bolts.Task$10$1.then(Task.java:498)
        at bolts.Task$10$1.then(Task.java:490)
        at bolts.Task$9.run(Task.java:453)
        at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97)
        at bolts.Task.completeImmediately(Task.java:449)
        at bolts.Task.continueWith(Task.java:323)
        at bolts.Task.continueWith(Task.java:334)
        at bolts.Task$10.run(Task.java:490)
        at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97)
        at bolts.Task.completeAfterTask(Task.java:482)
        at bolts.Task.access$200(Task.java:27)
        at bolts.Task$6.then(Task.java:351)
        at bolts.Task$6.then(Task.java:348)
        at bolts.Task.runContinuations(Task.java:515)
        at bolts.Task.access$600(Task.java:27)
        at bolts.Task$TaskCompletionSource.trySetResult(Task.java:570)
        at bolts.Task$TaskCompletionSource.setResult(Task.java:604)
        at bolts.Task$10$1.then(Task.java:498)
        at bolts.Task$10$1.then(Task.java:490)
        at bolts.Task$9.run(Task.java:453)
        at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:97)
        at bolts.Task.completeImmediately(Task.java:449)
        at bolts.Task.continueWith(Task.java:323)
        at bolts.Task.continueWith(Task.java:334)
        at bolts.Task$10.run(Task.java:490)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:864)

是的,它会生成它,但应用程序不会崩溃!并且该应用仍然有效:也可以推送通知,但您可以理解这不是 100% 可靠的。

E/ParseCommandCache﹕ Failed to run command.
com.parse.ParseException: at least one ID field (installationId,deviceToken) must be specified in this operation

他想要什么..?我该怎么办?问题的原因是什么?这是我的代码:

Application.java

 @Override
public void onCreate() 
    super.onCreate();

    // Initialize the Parse SDK.
    Parse.initialize(this, "x", "x");

    // Specify an Activity to handle all pushes by default.
    PushService.setDefaultPushCallback(this, MainActivity.class);

    ParseInstallation.getCurrentInstallation().saveInBackground();


在我的 mainActivity 中,我只是将 deviceToken(在我的情况下是 installationId)连接到我的 userAgent 中:这也很好!即使产生错误,installationID 也会插入到 userAgent 中。

MainActivity.java

 deviceToken = ParseInstallation.getCurrentInstallation().getInstallationId();
 webSettings.setUserAgentString(userAgent + " ||" + deviceToken);

我的代码是否有任何错误?

谢谢

【问题讨论】:

我记得,使用 setDefaultPushCallback 时不需要保存安装。尝试删除安装的保存,看看是否仍然发生。 @cYrixmorten 我已经删除了它,它似乎有效。但是告诉我,saveInBackground 不是让 Parse 工作的基础吗? 问题是 setDefaultPushCallback 会自动为你保存安装。不记得我在哪里找到它,但在某个论坛上它被告知是这种行为。我猜在第二次保存之后(第一次尚未完成)会使安装处于错误状态,导致非致命错误消息。 【参考方案1】:

尝试以下操作:

 ParseInstallation.getCurrentInstallation().saveInBackground(new SaveCallback()
    
        @Override
        public void done(ParseException e)
        
            PushService.setDefaultPushCallback(Application.this, MainActivit.class);
        
    );

【讨论】:

【参考方案2】:

我记得,使用 setDefaultPushCallback 时不需要保存安装。尝试删除安装的保存,看看是否仍然存在。

setDefaultPushCallback 会自动为你保存安装。不记得我在哪里找到它,但在某个论坛上它被告知是这种行为。我猜在第二次保存之后(第一次尚未完成)会使安装处于错误状态,导致非致命错误消息。

【讨论】:

以上是关于解析推送通知错误的主要内容,如果未能解决你的问题,请参考以下文章

Google Drive API 推送通知订阅 400“解析错误”

解析 SDK 以获取推送通知、编译错误

为 Android 设置解析推送通知

使用 swift 3 更改解析推送通知

来自内容提供商的内容解析器推送通知

当我尝试登录注册用户并通过解析启用推送通知时,我的应用程序崩溃