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

Push notification not sending from my device only - Parse

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

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

这是另一位名为 "Alissa" 的用户发给我的私信,我收到了推送通知(如 "pushes sent" = 1 所见):

以下是上述推送的详细信息:

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

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

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

当我在我的应用程序中查看来自用户的所有推送列表时,就是这种模式。他们都有 "pushes sent" = 0 除了当推送发送到我的设备时 "pushes sent = 1".

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

另请注意,过去并不总是这样。几周前一切正常。我发布了多个新版本,从来没有遇到过问题。

谁能在这里指导我正确的方向?

Edit: Below I've included more details including code in my app and details of my developer account and Parse backend.

我的应用程序中的相关代码

以下是我的 AppDelegate 中的代码,按照 Parse 的建议包含在设置推送通知中。值得注意的是 println 语句 "did register user notification settings" 和 "did register for remote notifications with device token" 都在应用程序启动时正确记录。

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 语句 "success" 被正确记录也毫无价值。

    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 table 的屏幕截图。只要有人登录 in/opens 应用程序,就会创建一个安装。我只是 运行 我设备上的应用程序,我在 table 中的记录是最上面的。与其余部分不同的是 "deviceToken" 列中有一个值仅适用于我的设备。当我删除我的 PFInstallation 记录并重新启动应用程序以重新创建它时,总有一个在 "deviceToken".

下创建的值

相关详情来自Xcode

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

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

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

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

这里的关键因素是只有您的设备会使用这个不同的证书。如果安装了 revoked/broken/not,只有您的设备会出现此问题。

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

更新:

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

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

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