licc

心有猛虎 细嗅蔷薇

0%

Xcode8 和iOS10 做APNS适配的一些坑

iOS10已经发了,最近发现App在iOS10上有一些问题,主要是iOS10的字体变了,一些Label要做适配。还有一些相机权限之类的。更加详细的可以参考这篇文章
https://github.com/ChenYilong/iOS10AdaptationTips

之前一直纠结要不要升级Xcode8,毕竟好多插件都不能用了,还有用Xcode7打包的App在iOS10上运行能不能收到推送,经过一天的测试。结果如下:
以下结果是我用极光推送测试的结果(JPush)

Xcode7打包的App能不能再iOS10上收到推送?

答案:可以的,能够收到推送。但是点击推送或者从推送启动App之前的方法不再响应。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
//iOS7以后收到推送 推送结果会在这里响应
//iOS10 以后不再响应这里
}

也就是只能收到,但是点击推送以后只会打开App而不会走didReceiveRemoteNotification,所以页面不跳转。
(我是用AD_Hoc证书发了一个测试版。用iOS10的机子装上以后使用推送生产环境推送测试的。AppStore版本没测试)

Xcode8升级以后怎么做iOS10适配

我是根据最新的Jpush官方文档做的适配
https://docs.jiguang.cn/jpush/client/iOS/ios_guide_new/

需要注意的几点:

1.Xcode8的疯狂输出模式

刚用Xcoed8时候吓着了,疯狂输出一大堆log信息。建议关闭掉。
关闭办法


进入地方在你选择模拟器的左边有一个你的App图标和名字,点击一下选择Edit Scheme。 然后选择Run->Environment Variables->+号

OS_ACTIVITY_MODE =disable

然后打钩,完事

但是Xcode8的NSLog不打印了 = =!我这边是这个情况

2.Push Notification开关

刚在Xcode8上运行时候肯定会报错。需要在Tragets->Capabilites打开Push Notification开关。


点击修复后会自动生成一个xxx.entitlements的文件(xxx是你的工程名字)


你会发现里面会有APS Environment 并且为development
那你需要上线时候改成发布吗?
并不用可以忽略它,它对你发布并无影响。只要你发布时候选择的是发布证书依旧是发布环境。

但是,如果你用Xcode8生成以后再用Xcode7打开,如果不删除这个文件,打包时候就会报错,所以如果你想用Xcode8做完适配以后还想用Xcode7发包的话请删除掉这个文件。(然后删除掉会报错)把下图选中哪行后面的路径删掉就好了

更新:昨天试了下,删除这个文件再用Xcode7打包以后安装到iOS10可以收到推送但是还是不响应推送处理的方法。
暂时解决办法是使用Xcode7开发最后发版使用Xcode8
Xcode7打包报错应该有解决办法,暂时留个坑

代码适配
因为用的第三方,所以按着文档来就好了,但是也有一些小坑

#ifdef NSFoundationVersionNumber_iOS_9_x_Max
//在这里写针对iOS10的代码或者引用新的API
#import <UserNotifications/UserNotifications.h>

#endif
#ifdef NSFoundationVersionNumber_iOS_9_x_Max
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler {
    // Required
    NSDictionary * userInfo = notification.request.content.userInfo;
    if([notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService handleRemoteNotification:userInfo];
        [JPUSHService resetBadge];
        ///在前台时候收到推送 iOS10App运行在前台推送来了也能显示哦
    }
    completionHandler(UNNotificationPresentationOptionAlert); // 需要执行这个方法,选择是否提醒用户,有Badge、Sound、Alert三种类型可以选择设置
}

// iOS 10 Support
- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)())completionHandler {
    // Required
    NSDictionary * userInfo = response.notification.request.content.userInfo;
    if([response.notification.request.trigger isKindOfClass:[UNPushNotificationTrigger class]]) {
        [JPUSHService resetBadge];
///这个是我自己处理推送的方法 忽略掉
        [self didRegisterFormApnsWithInfo:userInfo];
  [JPUSHService handleRemoteNotification:userInfo];
    }
    completionHandler();  // 系统要求执行这个方法
}
#endif

有趣的是iOS10当App正在运行时候也可以在上方弹出推送框