推送通知不会仅从我的设备发送 - 解析

时间:2015-07-21 20:33:51

标签: ios swift parse-platform push-notification apple-push-notifications

我的应用程序目前处于测试阶段,具有消息传递功能。它设置为在用户收到来自其他用户的新消息时发送推送通知。 时间推送通知工作是指用户专门向我发送消息。如果我尝试向任何其他用户或任何不包含我的用户消息发送消息,则推送通知不起作用。发送给我的消息会在我的设备上触发推送通知。

以下是Parse的一些简单截图,显示正确发送的一个推送和未发送的推送。

这是另一个名为“Alissa”的用户发送给我的私信,我在其中正确收到了推送通知(正如您所看到的“推送已发送”= 1):

working push notification

以下是推送的详细信息:

working push notification details

现在,这是从我的设备发送的私人消息,该设备是正确接收推送通知的同一设备,返回“Alissa”。如您所见,“推送已发送”= 0,表示我的设备发送了邮件,但收件人未收到推送通知:

not working push notification

以下是该推送的详细信息,其中包含与发送给我的工作信息几乎完全相同的信息:

not working push notification details

最后,这是另一个在“Alissa”和另一个不是我的用户之间发送的不工作,因此2个用户与我的设备分开。

enter image description here enter image description here

这是我查看应用中用户所有推送列表时的模式。他们都有“推送发送”= 0,除非推送发送到我的设备,“推送发送= 1”。

我已经在推送通知方法完成处理程序中打印到控制台,并且当我向另一个用户发送消息时,它们表明推送已成功发送。我还要指出我的设备正用于开发此应用程序。

另外作为旁注,它并不总是像这样。几周前一切正常。我发布了多个新版本,从未出现过问题。

有人能指导我朝这个方向前进吗?

  

编辑:下面我已经提供了更多详细信息,包括我的应用中的代码和   我的开发者帐户和Parse后端的详细信息。

我的应用中的相关代码

以下是我在AppDelegate中的代码,如Parse所推荐的,用于设置推送通知。值得注意的是,println语句“确实注册了用户通知设置”和“确实注册了带设备令牌的远程通知”都在应用启动时正确记录。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // ...
    let userNotificationTypes = UIUserNotificationType.Alert | UIUserNotificationType.Badge
    let settings = UIUserNotificationSettings(forTypes: userNotificationTypes, categories: nil)
    application.registerUserNotificationSettings(settings)
    application.registerForRemoteNotifications()
    // ...
}

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
    println("did register user notification settings")
}

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    PFInstallation.currentInstallation().setDeviceTokenFromData(deviceToken)
    PFInstallation.currentInstallation().saveInBackground()
    println("did register for remote notifications with device token")
}

func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
    println("didFailToRegisterForRemoteNotificationsWithError: ", error.localizedDescription)
}

这是我将邮件发送给其他用户时所包含的代码。 <{1}}声明“成功”被正确记录也是值得的。

println

我的开发者帐户的相关详细信息

以下是在我的开发人员门户中显示我的App ID的屏幕截图。它似乎表明正确启用了推送通知(我使用新的配置文件删除并重新添加了所有证书)

Push notifications enabled in developer portal

我的Parse帐户中的相关详细信息

以下是Parse中的推送通知设置。昨天,当我重新创建证书时,所有这些信息都已更新。

Parse push notification settings

这可能提供一定程度的洞察力,虽然我不确定是什么。这是Parse中我的PFInstallations表的屏幕截图。只要有人登录/打开应用程序,就会创建安装。我刚刚在我的设备上运行了应用程序,表中的记录是最重要的。与其他内容有所不同的是,“deviceToken”列中只有一个值用于我的设备。当我删除PFInstallation记录并重新启动应用程序以重新创建它时,总会在“deviceToken”下创建一个值。

enter image description here

Xcode的相关详情

以下是我的Xcode构建设置中代码签名的扩展视图。此代码签名在项目和目标代码签名中都是相同的。

enter image description here enter image description here

同样,推送通知适用于向其他用户发送消息的所有用户,只有当消息从我的设备发送给任何其他用户时才会起作用。

1 个答案:

答案 0 :(得分:1)

从设备的独特之处开始,它作为开发环境设备的状态可能是罪魁祸首。

检查的好地方是您的设备的构建以及随后使用的推送证书。如果您的设备处于开发模式(意味着您正在通过Xcode构建和部署到手机),那么它将使用推送证书进行开发而不是生产。 (有关此差异的更多信息,请参阅this great article by Ray Wenderlich

这里的关键因素是只有您的设备才会使用此不同的证书。如果它已被撤销/损坏/未安装,则只有您的设备会出现此问题。

您还可以通过TestFlight / HockeyApp等将应用程序部署到手机上进行测试,而不是让Xcode加载它。

<强>更新

只是倾注代码,检查错误。有一点需要注意:您的didFinishLaunchingWithOptions包含额外的PFInstallation.currentInstallation().saveInBackground() - 您应该将其删除,并且仅在didRegisterForRemoteNotificationsWithDeviceToken方法中使用它。

这就是为什么只有您的设备在其PF安装中有ID,这可能是您的设备无法联系到其他人的原因 - 推送系统正在运行,但它没有任何地址可以呼叫从那里;这将是推动时的无声失败,而不是解析系统。

您是否曾尝试让用户互相推送,或仅向您和您发送推送?