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

Posted

技术标签:

【中文标题】推送通知不仅从我的设备发送 - 解析【英文标题】:Push notification not sending from my device only - Parse 【发布时间】:2015-07-21 20:33:51 【问题描述】:

我有一个应用程序目前处于 beta 测试阶段,它具有消息传递功能。它设置为在用户收到另一个用户的新消息时发送推送通知。 只有时间推送通知工作是当用户专门向我发送消息时。如果我尝试向任何其他用户发送消息或任何不包括我在内的用户互相发送消息,推送通知将不起作用。 只有发送给我的消息会在我的设备上触发推送通知。

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

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

这里是所说推送的详细信息:

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

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

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

当我在我的应用中查看来自用户的所有推送列表时,这就是模式。他们都有“推送发送”= 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)

这是我在向其他用户发送消息时包含的代码。正确记录 println 语句“成功”也是毫无价值的。

    PFInstallation.query().whereKey("user", equalTo: incomingUser)

    PFPush().setQuery(pushQuery)
    let senderName = PFUser.currentUser()!.objectForKey("name") as! String
    let data = [
        "alert" : "New message from \(senderName)",
        "badge" : "Increment"
    ]
    push.setData(data)
    push.sendPushInBackgroundWithBlock  (success: Bool, error: NSError?) -> Void in
        if success 
            println("success")
         else 
            println(error?.localizedDescription)
        
    

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

这是一个屏幕截图,显示了我在开发者门户中的 App ID。似乎表明推送通知已正确启用(我删除并重新添加了具有新配置文件的所有证书)

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

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

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

来自 Xcode 的相关细节

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

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

【问题讨论】:

Aaron,您能否发布您的推送通知代码,既适用于 ios,也适用于您可能在 Cloud Code 中使用的任何内容?也许我们可以从那里更好地诊断。 @RyanKreager 我编辑了我的原始帖子以包含上面更明确的细节。 @RyanKreager 另外,我目前没有使用任何云代码。 我更新了我的答案 - 你在 didFinishLaunchingWithOptions 中的行 PFInstallation.currentInstallation().saveInBackground() 可能是罪魁祸首。 【参考方案1】:

从使您的设备与众不同的原因开始,它作为开发环境设备的状态可能是罪魁祸首。

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

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

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

更新:

只是倾注代码,检查错误。已经注意到的一件事:您的 didFinishLaunchingWithOptions 包含一个额外的 PFInstallation.currentInstallation().saveInBackground() - 您应该删除它并且只在 didRegisterForRemoteNotificationsWithDeviceToken 方法中使用它。

这就是为什么只有您的设备在其 PFInstallation 中有一个 ID,并且可能是您的设备无法连接到其他任何人的原因 - 推送系统正在工作,但它没有从那里调用的地址;这将是推送时的静默失败,而不是解析系统。

您是否尝试过让您的用户相互发送推送,或者只发送给您和您?

【讨论】:

这是有道理的。奇怪的是,我的开发设备上有 Testflight,我删除了 Xcode 构建并通过 Testflight 安装了应用程序,但它仍然无法正常工作。除非通过 Testflight 在开发设备上安装它没有实际意义,并且无论 Testflight 如何,它仍然会受到开发推送证书的影响。 我会尝试硬币的另一面:撤销,重新创建您的开发推送证书并将其重新上传到 Parse,看看是否有帮助。 废话,重做配置文件和所有证书后仍然无法正常工作。明天我会悬赏这个问题。 感谢瑞恩帮助我。事实证明,您在更新底部的问题让我想再次检查一下。我让用户互相发送消息,但它没有与他们合作。事实证明,我推送了一个更新,每个人都下载了带有过期证书的推送通知。由于我更新了所有内容,我向我的 beta 测试人员推出了一个新版本,现在它正在运行。以后遇到此问题的人请注意:如果 PFInstallation 列中的“deviceToken”列为空,则意味着没有设备令牌的任何人都无法使用推送通知。 Aaron,很高兴它起作用了!另外,请将您的最后评论设置为未来用户的答案!

以上是关于推送通知不仅从我的设备发送 - 解析的主要内容,如果未能解决你的问题,请参考以下文章

悄悄地从我的服务器发送推送通知到我的应用程序

没有设备令牌的 ios 推送通知/消息

解析,如何向目标用户发送推送通知

Firebase 推送通知如何发送到设备

取消挂起的推送通知

解析标记为已发送但在设备上看不到的 android 推送通知