关闭

[置顶] 升级到XCode9(BaseSDK:iOS11)的各种坑 持续更新中

标签: iosios11xcode9iPhoneX
12395人阅读 评论(11) 收藏 举报
分类:

XCode9和iOS11 beta了不知多少版本了,正式版本还没有正式发布。我也终于忍不了了,还是都做了升级。设备版本分别为:
XCode:Version 9.0 beta 6 (9M214v) 10月13日更新GM版
iPhone:11.0(15A5370a)

下面的问题都是在iOS11之前的版本运行完好,但是升级后出现的问题:
1,定位相关
问题描述:无法定位,而且程序在安装后第一次访问定位权限时,无定位权限提示对话框弹出。
原因:iOS11 定位相关的权限做了更改,在iOS11上使用了新的定位权限key。
解决方案:
如果原来申请的权限是始终允许NSLocationAlwaysUsageDescription,那么需要在保留原来的key的基础上增加NSLocationWhenInUseUsageDescription和NSLocationAlwaysAndWhenInUsageDescription。具体参考另篇博客:
http://blog.csdn.net/dangyalingengjia/article/details/77965029

2,系统相册相关
问题描述:iOS11上读写相册的照片时发生崩溃。
原因:由于相册相关权限的key发生了变化。用户在没有权限的情况下,访问相册导致崩溃。
解决方案:
iOS11之前相册对应的key是NSPhotoLibraryUsageDescription,iOS11对应的Key是NSPhotoLibraryAddUsageDescription。同定位的Key一样,由于key没有兼容性,所以需要保留原key以兼容iOS10及之前版本。

3,关于UIScrollView初始位置变化的问题
由于iOS11废弃了UIViewController的automaticallyAdjustsScrollViewInsets属性,位置需要手动调整。
iOS11中为UIScrollView新增了contentInsetAdjustmentBehavior属性,结合UIAppearance协议,可以统一在appDelegate的didFinishLaunchingWithOptions的最开始增加:

if #available(iOS 11.0, *) {
    UIScrollView.appearance().contentInsetAdjustmentBehavior = .never
}
调整前 调整后
这里写图片描述 这里写图片描述

2017/10/21更新
注意1,如果你需要做一个嵌套WebView的画面,直接将WebView加到self.view中时,那就需要对WebView的ScrollView进行单独处理:

UIScrollView.appearance().contentInsetAdjustmentBehavior = .automatic

注意2,对于系统的相册选择视图UIImagePickerController,需要单独处理:

再打开系统相册前设定:
UIScrollView.appearance().contentInsetAdjustmentBehavior = .automatic
从相册返回后设定:
UIScrollView.appearance().contentInsetAdjustmentBehavior = .never

4,第三方库WKWebViewJavascriptBridge
问题描述:在WKWebView的回调函数中崩溃:
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
原因:WKWebViewJavascriptBridge内部逻辑问题
解决方案:WKWebViewJavascriptBridge最新的6.0.2上仍然没有解决这个问题,可以参考github issue#272
只能手动修改源文件,将WKWebViewJavascriptBridge.m 的L153的if改为 else if
修改后:                        修改前:
WKWebView

5,第三方库CryptoSwift
如果你使用了加解密相关的第三方库CryptoSwift,而且其版本号在0.7.0以下,可能会遇到找不到UInt8等错误。
你需要更新至0.7.0才能支持XCode9中的Swif3.2。可以查看Github上的CryptoSwift的版本介绍:
CryptoSwift版本
将podfile修改为如下,即可编译通过。
pod ‘CryptoSwift’, ‘~> 0.7.0’

6,第三方库GzipSwift
如果你使用了GZip压缩库GZipSwift的话,可能会遇到这样的错误:
Redefinition of module ‘zlib’
Could not build Objective-C module ‘Gzip’
修改podfile为:
pod ‘GzipSwift’, :git => ‘https://github.com/1024jp/GzipSwift.git‘, :branch => ‘swift4’

7,UIVisualEffectView相关的崩溃
iOS11之前可以将UIView直接加到(addSubview)UIVisualEffectView上面,但是在iOS11上面这么做会导致crash。
正确的姿势是:将UIViewaddSubview到UIVisualEffectView的contentView上。

8,关于上传商店相关改变
之前没有1024*1024的icon,同样可以提交商店审核,但是现在不行了。你会在用Application Loader上传完成后收到一个warning,但是在提交审核(包括beta测试版本)时被告知不允许提交。
上传被拒
而且注意,这个1024的图片一定要去掉alpha通道。可以在github上搜索Alpha-Channel-Remover,用这个工具去掉alpha通道。

9,xcodebuild命令的变化
xocdebuild error
之前用的打包命令是:

./xcodebuild_safe.sh -exportArchive -archivePath "${archive_path}" -exportPath "${export_dir}" -exportOptionsPlist "${plist_file}" || Failed "export fail"
cd "${origin_dir}"

在plist中加入就可以了

    <key>provisioningProfiles</key>
    <dict>
        <key>xxx:YourBundleID</key>
        <string>xxx:YourProvisioningProfileName</string>
    </dict>

在XCode9中,xcodebuild命令的-exportOptionsPlist需要增加provisioningProfiles,用来明确指明用到的provisioningprofile。-exportOptionsPlist这个参数只用在手动管理签名的情况下,尝试使用苹果推荐的xcode自动xcode的自动管理。但是发现带有通配符的AppleID还需要为其指定各种权限,遂作罢。还是手动管理签名吧。

10,iPhoneX的适配
问题1:直接模拟器运行是下图这样的,可以看到顶部,底部都有空余区域:
iPhoneX适配前
解决方案:增加iPhoneX用的启动图(1125*2436)可以让画面充满屏幕。
问题2:充满屏幕后,由于iPhoneX的状态条已经不是20pt,而是44pt。我们的工程用的autolayout,自定义的导航条,约束的写法是相对于self.view做64的位移。这样就会出现视图内容跟导航条重叠。
解决方案1:取消原来的状态条20,导航条44等硬编码写法,定义常量。

// 状态条的高度
func statusBarHeight() -> CGFloat {
    var height: CGFloat = 0
    if #available(iOS 11.0, *) {
        // iPhoneX
        if abs(UIScreen.main.bounds.size.height - CGFloat(812)) < CGFloat.leastNormalMagnitude {
            height = 44
        } else {
            height = 20
        }
    } else {
        height = 20
    }
    return height
}
// 导航条高度
let kNavigationBarHeight: CGFloat = 44
// 画面中视图的起始位置
let kViewTopOffset = statusBarHeight() + kNavigationBarHeight

视图的top从kViewTopOffset开始。
解决方案2:使用safeAreaLayoutGuide。它是当前视图安全区域的范围,可以将其看做一个视图。我们做约束的时候,相对于safeAreaLayoutGuide就好了。但是需要在做约束时区分系统版本,代码量大。

总而言之,上面两种做法,都需要巨大的搬砖量。我选择了第一种做法,昨天从下午搬砖到凌晨1点,每个画面都改了一个遍。
参考:
https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/
https://developer.apple.com/videos/play/fall2017/201/
https://developer.apple.com/videos/play/fall2017/801?time=209
http://www.jianshu.com/p/1432a94ef66f

改完后的效果:

图1 图2
修正后1 修正后2
4
0
查看评论

Xcode 9 俩个你必须知道的新功能

Xcode 9 beta 版已经可以下载了,不知道大家伙对这个新版本开发工具看法如何,最近我费了一番周折终于体验了一把,升级系统,下载Xcode,验证安装扒拉扒拉什么的,几乎搞了我一天,我做开发使用的并不是什么 MacBook pro 笔记本, 而是Mac mini 盒子,安装好后,还是明显感觉运行...
  • shenjie12345678
  • shenjie12345678
  • 2017-06-19 23:33
  • 19438

iOS11: 使用Xcode9后的11条小建议

Xcode9已在9月20号推出, 相信很多人充满期待, 那么新版Xcode给我们带来哪些新东西呢? 下载后发现很多人哀声载道, 很大一部分是不适应新的编译器, 那么我们我们该如何去调整呢? 耐心看完本文或许你能找到一些答案!1.模拟器的变化相信很多人不太习惯新版模拟器, 那么如何恢复呢, 看下图:是...
  • FyfFomnVXb2f97Y0dp7
  • FyfFomnVXb2f97Y0dp7
  • 2017-09-22 00:00
  • 408

让xcode9.1支持 iOS11.2

  • 2017-12-04 12:03
  • 5.77MB
  • 下载

[绍棠] Xcode9无线调试教程

软硬件要求: - Xcode 9.0 beat 及以上版本 - macOS 10.12.5 及以上版本 - iOS 11.0 beat 及以上版本 连接要求 电脑和设备处于同一 Wifi 环境 虽然Xcode支持无线调试, 但让你的设备支持无线调试之前, 必须连接上数据线, 做好...
  • happyshaotang2
  • happyshaotang2
  • 2017-06-07 10:57
  • 12095

xcode更新一直失败的解决办法

ios每次升级,对应的xocde也要升级,不然没有对应的disk image。。。公司的测试老是喜欢把测试机都升到最新,好烦人。问题是国内升级xcode简直不要太慢,而且基本都是看运气。没有断点续传,动不动下载失败重下,苹果你不能走点心吗?先试试万能的dns设为8.8.8.8,8.4.4.4,依然无...
  • yanhui2012
  • yanhui2012
  • 2016-08-29 16:30
  • 3059

新版xcode8更新的内容

Xcode 8包括所有你需要的东西,去创建令人惊叹的iPhone、iPad、Mac、Apple Watch和Apple TV 应用程序,这从根本上是更快的IDE版本,您可以使用新的编辑器扩展完全定制化你的编码经验。新的运行时问题提醒你隐藏的bug指出内存泄漏,和一个新的内存调试器使你更深入到对象中。...
  • qq_26918391
  • qq_26918391
  • 2016-10-24 16:50
  • 916

让Xcode自动更新Build版本

我们每天都要打包给测试,每天都要改Build比较麻烦,幸运的是可以通过Shell脚本来省略这个过程。 在Xcode工程里选择对应的Target,在Build Phases里点击“New Run Script Phases”
  • zhangao0086
  • zhangao0086
  • 2015-02-03 17:36
  • 10003

xcode APP 打包以及提交apple审核详细流程(新版本更新提交审核)

最近项目到了最后的阶段,测试完一切ok后,准备打包以及提交,不料看到网上众教程,好多都是老版本的,现在IDE实现方式改了,那些方法好多都找不到,绕了一大圈,才搞明白流程,现在记录下来,以便朋友们查阅。 开发环境:xcode4.4.1 iphonesdk:5.1.1 开发机器:macmini 真机...
  • mad1989
  • mad1989
  • 2012-11-09 21:00
  • 265713

关于Xcode 7.2版本更新后需要注意的东西

iOS 笔记
  • wen1062916470
  • wen1062916470
  • 2015-12-24 14:16
  • 1331

xcode不升级的情况下真机测试高版本系统

苹果的xcode的一直在随着iOS系统的升级而升级,有时候弄的我们手足无措,尤其是开发中突然来个高系统版本的测试机,暂时又不想升级Xcode的情况下,可以使用以下办法! 首先找有高版本测试权限的xcode中按/Applications/Xcode.app/Contents/Developer/Pla...
  • GBKing
  • GBKing
  • 2016-12-29 12:05
  • 1296
    个人资料
    • 访问:39657次
    • 积分:833
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:4篇
    • 译文:6篇
    • 评论:12条
    最新评论