iOS9开发适配指南打包环境Xcode7升级公测
适配指南
- 网络适配 ATS
- 企业级分发
- URLScheme白名单
- 苹方
- 已知bugs
比较长的篇章末尾有小结,可以直接看结论。
网络适配 ATS
- 为了强制增强数据访问安全, iOS9 默认会把所有的HTTP请求统一采用TLS 1.2 协议,修改为HTTPS请求。
- 服务器因此需要更新,以解析相关数据。
- 而这一做法,官方文档称为
ATS
,全称为App Transport Security
,是iOS9的一个新特性。 - 目前为止,此功能是可以关闭的,但官方文档强烈建议开启。
- 官方文档内容摘要:
All connections using the NSURLConnection, CFURL, or NSURLSession APIs use App Transport Security default behavior in apps built for iOS 9.0 or later, and OS X v10.11 or later. Connections that do not follow the requirements will fail. For more information on various the connection methods, see NSURLConnection Class Reference, CFURL Reference, or NSURLSession Class Reference.
These are the App Transport Security requirements:
The server must support at least Transport Layer Security (TLS) protocol version 1.2.
Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)
Certificates must be signed using a SHA256 or greater signature hash algorithm, with either a 2048-bit or greater RSA key or a 256-bit or greater Elliptic-Curve (ECC) key.
Invalid certificates result in a hard failure and no connection.
These are the accepted ciphers:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
- 注意 App Transport Security 要求 TLS 1.2,而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的,ATS只信任知名CA颁发的证书,小公司所使用的 self signed certificate,还是会被ATS拦截。。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要
- 官方文档 App Transport Security Technote对CA颁发的证书要求摘要
Certificates must be signed using a SHA256 or better signature hash algorithm, with either a 2048 bit or greater RSA key or a 256 bit or greater Elliptic-Curve (ECC) key. Invalid certificates result in a hard failure and no connection
小结:
- AppCan 新引擎已经默认配置为禁用ATS,因此开发者
目前可以不做任何改动
。 - 但由于Apple官方文档的语气非常强硬,不排除以后会强制使用ATS的可能性。
- 因此各位开发者最好现在就开始做准备,将APP与服务器的连接逐步转向HTTPS。
企业级分发
有2处变化
iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇:默认不能安装,也不再出现“信任按钮”
- 必须在设置-通用-描述文件 页面中 点击并相信相应的企业证书描述文件才能正常安装
iOS9以后,企业分发时可能存在:下载的ipa包与网页两者的 bundle ID 无法匹配而导致下载失败的情况
- iOS9升级后众多企业分发的 app 已经出现了不能安装的情况,而iOS8或更早的系统不受影响。那是因为从iOS9以后,系统会在 ipa 包下载完之后,拿ipa包中的 bundle ID 与网页中的 plist 文件中的 bundle ID 进行比对,不一致不允许安装以上变化针对所有$299证书打包的应用
小结:
- 提醒用户
在 设置-通用-描述文件 页面中,点击并相信相应的企业证书描述文件
- 保证服务器上的plist文件中的bundleId与应用的真实bundleId一致,或者使用fir.im等第三方分发平台。
URLScheme白名单
- 在iOS9中,如果使用 canOpenURL: 方法,该方法所涉及到的 URL scheme 必须在"Info.plist"中将它们列为白名单,否则不能使用。
- 苹果为什么要这么做?
在 iOS9 之前,你可以使用 canOpenURL: 监测用户手机里到底装没装微信,装没装微博。但是也有一些别有用心的 App ,这些 App 有一张常用 App 的 URL scheme,然后他们会多次调用canOpenURL: 遍历该表,来监测用户手机都装了什么 App ,比如这个用户装了叫“大姨妈”的App,你就可以知道这个用户是女性,你就可以只推给这个用户女性用品的广告。这是侵犯用户隐私的行为。
- 白名单上限是50个。WWDC 2015 Session 703:有说明:
"So for apps that are linked before iOS 9 and are running on iOS 9, they will be given 50 distinct URL schemes." -- WWDC 2015 session 703 Privacy and Your App
- 在公测服务器中,已经提供了设置URLScheme白名单的配置方法
小结
如果您的应用有调用uexWidget.loadApp、uexWidget.isAppInstalled或者使用了有打开第三方APP功能的插件(比如微信、支付宝、QQ分享等)必须要配置URLScheme白名单
- 具体设置方法见公测内容设置URLScheme白名单
苹方
- iOS8中,字体是Helvetica,中文的字体有点类似于“华文细黑”。只是苹果手机自带渲染,所以看上去可能比普通的华文细黑要美观。iOS9中,中文系统字体变为了专为中国设计的“苹方” 有点类似于一种word字体“幼圆”。字体有轻微的加粗效果,并且最关键的是
字体间隙变大了!
所以很多原本写死了width的label可能会出现“…”的情况
- 开发者应
检查所有指定了宽度且包含文字的div
,是否出现此状况
已知bugs
此篇章内提到的bugs,在原生开发中也有出现,目前尚无很好解决办法,只能等待苹果官方修复
使用了 HTML 的 iframe 元素可能导致无法从 Safari 跳转至 App
- 从Safari浏览器直接载入app的URLScheme打开APP不会发生此状况
- 但如果使用了iframe 元素,并将自定义的链接放进了该元素中,会导致不可用,比如
< iframe id="openQQ" height="0" src="mqq://"> </iframe>
iOS9锁屏控制台会打印警告
* 当应用处于空闲状态时(无网络请求)锁屏对于用户而言并无较大影响,
* 但是当应用在执行某个异步任务时(比如下拉刷新一下列表)锁屏,重新解锁进入就可能会发现异步任务失败,控制台也会提示 Error 信息。
* 以上情况不易复现,但确有发生。
企业分发,企业版证书在iOS9上安装应用报 Ignore manifest download, already have bundleID: com.mycom.MyApp大部分iOS9 都可以安装,但有的就是不行
* 这并非 iOS9的问题,iOS8及以前的系统也会出现
* 大部分手机尝试关机重启手机后恢复正常,但也有一直不能安装的例子...目前还找不到办法
公测内容
测试Xcode7与新引擎和旧插件的兼容性
- 将您的应用用公测服务器打包,测试各项功能能否正常运作
- 目前的插件兼容性修改见附录1
测试打包服务器URLScheme白名单设置
- 在config.xml中可以配置APP的URLScheme白名单
- 有调用uexWidget.loadApp、uexWidget.isAppInstalled或者使用了有打开第三方APP功能的插件(比如微信、支付宝、QQ分享等)的APP,必须要进行此项配置。
- 配置方法,在config.xml中的
widget
节点内添加如下字段
<config desc="bgConfig" type="AUTHORITY">
<permission platform="iOS" info="urlSchemeWhiteList">
<string>scheme1</string>
<string>schene2</string>
</permission>
</config>
- 其中,每一行
<string>scheme1</string>
代表一个URLSchemescheme1
加入到APP的白名单中,行数可任选,但必须小于50 - 调用uexWeiXin、uexQQ、uexAliPay、uexSina的配置可参考如下
<config desc="bgConfig" type="AUTHORITY">
<permission platform="iOS" info="urlSchemeWhiteList">
<!--如果您有用到uexWeiXin请添加如下urlSchemes至白名单中,本行不要复制-->
<string>wechat</string>
<string>weixin</string>
<!--如果您有用到uexSina请添加如下urlSchemes至白名单中,本行不要复制-->
<String>Sinaweibohd</String>
<String>Sinaweibo</String>
<String>Sinaweibosso</String>
<String>Weibosdk</String>
<String>Weibosdk2.5</String>
<!-- 如果您有用到uexQQ请添加如下urlSchemes至白名单中,本行不要复制-->
<String>Mqqapi</String>
<String>Mqq</String>
<String>Mqqopensdkssologin</String>
<String>Mqqconnect</String>
<String>Mqqopensdkdataline</String>
<String>Mqqopensdkgrouptribeshare</String>
<String>Mqqopensdkfriend</String>
<String>Mqqopensdkapi</String>
<String>Mqqopensdkapiv2</String>
<String>Mqqopensdkapiv3</String>
<String>Mqzoneopensdk</String>
<String>Wtloginmqq</String>
<String>Wtloginmqq2</String>
<String>Mqqwpa</String>
<String>Mqzone</String>
<String>Mqzonev2</String>
<String>Mqzoneshare</String>
<String>Wtloginqzone</String>
<String>Mqzonewx</String>
<String>Mqzoneopensdkapiv2</String>
<String>Mqzoneopensdkapi19</String>
<String>Mqzoneopensdkapi</String>
<String>Mqzoneopensdk</String>
<!--如果您有用到uexAliPay请添加如下urlSchemes至白名单中,本行不要复制-->
<String>Alipay</String>
<String>Alipayshare</String>
</permission>
</config>
- 更多常见URLScheme参见附录2
附录1 公测改动汇总(随公测进行不断更新中)
last_update:0929
引擎静态库工程改动:
- 移除.dylib 动态库引用
引擎打包工程改动:
- 修改.dylib 为.tbd
- 修改最低支持版本为 iOS 6.0
- 关闭bitcode
- 配置ATS权限为NSAllowsArbitraryLoads,即允许任意http访问
打包服务器改动
- config.xml可以配置urlScheme白名单
插件改动
- uexChart 改用Swift 2.0
附录2 常见URLScheme
平台名称 | URL Schem | 补充说明 |
---|---|---|
微信 | wechat, weixin | |
支付宝 | alipay,alipayshare | |
mqqOpensdkSSoLogin,mqqopensdkapiV2,mqqopensdkapiV3,wtloginmqq2,mqq,mqqapi | ||
QZONE | mqzoneopensdk,mqzoneopensdkapi,mqzoneopensdkapi19,mqzoneopensdkapiV2,mqqOpensdkSSoLogin,mqqopensdkapiV2,mqqopensdkapiV3,wtloginmqq2,mqqapi,mqqwpa,mqzone,mqq | [注:若同时使用QQ和QZONE,则直接添加本格即可] |
新浪微博 | sinaweibo,sinaweibohd,sinaweibosso,sinaweibohdsso,weibosdk,weibosdk2.5 | [后两个若导入新浪SDK则需要] |
豆瓣 | 无需配置 | |
开心网 | 无需配置 | |
易信 | yixin, yixinopenapi | |
Google+ | googlechrome,googlechrome-x-callback,hasgplus4,com.google.gppconsent,com.google.gppconsent.2.2.0,com.google.gppconsent.2.3.0,com.google.gppconsent.2.4.0,com.google.gppconsent.2.4.1 | |
人人网 | renrenapi,renrenios,renreniphone,renren, | |
fbauth2 | ||
无需配置 | ||
pocket-oauth-v1 | ||
pinit | ||
Line | line | |
KakaoTalk | kakaolink | |
KaokaoStory | storylink | |
无需配置 | ||
Tumblr | 无需配置 | |
非平台类 | 无需配置 | ( 如短信,复制,邮件等) |