美文网首页
iOS10升级后的一些问题

iOS10升级后的一些问题

作者: MarkMiao | 来源:发表于2016-09-14 18:37 被阅读664次

    原文请见github上iOS10升级后的一些问题

    iOS10升级

    在2016年9月14日凌晨iOS10系统准时推送过来了,作为懒人之前的beta版一直没有升级试用。今天果断手机和Xcode一起升级了,新系统新面貌带来新bug。记录一下升级iOS10和Xcode8.0后遇到的问题。

    开发者证书不能使用

    General里面Signing变成如下样子,Automatically manage signing 自动签名管理。报错了,之前一直使用的企业级开发者证书不可用了。

    imgimg

    Build Settings 里面的 Code Signing Identity 清一色选择为企业级开发者证书。还是报错

    imgimg imgimg

    解决办法:

    取消Automatically manage signing的选择,会出现两个Signing,分别对应Debug和Release,选择该项目对应使用的Provisioning Profiles即可

    imgimg

    注释快捷键command+/失效

    Xcode8.0的注释// 生成快捷键 command+/失效了

    解决办法:

    终端运行命令:sudo /usr/libexec/xpccachectl
    Password:输入开机密码
    重启Mac生效

    生效后空行快捷键,只在代码行能产生/解除注释,空行不能产生注释。记得之前可以来这....

    Xcode控制台输出问题

    无用log打印

    升级Xcode8.0之后运行项目,控制台疯狂打印了N多东西,完全看不懂啊,完犊子了,这么多需要适配的...

    眼不见心不烦,下面就提供去掉这些乱七八糟打印内容的方法。

    解决办法:

    Edit Scheme...下的Run -> Arguments -> Environment Variables 添加 OS_ACTIVITY_MODE = disable

    具体见下图

    imgimg

    真机测试log屏蔽

    经过上述修改,在iOS10模拟器中无用的log输出被屏蔽了,但是真机测试的时候,没有log输出,log日志被完全屏蔽了。不知是屏蔽无用log的设置,还是xcode8为了提高真机测试性能屏蔽了log日志?真机测试的log也很重要。

    为了app正式发布时不打印log,让打印操作NSLog只在Debug环境下运行,采用了下面的办法自定义NSLog:

    #ifdef DEBUG
    #define XDLog(...) NSLog(__VA_ARGS__)
    #else
    #define XDLog(...)
    #endif
    

    iOS10之后,在真机中NSLog无法打印log,可以使用printf(),具体修改见下面自定义log:

    #ifdef DEBUG
    #define XDString [NSString stringWithFormat:@"%s", __FILE__].lastPathComponent
    #define XDLog(...) printf("%s %d行: %s\n\n",[XDString UTF8String], __LINE__, [[NSString stringWithFormat:__VA_ARGS__] UTF8String]);
    #else
    #define XDLog(...)
    #endif
    

    XDString是获取的该log在哪个文件里,__LINE__该log在第几行。printf()是c语言方法,所以要用UTF8String转义,不然每个log都会有警告。

    类型判断

    网络获取数据,做容错处理,判断某个字段是否符合需要的数据类型。之前一度用如下判断方法:

    [NSStringFromClass([userDict[@"plates"] class]) isEqualToString:@"__NSCFArray"]
    

    如果userDict[@"plates"]的数据类型是数组的话,打印出来的就是__NSCFArray类型。同样如果是字典类型的话,打印出来的就是__NSCFDictionary。但是iOS10之后,打印出来的不同了,同样的数组类型,打印出来的是__NSSingleObjectArrayI

    之前的这种判断方法很欠考虑,还是利用下面的方法比较靠谱:

    [userDict[@"plates"] isKindOfClass:[NSArray class]]
    

    URL Schemes跳转系统设置

    跳转系统设置的方法彻底被关闭了,也就是说你已不能从app跳转到系统设置里了。我的某个app使用地理定位,运行app时会检测是否开启地理定位,如果未开启,提醒alert,用如下代码点击跳转到地理定位的开启设置里。

    NSURL *url = [NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"];
    if ([[UIApplication sharedApplication] canOpenURL:url]) {
      [[UIApplication sharedApplication] openURL:url];
    }
    

    iOS10以后prefs:root开头的Scheme无法跳转到系统设置里了。

    plist里声明获取隐私数据权限

    访问隐私数据需要在plist里声明,在iOS10之前只需要声明地理定位之类的敏感隐私数据,获取照片、相机等不需要再plist里声明。iOS10之后,这些也必须声明,不声明会crash。需要声明的用户数据有:

    Contacts(联系人), Calendar(日历), Reminders(提醒事件), Photos(照片), Bluetooth Sharing(蓝牙共享), Microphone(麦克风), Camera(相机), Location(位置), Health(健康), HomeKit(家居), Media Library(媒体库), Motion(运动), CallKit(打电话), Speech Recognition(语言识别), SiriKit(Siri), TV Provider(电视提供商).

    imgimg

    后面string字段填写弹出用户允许时展示的描述信息。注意,这里必须要写明获取该权限的用途,不然会被AppStore拒绝上架的。

    相关文章

      网友评论

          本文标题:iOS10升级后的一些问题

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