提到的所有方法都是在UIApplicationDelegate中,默认实现这个代理的类是AppDelegate
获取token
在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
中调用对应的方法向苹果服务器获取本机的deviceToken,不同版本有不同的方法.
获取成功后,苹果异步返回deviceToken,回调- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
返回给程序.
发送获取deviceToken请求
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
if ([UIDevice currentDevice].systemVersion.doubleValue <= 8.0) {
// iOS8以下,不包括ios8
UIRemoteNotificationType type = UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert;
// 当用户第一次启动程序时就获取deviceToke
// 该方法在iOS8以及过期了
// 只要调用该方法, 系统就会自动发送UDID和当前程序的Bunle ID到苹果的APNs服务器
[application registerForRemoteNotificationTypes:type];
}else
{
// iOS8及其以上,包括IOS8
UIUserNotificationType type = UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIUserNotificationTypeSound;
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:type categories:nil];
// 注册通知类型
[application registerUserNotificationSettings:settings];
// 申请试用通知
[application registerForRemoteNotifications];
}
return YES;
}
接收返回的deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
NSLog(@"token:%@", deviceToken);
}
获取推送的内容
获取推送的内容有三种情况:
- 程序在前台时,ios回调方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
返回provider(服务器推送消息的程序)推送到app的json数据. - 程序在后台时,provider推送到app的数据会弹出来,当用户点击后,在代理方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
的launchOptions
参数里面.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1.取出数据
NSDictionary *userInfo = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey];
}
- 程序在后台时,推送的消息中包含
{"aps":{"content-available":1}}
,表示开启slient.这时app需要在info.plist
中配置 此时,推送的消息不必用户点击,app中的- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
会直接被调用,不过该方法需]在IOS7及其以后才被支持. 需要注意的是,苹果官方说的是调用此方法提供少量时间供app在后台进行下载操作,而且执行完以后要调用一个方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{
NSLog(@"didReceive_complete:%@",userInfo);
completionHandler(UIBackgroundFetchResultNewData);//做完事情后回调方法
}
详情请仔细阅读apple apns文档