远程推送(个推)
大家所说的推送一般都是指远程推送。远程推送是指我们需要通过苹果的服务器向我们的应用程序发送消息,即使用户将应用程序关闭用户也会收到消息横幅。极光推送大家估计是大家都在使用的,今天我们主要来看一下个推推送。他们的流程其实是一样的,在此之前,还是先说一下整个远程推送的流程吧。
1)首先作为应用程序,我们先要获取用户的授权,如果用户不允许,那么我们是无法进行推送的。在iOS8.0推出之后,苹果的授权做了一些调整,废话不多说,请看代码。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) { UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil]; [[UIApplication sharedApplication] registerForRemoteNotifications]; [[UIApplication sharedApplication] registerUserNotificationSettings:uns]; } else { UIRemoteNotificationType apn_type = (UIRemoteNotificationType)(UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeBadge); [[UIApplication sharedApplication] registerForRemoteNotificationTypes:apn_type]; }
2)如果授权允许的话,那么我们会在AppDelegate的didRegisterForRemoteNotificationsWithDeviceToken代理方法中取得deceiveToken(但是要注意一点,即使取得授权,再网络状况不好的情况下也有可能拿不到deceiveToken)。deceiveToken是什么鬼?它是UDID和APPID 加密后的结果。苹果非常注重用户隐私,它认为UDID是用户的隐私,我们不能随意获取。但是再这里我们又必须要使用UDID,所以苹果就把UDID和APPID 加密后提供给我们。取得deceiveToken后,我们要将deceiveToken发送给个推服务器,以后由个推帮助我们完成和苹果服务器的交互。
[_gexinPusher registerDeviceToken:_deviceToken];
3)在我们向用户发送推送消息的时候,用户的应用程序可能会有两种状态。1、它被杀死了 2、它还活着。如果应用程序还活着,仅仅是被放在了后台那么收到消息后它触发的是这个方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userinfo
但是如果应用程序被杀死了,用户点击横幅进入的应用,那么它触发的是
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
所以我们需要在didFinishLaunchingWithOptions 方法中进行判断。
NSDictionary* message = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (message) { NSString *payloadMsg = [message objectForKey:@"payload"]; NSString *record = [NSString stringWithFormat:@"[APN]%@, %@", [NSDate date], payloadMsg]; [_viewController logMsg:record]; }
如果message 不为空,则说明是收到推送消息后,横幅启动,否则是点击图标进行启动的。
关于个推,它的demo 里写的比较清楚也比较简单,大家有兴趣的话可以看一下。如果demo看不懂的话可以留言交流一下,这里就不再赘述了。