在 AppDelegate.m
文件中
- (void)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
// iOS8系统以上
if ([UIDevice currentDevice].systemVersion.doubleValue >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
}
// iOS8系统以下
else {
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
}
}
// iOS8+需要使用这个方法
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
// 检查当前用户是否允许通知,如果允许就调用 registerForRemoteNotifications
if (notificationSettings.types != UIUserNotificationTypeNone) {
[application registerForRemoteNotifications];
}
}
// 注册远程通知成功后,会调用这个方法,把 deviceToken 返回给我们
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
NSLog(@"deviceToken=%@", deviceToken);
}
// 注册远程通知失败后,会调用这个方法
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"注册远程通知失败----%@", error.localizedDescription);
}
// 当接收到远程通知
// 前台(会调用)
// 从后台进入到前台(会调用)
// 完全退出再进入APP 不会执行这个方法
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
NSLog(@"收到远程通知----%@", userInfo);
}
// 当接收到远程通知(实现了这个方法,则上面的方法不再执行)
// 前台(会调用)
// 从后台进入到前台(会调用)
// 完全退出再进入APP (也会调用这个方法)
//
// 如果要实现:只要接收到通知,不管当前应用在前台、后台、还是锁屏,都执行这个方法
// > 必须勾选后台模式 Remote Notification
// > 告诉系统是否有新的内容更新(执行完成代码块)
// > 设置发送通知的格式 {"content-available" : "随便传"} (在 aps 键里面设置)
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
NSLog(@"收到远程通知2----%@", userInfo);
// 调用系统回调代码块的作用
// > 系统会估量app消耗的电量,并根据传递的 `UIBackgroundFetchResult` 参数记录新数据是否可用
// > 调用完成的处理代码时,应用的界面缩略图会更新
completionHandler(UIBackgroundFetchResultNewData);
}