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、直接运行项目测试。

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

相关文章

  • ios11 适配

    Xcode9下iOS11适配注意事项及无线部署调试 前言 看着网络上铺天盖地的iOS11的消息,作为一枚iOS从...

  • iOS11及Xcode9适配问题汇总

    iOS11及Xcode9适配问题汇总 iOS11及Xcode9适配问题汇总

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

    前言 看着网络上铺天盖地的iOS11的消息,作为一枚iOS从业者谁又会无动于衷呢!带着这份好奇,升级了macOS到...

  • Xcode9 无线调试

    Xcode9 无线调试 工具:masOS 10.12.5+,xcode9,iOS11(必须) 手机连接上Xcode...

  • 设备无线调试

    设备无线调试 iOS11,xcode9之后,就支持设备无线调试。操作步骤: 1- 用数据线连接手机和mac,通过 ...

  • Xcode无线调试

    无线调试要求设备环境:Mac OSX 10.12.5、iOS11、Xcode9 1.手机连接上Xcode,打开Xc...

  • iOS11及xcode9的适配问题

    iOS11及xcode9的适配问题关于iPhone X、iOS 11 、Xcode9,我们应该知道这些iOS 11...

  • Xcode9无线调试

    Xcode9的新功能:无线调试功能 确保电脑和手机处于同一个 wifi 下, 手机系统是 iOS11 + 通过数据...

  • iOS开发——ios11、iphoneX适配实记

    编译器升级xcode9,准备适配一下iphoneX的布局,调试时发现由于一些ios11新特性或者底层变化的原因,x...

  • Xcode无线调试

    Xcode无线调试是WWDC2017的一个新功能,首先要满足iOS11以上,Xcode9以上; 首先,把iOS11...

网友评论

  • 瑞廷: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