1、大部分社交平台接口不支持https协议。
问题描述:在iOS9下,系统默认会拦截对http协议接口的访问,因此无法获取http协议接口的数据。对ShareSDK来说,具体表现可能是,无法授权、分享、获取用户信息等。
还可能造成我们的编辑界面里传http之类的网络图片的时候,我们的编辑界面不会显示图片截图,解决的办法或者全面关闭https,允许使用http请求;或者把图片的域添加;又或者选择使用https的图片
解决方案(以下方法2选1):
(1)、暂时退回到http协议。
具体方法:
在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。
然后给它添加一个Key:NSAllowsArbitraryLoads,类型为Boolean类型,值为YES;
(2)、设置域。可以简单理解成,把不支持https协议的接口设置成http的接口。
具体方法:
1)、在项目的info.plist中添加一个Key:NSAppTransportSecurity,类型为字典类型。
2)、然后给它添加一个NSExceptionDomains,类型为字典类型;
3)、把需要的支持的域添加給NSExceptionDomains。其中域作为Key,类型为字典类型。
4)、每个域下面需要设置3个属性:NSIncludesSubdomains、NSExceptionRequiresForwardSecrecy、NSExceptionAllowsInsecureHTTPLoads。
均为Boolean类型,值分别为YES、NO、YES。
细节提示:在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.com、fbcdn.net、akamaihd.net | |
twitter.com | |
Google+ | 无需配置 |
instagram.com、instagramstatic-a.akamaihd.net | |
Tumblr | tumblr.com |
Instapaper | instapaper.com |
无需配置 | |
明道 | 无需配置 |
Evernote印象笔记 | 无需配置 |
VK | 无需配置 |
无需配置 | |
无需配置 | |
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。
3、添加Scheme白名单。
问题描述:在iOS 9下涉及到平台客户端跳转,系统会自动到项目info.plist下检测是否设置平台Scheme。对于需要配置的平台,如果没有配置,就无法正常跳转平台客户端。因此要支持客户端的分享和授权等,需要配置Scheme名单。
具体方法:
1)、在项目的info.plist中添加一LSApplicationQueriesSchemes,类型为Array。
2)、然后给它添加一个需要支持的项目,类型为字符串类型;
平台 | 各平台OpenURL白名单说明 |
---|---|
新浪微博 | sinaweibo, |
sinaweibohd, | |
sinaweibosso, | |
sinaweibohdsso, | |
weibosdk, | |
weibosdk2.5 | |
[后两个若导入新浪SDK则需要] | |
腾讯微博 | TencentWeibo, |
tencentweiboSdkv2 | |
[控制台会提示这两个,但是腾讯微博SDK已经弃用,可以忽略不配置] | |
豆瓣 | 无需配置 |
开心网 | 无需配置 |
微信 | wechat, |
weixin | |
易信 | yixin, |
yixinopenapi | |
支付宝 | alipay, |
alipayshare | |
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 | |
fbauth2 | |
无需配置 | |
pocket-oauth-v1 | |
pinit | |
Line | line |
KakaoTalk | kakaolink |
KaokaoStory | storylink |
无需配置 | |
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.上述白名单,是技术人员通过不断的测试收集整理所得,如果各位开发者朋友发现上表格有所遗漏,请根据系统信息添加相关白名单即可。
如果没有设置白名单的话,系统的打印信息如图所示:
添加完后,系统是依然会打印的,不过error会变成null:
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
5、企业级分发
有两处变化:
- iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇:默认不能安装,也不再出现“信任按钮”
- iOS9以后,企业分发时可能存在:下载的ipa包与网页两者的 bundle ID 无法匹配而导致下载失败的情况
1、iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇:默认不能安装,也不再出现“信任按钮”
iOS9之前,企业级分发十分方便:点击App出现“信任按钮”,
iOS9以后,企业级分发ipa包将遭到与Mac上dmg安装包一样的待遇:默认不能安装,也不再出现“信任按钮”
必须让用户进行gif图中的设置:
2、iOS9以后,企业分发时可能存在:下载的ipa包与网页两者的 bundle ID 无法匹配而导致下载失败的情况
iOS9升级后众多企业分发的 app 已经出现了不能安装的情况,而iOS8或更早的系统不受影响。那是因为从iOS9以后,系统会在 ipa 包下载完之后,拿ipa包中的 bundle ID 与网页中的 plist 文件中的 bundle ID 进行比对,不一致不允许安装。
错误提示如下:
配方法:
把两者的 bundle id 修改一致
3、企业APP安装之后,在网络情况为Wi-Fi环境的时候,可能会出现无法验证应用的情况。出现以下提示:
无法验证"xxxCo.,Ltd"应用,需要网络连接以在这台iPhone上验证"xxx Co.,Ltd"应用。接入互联网并重试。
而此时,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