在一个有足够咖啡因杀死小犀牛的所有黑客之后,我得到解析推送通知工作只是意识到它没有按预期行事。
发送和接收通知但是在didReceiveRemoteNotification中并不总是充当编码。在发送的5个测试通知中,2个完美运行。其余时间通知仍然出现在通知中心但不与didReceiveRemoteNotification交互。
由于它确实工作了几次,我不确定要发布什么代码,因为我假设appDelegate中的代码很好。由于通知警报始终存在,因此还必须正确设置证书/ plist /临时配置文件。
所以我想我想知道是否存在任何可能导致通知以不同方式工作的问题。
if application.applicationState != UIApplicationState.Background {
// Track an app open here if we launch with a push, unless
// "content_available" was used to trigger a background push (introduced in iOS 7).
// In that case, we skip tracking here to avoid double counting the app-open.
let preBackgroundPush = !application.respondsToSelector("backgroundRefreshStatus")
let oldPushHandlerOnly = !self.respondsToSelector("application:didReceiveRemoteNotification:fetchCompletionHandler:")
var pushPayload = false
if let options = launchOptions {
pushPayload = options[UIApplicationLaunchOptionsRemoteNotificationKey] != nil
}
if (preBackgroundPush || oldPushHandlerOnly || pushPayload) {
PFAnalytics.trackAppOpenedWithLaunchOptions(launchOptions)
}
}
答案 0 :(得分:0)
问题从这里开始:
let oldPushHandlerOnly = !self.respondsToSelector("application:didReceiveRemoteNotification:fetchCompletionHandler:")
推送通知由两种不同的方法处理,具体取决于您的应用当前是在后台还是前台。这意味着您需要以两种不同的方式使用您的代码。试图检测一种方法是否可用无济于事。
相反,您需要在两个位置推送推送处理程序代码。正如Ray Wenderlich在excellent introduction to push中指出的那样:
应用程序:didFinishLaunchingWithOptions:如果您的应用在通知进入时未运行,则会启动该通知并将通知作为launchOptions字典的一部分传递。
应用程序:didReceiveRemoteNotification:如果您的应用在收到通知时处于活动状态,则会调用此方法。在iOS 4.0或更高版本中,如果您的应用在后台被暂停,则会被唤醒并使用此方法也被称为。您可以使用UIApplication的applicationState属性来确定您的应用是否被暂停。
确保你在两个地方处理推送。