我每小时都会为我的ipad发送静音推送通知。但几个小时后委托方法没有命中(我已在委托方法中放置了一个本地通知)。我正在使用它 application:handleActionWithIdentifier:forLocalNotification:completionHandler:委托方法来处理静默推送通知。当我在设置下重置ipad并尝试发送推送通知时,委托方法将按照我的预期命中并运行。我不明白这种行为。我还将声音发送到我的通知中,当通知到达device时播放。但是我的应用程序内的委托没有打。我委托代码如下。
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
//some database operations
completionHandler(UIBackgroundFetchResultNewData);
}
答案 0 :(得分:2)
1.APNS is based on Apple Servers, and Apple doesn't give any guarantee on successful message delivery.
2.If the app is open (i.e. the user is using the app) while the notification arrives, iOS doesnt show a notification message, you need to handle it.
3.Notification shows up only when the app is backgrounded or killed.
4.Also implement feedback service on your server side; will help you get rid of old unwanted tokens(users who deleted the app or disabled notifications thru settings).
5..Dont send too many notifications to a device within a short span of time, coz APNS caches only 1 message/device (if the device is offline). So it can deliver the message when the device comes online. Am not sure how long the message is cached though.
收到了一些通知,但并非全部
如果您在短时间内向同一设备或计算机发送多个通知,推送服务将仅发送最后一个通知。
这就是原因。设备或计算机确认收到每个通知。在推送服务收到该确认之前,它只能假设设备或计算机由于某种原因脱机并将通知存储在服务质量(QoS)队列中以供将来重新发送。这里的往返网络延迟当然是一个主要因素。
如“本地和推送通知编程指南”中所述,QoS队列为每个设备或计算机的每个应用程序保留一个通知。如果服务在发送队列中的通知之前收到另一个通知,则新通知将覆盖前一个通知。
所有这些都指出,意图是通知向应用程序指示提供商感兴趣的内容已经发生变化,应用程序应该向提供商签入以获取详细信息。通知不应包含其他地方也无法提供的数据,也不应包含任何状态。
由于您的设备未连接到该服务,因此未立即发送的任何推送通知都会排队等待将来重新发送。 "紧接"当然需要考虑您的连接延迟。由于APN将在那时超时,外围病例将超过60秒。