解决办法:我的建议是不做任何修改。
经过我的测试,打包之后,生成的ipa包内,是没有这个.entitlements 文件的。经过测试,我发现是可以正常收到推送信息的。测试的方法如下,大家也可以测试一下。测试方法:打包之后安装ipa文件,然后利用极光推送,选择生产环境,推送,即可。
经过上面的操作,你就会惊奇的发现,推送已经适配完毕了,iOS10的系统,已经可以正常接收通知了。二、中级篇
这里我会给大家讲一讲iOS10的推送,如何注册,通过什么代理,哪些方法可以用,哪些方法不可以用。1.系统自带方法
大家不管是使用三方平台的推送,还是系统自带的推送,都先应该了解下系统自带方法,如何实现远程通知的实现。第一步:导入#import <UserNotifications/UserNotifications.h>
且要遵守<UNUserNotificationCenterDelegate>的协议,在Appdelegate.m中。
这里需要注意,我们最好写成这种形式
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
#import <UserNotifications/UserNotifications.h>
#endif
第二步:我们需要在以下方法中注册通知,
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
代码如下:
1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 2 3 if ([[UIDevice currentDevice].systemVersion floatValue] >= 10.0) { 4 //iOS10特有 5 UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; 6 // 必须写代理,不然无法监听通知的接收与点击 7 center.delegate = self; 8 [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) { 9 if (granted) { 10 // 点击允许 11 NSLog(@"注册成功"); 12 [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) { 13 NSLog(@"%@", settings); 14 }]; 15 } else { 16 // 点击不允许 17 NSLog(@"注册失败"); 18 } 19 }]; 20 }else if ([[UIDevice currentDevice].systemVersion floatValue] >8.0){ 21 //iOS8 - iOS10 22 [application registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeAlert | UIUserNotificationTypeSound | UIUserNotificationTypeBadge categories:nil]]; 23 24 }else if ([[UIDevice currentDevice].systemVersion floatValue] < 8.0) { 25 //iOS8系统以下 26 [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; 27 } 28 // 注册获得device Token 29 [[UIApplication sharedApplication] registerForRemoteNotifications];
其中,获得Device Token的方法是没有改变的。
1 // 获得Device Token 2 - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 3 { 4 NSLog(@"%@", [NSString stringWithFormat:@"Device Token: %@", deviceToken]); 5 }
6
7 // 获得Device Token失败 8 - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 9 { 10 NSLog(@"did Fail To Register For Remote Notifications With Error: %@", error); 11 }
此次iOS10系统的更新,苹果给了我们2个代理方法来处理通知的接收和点击事件,这两个方法在<UNUserNotificationCenterDelegate>的协议中,大家可以查看下。此外,苹果把本地通知跟远程通知合二为一。区分本地通知跟远程通知的类是UNPushNotificationTrigger.h类中,UNPushNotificationTrigger的类型是新增加的,通过它,我们可以得到一些通知的触发条件,在使用时,我们不应该直接使用这个类,应当使用它的子类。
简单点说
1、UNPushNotificationTrigger (远程通知) 远程推送的通知类型
2、UNTimeIntervalNotificationTrigger (本地通知) 一定时间之后,重复或者不重复推送通知。我们可以设置timeInterval(时间间隔)和repeats(是否重复)。
3、UNCalendarNotificationTrigger(本地通知) 一定日期之后,重复或者不重复推送通知 例如,你每天8点推送一个通知,只要dateComponents为8,如果你想每天8点都推送这个通知,只要repeats为YES就可以了。
4、UNLocationNotificationTrigger (本地通知)地理位置的一种通知,
当用户进入或离开一个地理区域来通知。在CLRegion标识符必须是唯一的。因为如果相同的标识符来标识不同区域的UNNotificationRequests,会导致不确定的行为。
接收通知的代码如下:1 // iOS 10收到通知 2 - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler{ 3 NSDictionary * userInfo = notification.request.content.userInfo; 4 UNNotificationRequest *request = notification.request; // 收到推送的请求 5 UNNotificationContent *content = request.content; // 收到推送的消息内容 6 NSNumber *badge = content.badge; // 推送消息的角标 7 NSString *body = content.body; // 推送消息体 8 UNNotificationSound *sound = content.sound; // 推送消息的声音 9 NSString *subtitle = content.subtitle; // 推送消息的副标题 10 NSString *title = content.title; // 推送消息的标题 11 12 if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { 13 NSLog(@"iOS10 前台收到远程通知:%@", [self logDic:userInfo]); 14 15 } 16 else { 17 // 判断为本地通知 18 NSLog(@"iOS10 前台收到本地通知:{\\nbody:%@,\\ntitle:%@,\\nsubtitle:%@,\\nbadge:%@,\\nsound:%@,\\nuserInfo:%@\\n}",body,title,subtitle,badge,sound,userInfo); 19 } 20 completionHandler(UNNotificationPresentationOptionBadge|UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以设置 21 }
1 - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)())completionHandler{ 2 3 NSDictionary * userInfo = response.notification.request.content.userInfo; 4 UNNotificationRequest *request = response.notification.request; // 收到推送的请求 5 UNNotificationContent *content = request.content; // 收到推送的消息内容 6 NSNumber *badge = content.badge; // 推送消息的角标 7 NSString *body = content.body; // 推送消息体 8 UNNotificationSound *sound = content.sound; // 推送消息的声音 9 NSString *subtitle = content.subtitle; // 推送消息的副标题 10 NSString *title = content.title; // 推送消息的标题 11 if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) { 12 NSLog(@"iOS10 收到远程通知:%@", [self logDic:userInfo]); 13 14 } 15 else { 16 // 判断为本地通知 17 NSLog(@"iOS10 收到本地通知:{\\nbody:%@,\\ntitle:%@,\\nsubtitle:%@,\\nbadge:%@,\\nsound:%@,\\nuserInfo:%@\\n}",body,title,subtitle,badge,sound,userInfo); 18 } 19 20 // Warning: UNUserNotificationCenter delegate received call to -userNotificationCenter:didReceiveNotificationResponse:withCompletionHandler: but the completion handler was never called. 21 completionHandler(); // 系统要求执行这个方法 22 23 }
completionHandler()
这个方法,可能会报一下的错误,希望大家注意下~Warning: UNUserNotificationCenter delegate received call to -userNotificationCenter:didReceiveNotificationResponse:withComp
letionHandler: but the completion handler was never called.
最后最后,我们要大家补充一下,旧版本的一些方法,方便大家扩充iOS10的通知的通知,不影响原有逻辑。1 - (void)application:(UIApplication *)application 2 didReceiveRemoteNotification:(NSDictionary *)userInfo { 3 NSLog(@"iOS6及以下系统,收到通知:%@", [self logDic:userInfo]); 4 } 5 6 - (void)application:(UIApplication *)application 7 didReceiveRemoteNotification:(NSDictionary *)userInfo 8 fetchCompletionHandler: 9 (void (^)(UIBackgroundFetchResult))completionHandler { 10 11 NSLog(@"iOS7及以上系统,收到通知:%@", [self logDic:userInfo]); 12 completionHandler(UIBackgroundFetchResultNewData); 13 } 14 15