苹果在最近的一次 wwdc 上提出将在 2017 年 1 月 1 日起强制我们用 HTTPS,否则提交 App 可能会被拒绝。很多 ios 应用的已经放出支持 HTTPS 的 SDK 了。本文主要针对混合式 IOS 应用提供相关的解决方案,欢迎探讨。
info.plist 中 NSAppTransportSecurity 字典结构
- NSAppTransportSecurity : Dictionary {
- NSAllowsArbitraryLoads : Boolean // 默认开启ATS,设置为NO关闭ATS,需审核时说明
- NSAllowsArbitraryLoadsForMedia : Boolean //iOS10新特性,设置为YES使用AVFoundation播放在线,视频不受ATS限制,需审核时说明原因
- NSAllowsArbitraryLoadsInwebContent : Boolean // iOS10新特性,设置为YES使用UIWebView或,WKWebView不受ATS限制,需审核时说明原因
- NSAllowsLocalNetworking : Boolean // iOS10新特性,设置为YES本地网络请求不受ATS限制
- NSExceptionDomains : Dictionary { // 配置特定域名的ATS访问属性
- string> : Dictionary { // 特定域名,注意不支持IP地址
- NSIncludesSubdomains : Boolean // 设置为YES该域名的ATS配置适用于子域名
- NSExceptionAllowsInsecureHTTPLoads : Boolean // 设置为YES该域名可通过HTTP访问,需审核时说明原因
- NSExceptionMinimumTLSVersion : String // 该域名支持的TLS最低版本,需审核时说明原因
- NSExceptionRequiresForwardSecrecy : Boolean // 默认值为YES,置为NO访问该域名时可以不支持perfect forward secrecy (PFS)
- NSRequiresCertificateTransparency : Boolean // 设置为YES该域名服务器需要有效的
- SCT(signed Certificate timestamps)
- }
- }
- }
注:关于 NSAppTransportSecurity 的配置,可通过 / usr/bin/nscurl(OS X v10.11 及以上系统支持)工具模拟进行 ATS 网络连接状况诊断,命令如下:
/usr/bin/nscurl --ats-diagnostics --verbose URL
命令会模拟 ATS 属性不同配置场景的连接状况,可根据输出内容参考配置。
关于 HTTPS,大概分两种类型的证书,一类是 CA 机构认证的,另一类是自签名的,比较典型的就是 12306 网站了
1 采用 CA 机构认证的 SSL 证书:
Info.plist —— 无需改动
代码 —— js 通过 https 进行请求数据,无需改动代码。
2 采用自签名 SSL 证书:
Info.plist —— 修改如下:
- <key>
- NSExceptionDomains
- </key>
- <dict>
- <key>
- 域名
- </key>
- <dict>
- <key>
- NSTemporaryExceptionAllowsInsecureHTTPLoads
- </key>
- <true/>
- </dict>
- </dict>
由于 cordova 项目的网络请求基本都通过 UiWebView 的 ajax 去访问,而 UiWebView 的 ajax 请求不支持客户端证书验证,如若需引入证书与服务端校验需要自定义 cordova 原生插件支持,故这里提供两种方式去实现。
1 基于 UiWebView 的 ajax 请求(该方式客户端并不校验服务端证书内容):
(a)AppDelegate.m 新增:
(b)在 js 中直接通过 ajax 请求 https 即可
2 基于原生 NSUrlSession 的网络请求(需导入证书,网络请求时会验证服务端证书是否可信):
(a)导入 NativeHttps cordova 插件
在 Config.xml 中引用该插件内容:
导入证书,修改 NativeHttps.m 中的 pluginInitialize 方法,将证书添加到 trustedCerArr 数组中
(b)在调用 ajax 的公共 js 中新增插件方法调用原生 get/post 请求:
(c)在对应页面调用原生方法(get/post 一致):
来源: