Xcode9下iOS11适配注意事项及无线部署调试

作者: 仁伯 | 来源:发表于2017-06-16 19:52 被阅读31303次

    前言

    看着网络上铺天盖地的iOS11的消息,作为一枚iOS从业者谁又会无动于衷呢!带着这份好奇,升级了macOS到10.12.4(Xcode9需10.12.4及以上系统),下载安装了Xcode9.0 Beta。

    Xcode9.0 Beta.png

    单从这几天体验来讲,Xcode9不愧为一篇佳作,代码预览、编译速度等都有较大提升,最让人眼前一亮的莫过于Xcode9将版本管理系统独立出来了一个模块,在同一局域网下支持无线部署调试。说真心话,如果不是怕上线项目出问题,真心不想切到Xcode8来开发。

    版本库管理.png

    Xcode9下相册等访问权限问题

    之前项目中相机功能一直使用系统自带的PickerView,说实话不甚美观,自己空闲之余一直着手开发自定义相机(EVNCamera:给个StarO(∩_∩)O~)。在Xcode9的首个Beta版本中开发相机功能时发现,原有项目竟然crash,
    后来发现iOS11下,苹果对相册的权限key做了调整,原来
    如果将图片保存到系统相册,iOS11之后,新增NSPhotoLibraryAddUsageDescription(Xcode9以下打包APP不需要考虑这些),需要在自己的plist文件中添加这个权限配置。
    详见:Cocoa Keys

    近场通讯NFC权限

    在iOS11中,苹果开放了NFC(Near field communication),怕也是其推广ApplePay的一种策略。
    在使用近场通讯时,首先也要在info.plist配置NFCReaderUsageDescription 权限,案例步骤,如下:

    iOS 11 Core NFC - any sample code?

    导航栏TitileView的宽度设置

    在导航titleView使用SearchBar宽度适配问题?
    如果您在Navigation上的titleView上添加searchBar,iOS11情况下可能有问题,如下图所示:


    iOS11之前.png iOS11.png

    Xcode8及以下iOS版本判断

    // iOS版本 > 11.0
     if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = 11, .minorVersion = 0, .patchVersion = 0}])
    

    Xcode9及以后

    if (@available(iOS 11.0, *))
    

    方案一:iOS 11 SearchBar in NavigationBar

    方案二:
    重设titleView的约束

    #import <UIKit/UIKit.h>
    @interface EVNUILayoutView : UIView
    
    - (instancetype)initWithFrame:(CGRect)frame;
    
    @end
    #import "EVNUILayoutView.h"
    
    @implementation EVNUILayoutView
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self)
        {
    
        }
        return self;
    }
    /**
     * 撑开view的布局
     @return CGSize
     */
    - (CGSize)intrinsicContentSize
    {
        return UILayoutFittingExpandedSize;
    }
    
    @end
    
    

    // 有朋友讲,事件触发有问题,此处要感谢范孟童鞋

    #define XCODE9VERSION     // MARK - Xcode9 标记, Xcode8打包记得注释
    
    // 重设约束
    - (void)resetSearchBar
    {
    #ifdef XCODE9VERSION  
        // iOS版本 > 11.0
        if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = 11, .minorVersion = 0, .patchVersion = 0}])// 等同于if (@available(iOS 11.0, *))
        {
            self.navigationItem.titleView = self.searchBar;  // 顶部导航搜索
        }
        else
        {
    #else
    #endif
            CGFloat leftButtonWidth = 35, rightButtonWidth = 75;  // left padding right padding
            EVNUILayoutView *container = [[EVNUILayoutView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - leftButtonWidth - rightButtonWidth, 44)];
    
            self.searchBar.translatesAutoresizingMaskIntoConstraints = NO;
            [container addSubview:self.searchBar];
    
            CGFloat offset = (rightButtonWidth - leftButtonWidth) / 2;
    
            [NSLayoutConstraint activateConstraints:@[
                                                      [self.searchBar.topAnchor constraintEqualToAnchor:container.topAnchor], // 顶部约束
                                                      [self.searchBar.leftAnchor constraintEqualToAnchor:container.leftAnchor constant:-25*ScreenScaleX], // 左边距约束
                                                      [self.searchBar.rightAnchor constraintEqualToAnchor:container.rightAnchor constant:0], // 右边距约束
                                                      [self.searchBar.bottomAnchor constraintEqualToAnchor:container.bottomAnchor], // 底部约束
                                                      [self.searchBar.centerXAnchor constraintEqualToAnchor:container.centerXAnchor constant:-offset], // 横向中心约束
                                                      ]];
            self.navigationItem.titleView = container;  // 顶部导航搜索
    
    #ifdef XCODE9VERSION
        }
    #else
    #endif
    }
    

    ✨✨:如果使用Xcode9打包的先暂时使用自定义的searchBar吧,可以参考鄙人的Demo:EVNCustomSearchBar,适配iPhoneX已适配

    EVNCustomSearchBar.gif EVNCustomSearchBar.gif

    ScrollView相关控件偏移问题

    ScrollView相关控件,比如tableview、webView、collectionView等控件顶部会有一定距离的偏移。

     if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = 11, .minorVersion = 0, .patchVersion = 0}])// 等同于if (@available(iOS 11.0, *))
    {
        self.hostWebView.scrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } 
    else
    {
        self.automaticallyAdjustsScrollViewInsets = NO;
    }
    

    UIToolbar事件触发问题

    https://stackoverflow.com/questions/46107640/ios11-uitoolbar-contentview

    IQKeyBoardManager 状态栏透明问题

    在对应的ViewController里加入:

    // MARK: 键盘导致状态栏异常
    - (void)loadView
    {
        UIScrollView * safeScrollerView = [[UIScrollView alloc] initWithFrame:[UIScreen mainScreen].bounds];
        safeScrollerView = Safe Area's size;
        self.view = safeScrollerView;
    }
    

    iPhone X状态栏和底部功能区

    iPhone X由于状态栏高度的变化,对于状态栏高度预设值的视图需要,动态获取,由于新增底部功能区域,需要对视图高度进行适配,确保主要APP点触功能在安全区(自状态栏至底部功能区)。
    如果使用如下高度或视图控件,请注意:
    1、原状态栏StatusBar 20pt的高度,iPhone X为44pt;
    2、顶部导航高度+状态高度 64pt的高度,iPhone X为88pt的高度;
    3、底部tabbar 49pt,iPhoneX多了一个底部功能区,有34pt的高度;
    网上很多例子,这里不做过多赘述,官方适配文档:为 iPhone X 更新您的 app

    image.png

    其余注意事项暂未发现,大家如有其它的发现,还请在留言区提醒,谢谢,待续......

    无线部署调试

    从Xcode9支持无线部署调试来看,千呼万唤的iPhone8支持无线充电几乎是必然。
    下面简单梳理下无线调试的步骤:
    1、第一次部署调试还是需要连线,连接好之后,选择Window->Devices and Simulators,或者直接快捷键shift+command+2

    shift+command+2.png

    2、保证mac与手机在同一个局域网下,在弹出的界面中,勾选connect via network;


    勾选connect via network.png

    3、勾选好后,耐心等待......


    连接成功.png
    4、当出现上图中的小球时,说明你的iPhone与Xcode匹配成功,此时,拔掉数据线即可。
    DingTalk20170616195309.png

    5、直接运行项目测试。

    本文已在版权印备案,如需转载请在版权印获取授权。
    获取版权

    相关文章

      网友评论

      • 瑞廷:ios 9 上有问题
      • ethan_cun:mac升级速度会变慢 一直没玩x9
      • 7d4f193e49c2:ios11 把searchbar放在view上,把View复制给titleView 想在在push的时候,键盘已经弹出,但是实际情况是键盘上弹 又回退, 您上面的几个方法试了都没效果
        7d4f193e49c2:@仁伯安 下载了您的自定义demo 在您的demo中leftVC 中 Viewwillappear 中填写 [self.searchBar becomeFirstResponder]; 能够实现,但是在right中写 就会跟我产生一样的结果
        7d4f193e49c2:@仁伯安 我在Viewwilappear中调用,上弹就回退
        仁伯:@CC杨 主动调用下becomeFirstResponder方法,比如
        /** 视图完全显示 */
        - (void)viewDidAppear:(BOOL)animated
        {
        [super viewDidAppear:animated];

        // 弹出键盘
        [self.searchBar becomeFirstResponder];
        }
      • astring:Mac连接有线发出热点给手机连接不能进行无线调试吗
        astring:@仁伯安

        Passcode Required
        The device must have a passcode set in order to allow this operation (0xE8003FFE).
        astring:我那里怎么没有连接的球
        仁伯:@astring 可以的,我一直都是。
      • 奮鬥路上的奋青:// 重设约束
        - (void)resetSearchBar
        {

        CGFloat leftButtonWidth = 35, rightButtonWidth = 75; // left padding right padding
        SearchView *container = [[SearchView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width - leftButtonWidth - rightButtonWidth, 44)];

        _searchController.searchBar.translatesAutoresizingMaskIntoConstraints = NO;
        [container addSubview:_searchController.searchBar];

        CGFloat offset = (rightButtonWidth - leftButtonWidth) / 2;


        // 给searchBar添加约束
        [NSLayoutConstraint activateConstraints:@[
        [_searchController.searchBar.topAnchor constraintEqualToAnchor:container.topAnchor], // 顶部约束
        [_searchController.searchBar.leftAnchor constraintEqualToAnchor:container.leftAnchor constant: -25 * ScalW], // 左边距约束
        [_searchController.searchBar.rightAnchor constraintEqualToAnchor:container.rightAnchor constant:0], // 右边距约束
        [_searchController.searchBar.bottomAnchor constraintEqualToAnchor:container.bottomAnchor], // 底部约束
        [_searchController.searchBar.centerXAnchor constraintEqualToAnchor:container.centerXAnchor constant: -offset], // 横向中心约束
        [_searchController.searchBar.heightAnchor constraintEqualToConstant:44.0],
        // [_searchController.searchBar.widthAnchor constraintEqualToAnchor:container.widthAnchor constant:KWidth] // 宽度约束
        ]];
        self.navigationItem.titleView = container; // 顶部导航搜索
        }
        参照你的写的,有两个问题1.searchbar盖满了整个导航栏2.前两次触发搜索都会出现searchbar下沉的情况
        仁伯:可以根据自己情况微调约束,我更新了下。也可以暂时自定义searchBar的方式,代理方法等都不用变,https://github.com/zonghongyan/EVNCustomSearchBar
      • e5a6911bce96:请教:Mac OS X10.13
        Xcode9.0
        iOS 11环境下编译,出错:
        No architectures to compile for (ARCHS=x86_64,valid_archs=i386)
        仁伯:@张安庆 架构问题,编译时clear呢,这个问题很常见的,网上好多方法,依次试试吧
      • zwing:xcode8和xcode9同时存在,使用xcode8,注释快捷键失效了,楼主遇到了么?
        zwing:@仁伯安 试过了好几次了,运行重启还是不行,不知道是不是两个xcode有冲突?
        仁伯:@仁伯安 然后注销下电脑
        仁伯:@weiaini 终端执行下:sudo /usr/libexec/xpccachectl
      • 869d26254b81:你好,我的applepay在ios11及之前的 系统使用都正常,但是在ios11.0.2上系统调不起来,回调总是UPPaymentResultStatusFailure,你有遇到么
        仁伯:你证书重新导一下
      • 贫克慢:我还是没有在网络上找到和解决UISearchBar在Xcode9下UISearchBarIconSearch和placeholder居左的问题,还请指教在OC下怎么设置成居中的?
        仁伯:@贫克慢 暂时使用自定义的searchBar吧,可以参考:https://github.com/zonghongyan/EVNCustomSearchBar.git
      • Raindew:不太明白 EVNUILayoutView 这个SearchBar方法二的类是干什么用的
        Raindew:@仁伯安 感谢
        仁伯:intrinsicContentSize撑开布局,如果Xcode9打包,暂时使用自定义的searchBar吧,可以参考鄙人的Demo:https://github.com/zonghongyan/EVNCustomSearchBar.git
      • 醉雨清风:你好,searchbar的布局有demo吗?看代码有些地方不太懂,谢谢了
        仁伯:暂时使用自定义的searchBar吧,可以参考:https://github.com/zonghongyan/EVNCustomSearchBar.git
      • 3e8712324ddd:searchBar 在iOS11下好像放大了,感觉原来的比较小 有什么好的解决方法么
        3e8712324ddd:好吧 我已经自定义了 哈哈
        仁伯:暂时使用自定义的searchBar吧,可以参考:https://github.com/zonghongyan/EVNCustomSearchBar.git
      • 梦在人间:谢谢!
      • 简了个书呗:请问,searchBar的占位文字和放大镜怎样居中显示?
        仁伯:暂时使用自定义的searchBar吧,可以参考:https://github.com/zonghongyan/EVNCustomSearchBar.git
      • Hunter琼:我刚试了 我的ios 10.1 的 链接xcode9上 不能无线调试 选择按钮都有 是不是设备必须升级到ios11 才行
        仁伯:@Hunter琼 是的iOS11
      • Killer_HG:请问下 这个ScreenScaleX是什么?屏幕的宽度么?谢谢
        Killer_HG:@仁伯安 谢谢😄
        仁伯:#define ScreenScaleX ([UIScreen mainScreen].bounds.size.width/320.0)
      • 范孟:你好,我看到你那个searbar的解决方法,我使用了方法2,但是不再出发searchbar的响应事件……
        仁伯:@范孟 self.searchBar.translatesAutoresizingMaskIntoConstraints = NO;
        范孟:@Jvaeyhcd 没有……还没找到合适的解决方案……
        Jvaeyhcd:请问,您这个问题解决了没有呢?
      • 一骑红尘妃子叫:NSPhotoLibraryAddUsageDescription这个Xcode9,权限授权继续使用NSPhotoLibraryUsageDescription 没有crash。我今天从app store下载更新的
      • 时间shiwo9:无线调试,可以连接几台设备呀
        时间shiwo9:@仁伯安 恩恩,刚试了一下,可以支持多台设备
        仁伯:@时间shiwo9 没看到过文档讲限制的
      • fe0937f347ce:项目没用到NFC和相册权限 是不是就不用适配IOS11了:smirk:
        仁伯:还有一些要适配的,比如:导航栏titleView宽度问题,网上有一些的
      • Unicodeo:意思是在之后开发的时候访问相册权限的key新的旧的都要加?
        仁伯:@超S神 加约束
        iOS白水:设置导航的距离的。那个 失效了。有解决了么
        仁伯:@Unicodeo 如果使用Xcode9打包是需要的,否则不需要。
      • 凡凡_c009:为什么我这边勾选connect via network会报An unknown error message 'PasscodeRequired', was received from the device.这个错误
        凡凡_c009:@仁伯安 谢谢已经解决了。原来手机没有设置密码,我将手机设置了密码就可以了。
        仁伯:@凡凡_c009 你在手机设置里先把手机开机密码关掉再试试
      • 梦晨ing:无线调试的这个大概要连多久啊,我连接了好久没有看到小地球啊。
        梦晨ing:@洁简 公司网络吗?公司网络的话,要设置ip地址
        洁简:@yikibug 等了5分钟 还没好...
        7933e72ff3db:大概几分钟,把Xcode退出,重启iPhone设备,保证设备在同一个WiFi下重新试试
      • 7933e72ff3db:我也是自定义相机,仍然使用的是NSPhotoLibraryUsageDescription,在iOS 11 beta4上正常运行。
        仁伯:@yikibug 你确定用到相册权限是吧,我用的Xcode9第一个Beta版本,在iOS 11 beta4上依旧crash:sweat_smile:
        7933e72ff3db:@仁伯安 ,我试了用Adhot方式打包,运行没问题。我的环境:macOS Sierra 10.12.6,Xcode 9.0 beta 3,iOS 11 beta4。
        仁伯:你在Xcode9打包试试
      • 7933e72ff3db:请问无线调试真机设备必须是iOS 11吗?
        仁伯:@奋斗的小小强 我的六都可以
        RobinZhao:@仁伯安 我还想问一下,这个无线调试有手机型号区分吗?比如我的6s升级的iOS11也能调试吗?还是只有iPhone8才可以?
        仁伯:@yikibug 是的
      • dadalang:现在的NFC 开放到什么程度,有开发那种类似安卓刷闸机过匝的吗?
        96e4766b589a:应该吧 不然有什么用 就差苹果了 不得不开放 不然就落伍了 不是有城市已经试点了么 好像很多品牌可以了
        仁伯:@dadalang 我不懂
      • 4c0ed4bd48d8:安装9.0Beta 原来的8.3是不是会被覆盖?
        4c0ed4bd48d8:@仁伯安 那我也下载个玩玩:grin:
        仁伯:@iOS开发小彩笔 不会被覆盖,名字不一样,你如果怕覆盖掉可以先改下原有Xcode应用的名字
      • ChinaGoodStaff:nfc功能之前的iPhone6以上设备都支持吗?
        A訫飛Flyme:@仁伯安 我记得文档写的只有7以上支持NFC,你确定?Reading NFC NDEF tags is supported on iPhone 7 and iPhone 7 Plus.
        ChinaGoodStaff: @仁伯安 👌
        仁伯:支持Apple pay的就支持nfc

      本文标题:Xcode9下iOS11适配注意事项及无线部署调试

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