美文网首页iOS随笔iCoderiOS学习
Xcode8 和iOS10 做APNS适配的一些坑

Xcode8 和iOS10 做APNS适配的一些坑

作者: cc412 | 来源:发表于2016-09-22 22:48 被阅读10513次

    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正在运行时候也可以在上方弹出推送框

    相关文章

      网友评论

      • 4VZhang:文章真心帮了忙,ios10推送好生奇特
        cc412:感谢支持:smile:
      • 半城烟沙1:APP正在使用的时候,当接到推送的时候有框的处理办法,我用的是(用的极光推送):- (void)jpushNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(NSInteger))completionHandler 方法中处理推送的结果,并把这个回调方法写成这样:completionHandler(0) ,推送框就没有了
      • sinno:你好!你应该是用的iOS10.0 测试版测试的吧?在这个版本,点击推送消息,响应的方法是【didReceiveRemoteNotification:】而不是【didReceiveRemoteNotification: completionHandler】,这是那个测试版的bug,现在已经改好了。
        自iOS10.0.2后,点击推送消息还是会调用didReceiveRemoteNotification: completionHandler】方法的。
        【以上结果都是在XCode7上打的包】
        参考网址:http://stackoverflow.com/questions/38940193/handling-user-notifications-on-ios-10
      • 随心吧:实用
      • 2c77040de5c4:今天突然发现线上版本收不到推送,急疯了...
        而且是iOS8、9、10都收不到,改的就是极光的2.1.9新版本
        2c77040de5c4:@CS二哥 后台的锅,线上线下需要改个参数
        CS二哥:@安菲尔德的门柱君 我的也是,后台发送收不到,在极光平台上发送就可以收到,你解决了吗?不知道是不是证书问题,但是平台发送能收到啊
        cc412:@安菲尔德的门柱君 建议你先用Adhoc证书先测试一下,然后用testflight发一个正式版本,绑定一个独有的tag测试,看看是不是因为证书问题。

      本文标题:Xcode8 和iOS10 做APNS适配的一些坑

      本文链接:https://www.haomeiwen.com/subject/vizzettx.html