适配 iOS 9系统

1、大部分社交平台接口不支持https协议。

问题描述:在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据。对ShareSDK来说,具体表现可能是,无法授权、分享、获取用户信息等。
还可能造成我们的编辑界面里传http之类的网络图片的时候,我们的编辑界面不会显示图片截图,解决的办法或者全面关闭https,允许使用http请求;或者把图片的域添加;又或者选择使用https的图片

解决方案(以下方法2选1):

(1)、暂时退回到http协议。

具体方法:
在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。
然后给它添加一个Key:NSAllowsArbitraryLoads,类型为Boolean类型,值为YES;

适配 iOS 9系统_第1张图片

(2)、设置域。可以简单理解成,把不支持https协议的接口设置成http的接口。

具体方法:
1)、在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。
2)、然后给它添加一个NSExceptionDomains,类型为字典类型;
3)、把需要的支持的域添加給NSExceptionDomains。其中域作为Key,类型为字典类型。
4)、每个域下面需要设置3个属性:NSIncludesSubdomains、NSExceptionRequiresForwardSecrecy、NSExceptionAllowsInsecureHTTPLoads。
均为Boolean类型,值分别为YES、NO、YES。

适配 iOS 9系统_第2张图片

细节提示:在iOS9中如果使用到网络图片,也要注意网络图片是否是HTTP的哦,如果是,也要把图片的域设置哦!

平台 各平台设置域
新浪微博 weibo.com、weibo.cn、sina.com.cn
腾讯微博 qq.com
微信 qq.com
QQ/QZone qq.com
QQ/QZone qq.com
易信 无需配置
豆瓣 无需配置
人人 renren.com
开心网 kaixin001.com、kaixin001.com.cn
有道 youdao.com
Facebook facebook.com、fbcdn.net、akamaihd.net
Twitter twitter.com
Google+ 无需配置
Instagram instagram.com、instagramstatic-a.akamaihd.net
Tumblr tumblr.com
Instapaper instapaper.com
Pinterest 无需配置
明道 无需配置
Evernote印象笔记 无需配置
VK 无需配置
pocket 无需配置
LinkedIn 无需配置
Dropbox 无需配置
Flickr 无需配置
Kakao kakao.com

2、小部分社交平台SDK不支持bitcode。

bitcode:
bitcode是被编译程序的一种中间形式的代码。包含bitcode配置的程序将会在App store上被编译和链接。bitcode允许苹果在后期重新优化程序的二进制文件,而不需要重新提交一个新的版本到App store上。

问题描述:iOS 9新建项目默认需要支持bitcode,而不支持bitcode的SDK会导致无法编译运行。

支持bitcode :
1、微信SDK
2、QQ SDK
3、新浪微博SDK
4、支付宝SDK
5、Kakao SDK
6、Facebook Messenger

不支持bitcode:
1、易信 SDK
2、人人 SDK

不支持 bitcode 的 SDK 解决方案:

(1)、暂时关闭对bitcode的支持(建议),方法如下图
(2)、移除不支持bitcode的平台SDK。

适配 iOS 9系统_第3张图片

3、添加Scheme白名单。

问题描述:在iOS 9下涉及到平台客户端跳转,系统会自动到项目info.plist下检测是否设置平台Scheme。对于需要配置的平台,如果没有配置,就无法正常跳转平台客户端。因此要支持客户端的分享和授权等,需要配置Scheme名单。

具体方法:
1)、在项目的info.plist中添加一LSApplicationQueriesSchemes,类型为Array。
2)、然后给它添加一个需要支持的项目,类型为字符串类型;

适配 iOS 9系统_第4张图片
平台 各平台OpenURL白名单说明
新浪微博 sinaweibo,
sinaweibohd,
sinaweibosso,
sinaweibohdsso,
weibosdk,
weibosdk2.5
[后两个若导入新浪SDK则需要]
腾讯微博 TencentWeibo,
tencentweiboSdkv2
[控制台会提示这两个,但是腾讯微博SDK已经弃用,可以忽略不配置]
豆瓣 无需配置
开心网 无需配置
微信 wechat,
weixin
易信 yixin,
yixinopenapi
支付宝 alipay,
alipayshare
QQ mqqOpensdkSSoLogin,
mqqopensdkapiV2,
mqqopensdkapiV3,
wtloginmqq2,
mqq,
mqqapi
QZONE mqzoneopensdk,
mqzoneopensdkapi,
mqzoneopensdkapi19,
mqzoneopensdkapiV2,
mqqOpensdkSSoLogin,
mqqopensdkapiV2,
mqqopensdkapiV3,
wtloginmqq2,
mqqapi,
mqqwpa,
mqzone,
mqq
[注:若同时使用QQ和QZONE,则直接添加本格即可]
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,
以及在使用人人SDK时所需配置的URL Scheme,例如:rm226427com.mob.demoShareSDK
Facebook fbauth2
Twitter 无需配置
Pocket pocket-oauth-v1
Pinterest pinit
Instagram instagram
WhatsApp whatsapp
Line line
KakaoTalk kakaolink
KaokaoStory storylink
LinkedIn 无需配置
Tumblr 无需配置
非平台类,如短信,复制,邮件等 无需配置

必看注意:
1.在iOS9中,如果没有添加上述白名单,系统会打印类似如下提示:
.-canOpenURL: failed for URL: “sinaweibohdsso://xxx” – error: “This app is not allowed to query for scheme sinaweibohdsso”(如下图)

如没有添加相关白名单,有可能导致分享失败,例如不会跳转微信,不会跳转QQ等。

2.添加完上述所需的名单,系统依然会打印类似信息:
.-canOpenURL: failed for URL: “sinaweibohdsso://xxx” – error: “null”

这是系统打印的信息,目前是无法阻止其打印,即无法消除的

3.上述白名单,是技术人员通过不断的测试收集整理所得,如果各位开发者朋友发现上表格有所遗漏,请根据系统信息添加相关白名单即可。

如果没有设置白名单的话,系统的打印信息如图所示:

适配 iOS 9系统_第5张图片

添加完后,系统是依然会打印的,不过error会变成null:

适配 iOS 9系统_第6张图片

4、更灵活的后台定位

坏消息:如果不适配iOS9,就不能偷偷在后台定位!好消息:将允许出现这种场景:同一App中的多个location manager:一些只能在前台定位,另一些可在后台定位,并可随时开启或者关闭特定location manager的后台定位。

如何偷偷在后台定位:请求后台定位权限:

// 1. 实例化定位管理器
_locationManager = [[CLLocationManager alloc] init];
// 2. 设置代理
_locationManager.delegate = self;
// 3. 定位精度
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
// 4.请求用户权限:分为:⓵只在前台开启定位⓶在后台也可定位,
//注意:建议只请求⓵和⓶中的一个,如果两个权限都需要,只请求⓶即可,
//⓵⓶这样的顺序,将导致bug:第一次启动程序后,系统将只请求⓵的权限,⓶的权限系统不会请求,只会在下一次启动应用时请求⓶
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) {
    //[_locationManager requestWhenInUseAuthorization];//⓵只在前台开启定位
    [_locationManager requestAlwaysAuthorization];//⓶在后台也可定位
}
// 5.iOS9新特性:将允许出现这种场景:同一app中多个location manager:一些只能在前台定位,另一些可在后台定位(并可随时禁止其后台定位)。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) {
    _locationManager.allowsBackgroundLocationUpdates = YES;
}
// 6. 更新用户位置
[_locationManager startUpdatingLocation];

但是如果照着这种方式尝试,而没有配置Info.plist,100%你的程序会崩溃掉,并报错:

*** Assertion failure in -[CLLocationManager setAllowsBackgroundLocationUpdates:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/CoreLocationFramework_Sim/CoreLocation-1808.1.5/Framework/CoreLocation/CLLocationManager.m:593

这个问题,有两种方式可以解决:

第一种:



对应的 Info.plist 的XML源码是:

NSLocationAlwaysUsageDescription
微博@iOS程序犭袁 请求后台定位权限

UIBackgroundModes

    location

第二种:

在对应 target 的 Capabilities -> Background Modes -> 开启 Location Updates

适配 iOS 9系统_第7张图片

5、企业级分发

有两处变化:

  • iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇:默认不能安装,也不再出现“信任按钮”
  • iOS9以后,企业分发时可能存在:下载的ipa包与网页两者的 bundle ID 无法匹配而导致下载失败的情况

1、iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇:默认不能安装,也不再出现“信任按钮”
iOS9之前,企业级分发十分方便:点击App出现“信任按钮”,

iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇:默认不能安装,也不再出现“信任按钮”

适配 iOS 9系统_第8张图片

必须让用户进行gif图中的设置:

适配 iOS 9系统_第9张图片

2、iOS9以后,企业分发时可能存在:下载的ipa包与网页两者的 bundle ID 无法匹配而导致下载失败的情况

iOS9升级后众多企业分发的 app 已经出现了不能安装的情况,而iOS8或更早的系统不受影响。那是因为从iOS9以后,系统会在 ipa 包下载完之后,拿ipa包中的 bundle ID 与网页中的 plist 文件中的 bundle ID 进行比对,不一致不允许安装。

错误提示如下:


适配 iOS 9系统_第10张图片

配方法:
把两者的 bundle id 修改一致

3、企业APP安装之后,在网络情况为Wi-Fi环境的时候,可能会出现无法验证应用的情况。出现以下提示:
无法验证"xxxCo.,Ltd"应用,需要网络连接以在这台iPhone上验证"xxx Co.,Ltd"应用。接入互联网并重试。

适配 iOS 9系统_第11张图片
适配 iOS 9系统_第12张图片
适配 iOS 9系统_第13张图片

而此时,Wi-Fi网络是接入互联网的。如果多次验证不通过的话,我们需要切换到非Wi-Fi网络环境下才能解决这个问题。

6、iOS国际化问题:当前设备语言字符串返回有变化

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *allLanguage = [defaults objectForKey:@"AppleLanguages"];
NSString *currentLanguage = [allLanguage objectAtIndex:0];
NSLog(@"The current language is : %@", currentLanguage);

iOS 9 之前:以上返回结果:语言字符串代码。例如:"zh-Hans"
iOS 9:以上返回结果:语言字符串代码 + 地区代码。例如:"zh-Hans-US"

备注:
1.请注意判断当前语言类型,不要用以下形式的代码了,不然在iOS9上就会遇到坑。

if ([currentLanguage isEqualToString:@"zh-Hans"])

可以使用:

if ([currentLanguage hasPrefix:@"zh-Hans"])

另外:对于中文,语言有:
简体中文:zh-Hans
繁体中文:zh-Hant
香港中文:zh-HK
澳门中文:zh-MO
台湾中文:zh-TW
新加坡中文:zh-SG

备注:以上iOS9 当前语言字符串返回结果:语言字符串代码 + 地区代码。在某些情况下不是这样,本人手机型号:大陆版电信iPhone5S/A1533/16GB测试结果:zh-HK/zh-TW,在地区为"中国"、"中国香港"、"中国台湾"的时候,显示的还是zh-HK/zh-TW,一旦切换到其它地区,设备语言会自动的切换到中文繁体。请开发人员注意中文的问题!

7、新增 UIStackView

iOS 9: UIStackView入门
http://www.cocoachina.com/ios/20150623/12233.html

iOS 9 新增 UIStackView 官方文档翻译
http://www.cocoachina.com/ios/20150617/12151.html

你可能感兴趣的:(适配 iOS 9系统)