解析推送通知错误
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 会自动为你保存安装。不记得我在哪里找到它,但在某个论坛上它被告知是这种行为。我猜在第二次保存之后(第一次尚未完成)会使安装处于错误状态,导致非致命错误消息。
【讨论】:
以上是关于解析推送通知错误的主要内容,如果未能解决你的问题,请参考以下文章