美文网首页111
升级Xcode8后项目问题解决(持续总结)

升级Xcode8后项目问题解决(持续总结)

作者: yaoyao_IOS | 来源:发表于2016-10-12 17:06 被阅读547次

    1.输出log日志关闭

    Xcode8运行项目之后,控制台打印了好多log输出,根据如下操作可以关掉这些log日志,点击项目Edit Scheme或者按command + shift + <快捷键。在弹出的窗口中选择Run ->Arguments -> Environment Variables里添加:Name:OS_ACTIVITY_MODE Value:disable

    输出log日志关闭

    解决了问题之后,是不是赶脚心里舒服多了,乱七八糟的输出不见了,但是在我们用真机调试的时候,NSLog也不工作了。我们在输出窗口看不到我们想要的日志了。

    定义一个宏即可

    #ifdef DEBUG
    #define CLLog(format, ...) printf("[%s] %s [第%d行] %s\n", __TIME__, __FUNCTION__, __LINE__, [[NSString stringWithFormat:format, ## __VA_ARGS__] UTF8String]);
    #else
    #define NSLog(format, ...)
    #endif
    

    2.Command +/ 快捷键注释代码快捷键不能用

    在终端输入
    sudo /usr/libexec/xpccachectl重启电脑即可

    3.LaunchScreen.storyboard: The document “(null)” requires Xcode 8.0 or later

    1) 打开storyboard, 右键点击,点击source Control - > commit
    2)删除这行代码:
    <capalibility name="documents saved in the Xcode 8 format"> minToolsVersion=8.0/>
    3)删除所有你要用到的storyboard的里面的整个行代码,提交.
    4)重新运行程序,问题解决.
    同样, xib文件遇到类似报错,也是这样解决.
    或者:
    Xcode8 打开StoryBoard,如图所示,Open in 改为7.X即可:

    Open in 改为7.X

    4.字体变大,原有的fream需要适配,只能逐一排查啦

    5.Nib问题:警告

    - (void)awakeFromNib {
    // Initialization code
    }
    

    需要添加:
    [super awakeFromNib];

    6.系统判断失效

    现在改用:

    #define IOS10_OR_LATER  ([[[UIDevice currentDevice] systemVersion] compare"10.0" options:NSNumericSearch] != NSOrderedAscending)
    

    7.程序调用相机和相册程序崩溃Crash

    在iOS10中,如果你的App想要访问用户的相机、相册、麦克风、通讯录等等权限,都需要进行相关的配置,不然会直接crash.

    崩溃日志如下:
    This app has crashed because it attempted to access privacy-sensitive data without a usage description.The app’s Info.plist must contain an NSPhotoLibraryUsageDescription key with a string value explaining to the user how the app uses this data.

    • 意思试图访问安全隐私数据,但是又没有相应的描述,你必须要包含在info.plist里包含一个键值 NSPhotoLibraryUsageDescription对应的描述。
    • 其实上面是iOS10,苹果加强了对隐私数据的保护,要对隐私数据权限做一个适配iOS10调用相机,访问通讯录,访问相册等都要在info.plist中加入权限访问描述,不然之前你们的项目涉及到这些权限的地方就会直接crash掉。

    需要在info.plist中添加App需要的一些设备权限:

    访问蓝牙:NSBluetoothPeripheralUsageDescription
    访问日历:NSCalendarsUsageDescription
    相机:NSCameraUsageDescription
    相册:NSPhotoLibraryUsageDescription
    通讯录:NSContactsUsageDescription
    始终访问位置:NSLocationAlwaysUsageDescription
    位置:NSLocationUsageDescription
    在使用期间访问位置:NSLocationWhenInUseUsageDescription
    麦克风:NSMicrophoneUsageDescription
    访问媒体资料库:NSAppleMusicUsageDescription
    访问健康分享:NSHealthShareUsageDescription
    访问健康更新:NSHealthUpdateUsageDescription
    访问运动与健身:NSMotionUsageDescription
    访问提醒事项:NSRemindersUsageDescription
    

    8.如果你的项目中使用了MJRefresh,并且不是最新版本的,就会直接崩溃:

    只要将MJRefresh更新到最新版本就行了。简单粗暴

    9.在用模拟器进行调试的时候,会莫名的输出

    这个输出不影响调试,也不影响程序运行。

    模拟器调试问题
    原因:是在这两个路径下有两个模拟器包文件,并且这两个包文件中都包含了PhotoLibraryServices文件,模拟器不知道使用哪个文件了。在真机上就不会出现这种情况。

    解决方法:这两个模拟器包文件谁都不可以删除,删除谁都会报错,确切的说删除iPhoneSimulator10.0.sdk这个包文件会报错,另一个不能在模拟器上运行了。我得到的结果是:这可能是模拟器的bug,也可能是我电脑上安装了两个版本的Xcode.所以可以忽略这个警告.

    10.跳转到app内的隐私数据设置页面

    我们知道用户没开启权限的话要提醒用户去设置开启,所以要跳转到app的隐私数据界面。如何调用呢,可以定义一个宏方便调用:

    UIKIT_EXTERN NSString *const UIApplicationOpenSettingsURLString
    NS_AVAILABLE_IOS(8_0);
    
    //-----------------------系统权限设置路径(iOS8以后适用)--------------
    // 设置url
    #define SettingURL [NSURL URLWithString:UIApplicationOpenSettingsURLString]
    // 调到设置
    #define GoToSetting if([[UIApplication sharedApplication] canOpenURL:SettingURL]) {   [[UIApplication sharedApplication] openURL:SettingURL];}}
    // 去设置
    if (IOS8_OR_LATER) {
        GoToSetting; 
    }
    

    11.真机调试问题-App installation failed

    Xcode 8 无证书真机调试时免费App ID出现的问题:


    免费应用程序调试最大限度

    原因:苹果免费App ID只能运行2个应用程序,当调试第三个的时候就会报这个错误, 必须把之前的应用程序删除,才能调试新的

    解决方法:连接iPhone 打开Xcode--->Window--->Devices删除不是本次运行的应用程序即可.

    12.***** Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:3294**

    原因:

    新的SDK不允许在设置rootViewController之前做过于复杂的操作,导致在didFinishLaunchingWithOptions 结束后还没有设置rootViewController
    Xcode7需要所有UIWindow必须立即先设置一个rootViewController

    解决办法:
    先设置个rootVIewController 之后重新赋值
    UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    window.rootViewController = [UIViewController new];

    相关文章

      网友评论

      本文标题:升级Xcode8后项目问题解决(持续总结)

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