最近在做推送的时候出现了强制执行推送函数的情况
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 函数是在应用已经启动,在后台或者前台情况下执行。因此问题来了,当用户在应用内使用时,收到远程推送就很可能出现被强制执行通知的事件。
最后测试发现,在执行这个函数之前,如果是从后台进入则会先执行
- (void)applicationWillEnterForeground:(UIApplication *)application,这时只需要在该函数内使用一个BOOL变量就能控制了。因为只要是从后台点通知进入的就需要执行通知的函数,但是直接点击应用进入的就不需要执行通知函数。
此外,在
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中也需要处理通知事件,如果应用是被通知触发启动,是不会进入didReceiveRemoteNotification这个函数的,这时候需要在didFinishLaunchingWithOptions中做处理
NSDictionary* userInfo = [launchOptionsvalueForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
if (userInfo) {
self.notificationDcit = userInfo;
....
...
...
}
userInfo是启动项launchOptions中取出来的远程通知字典,如果是由远程通知启动的应用这个字典是!nil的强制执行的问题就解决了。
最近做推送的时候还遇上一问题,就是在应用关闭状态,收到远程通知,这时候不点击通知而是从应用的图标启动,会出现上述字典userInfo为nil的情况。也不会执行didReceiveRemoteNotification代理方法,此种情况下,应用是无法拿到手机获得的推送消息的。这时候无法在应用中进行有效的用户提示,可有大神知道怎么解决?很纠结啊!