应用程序未运行时推送通知 - launchOptions 字典为空
Posted
技术标签:
【中文标题】应用程序未运行时推送通知 - launchOptions 字典为空【英文标题】:Push notification while app is not running - launchOptions dictionary is empty 【发布时间】:2012-08-29 21:10:18 【问题描述】:我在这里阅读了一些关于在应用程序未运行时接收推送通知的问题(比在后台更多,这意味着它已完全关闭)。 This question in particular 最有助于确定如何使用 launchOptions 字典确定一个人是否正在接收。
但是,我很困惑,我完全承认这可能是我的一个重大疏忽:当我的设备在应用程序关闭时收到此应用程序的推送通知,然后我打开我的应用程序时, launchOptions 字典是一个空指针。从前面提到的链接中接受的答案的描述以及其他地方,我推测我应该能够看到通知有效负载;但是什么都没有。我正在为 ios 5.1.1 开发。
我唯一的另一个想法是在启动时检查徽章的数量(大于零,做某事......),但这似乎很不可靠。
谁能告诉我我错过了什么?提前感谢您的帮助!
【问题讨论】:
payload里面有什么? @MSK 对不起,我不太明白 - 您是在问原始推送(来自我的服务器)作为其有效负载包含什么?如果是这样,则有效负载是基本的,除了通常的徽章、警报和声音之外,它不包含任何自定义内容。 【参考方案1】:application:didFinishLaunchingWithOptions:
只会在应用程序启动时因通知而被调用,并带有有效负载信息。例如。如果用户点击通知警报(添加到通知中心)或在有效负载中收到带有content-avialble = 1
的通知(报亭通知)并且您的应用既不在前台也不在后台,则可能会发生这种情况。
如果您的应用在后台运行时收到通知。如果是报亭通知,或者如果用户点击警报的操作按钮,则调用下面的方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
[[UIApplication sharedApplication] applicationState]
不等于 UIApplicationStateActive
。
在上述情况下,如果用户没有点击通知警报的操作按钮并通过点击它启动应用程序,则不会调用didFinishLaunchingWithOptions
或didReceiveRemoteNotification
。
如果您的应用在前台收到通知,didReceiveRemoteNotification
被称为 [[UIApplication sharedApplication] applicationState]
将等于 UIApplicationStateActive
。
对于notification
中的徽章,如果您的应用未运行,则不会执行任何代码,并且徽章在应用图标中增加 1。当您启动应用程序时(点击应用程序图标)didFinishLaunchingWithOptions
被正常调用。 (如果收到通知时应用在后台或前台,同上)
所以我认为这涵盖了所有可能的情况。另请注意,背景大小写对iOS SDK >= 4.0
有效
【讨论】:
啊哈,谢谢你的回答。我的主要目标是在收到推送时从服务器获取一些数据;我们在后台和前台都有这个工作,我希望我能在加载时检测到应用程序离线时是否收到推送;根据您的回答,除非用户触摸通知栏,否则这是不可能的。在您看来,在加载时检查徽章计数是否可靠? 你必须在你的服务器中保持徽章数量见this SO question 啊,不错,我已经知道那个了。不过,这并不是我要问的:我知道我可以在应用程序中使用 [application applicationIconBadgeNumber] 检查徽章计数。我想知道检查徽章计数是否大于零([application applicationIconBadgeNumber] > 0
)是否可靠。我有什么理由不这样做吗?
是的,你可以检查一下。如果相关或有任何帮助,请参阅this。以上是关于应用程序未运行时推送通知 - launchOptions 字典为空的主要内容,如果未能解决你的问题,请参考以下文章