【发布时间】: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()可能是罪魁祸首。
标签: ios swift parse-platform push-notification apple-push-notifications