IOS开发入门之iOS10适配
白羽 2018-11-13 来源 :网络 阅读 288 评论 0

摘要:本文将带你了解IOS开发入门iOS10适配,希望本文对大家学IOS有所帮助。

    本文将带你了解IOS开发入门iOS10适配,希望本文对大家学IOS有所帮助。



        

随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出.

1.系统判断方法失效:

在你的项目中,当需要判断系统版本的话,不要使用下面的方法:


   

#define isiOS10 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=10)

   

它会永远返回NO,substringToIndex:1在iOS 10 会被检测成 iOS 1了,
应该使用下面的这些方法:
Objective-C 中这样写:


   

#define SYSTEM_VERSION_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)

#define SYSTEM_VERSION_GREATER_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

   

或者使用:


   

if ([[NSProcessInfo processInfo] isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){.majorVersion = 9, .minorVersion = 1, .patchVersion = 0}]) { NSLog(@"Hello from > iOS 9.1");}

if ([NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:(NSOperatingSystemVersion){9,3,0}]) { NSLog(@"Hello from > iOS 9.3");}

   

或者使用:


   

if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_9_0) { // do stuff for iOS 9 and newer} else { // do stuff for older versions than iOS 9}

   

有时候会缺少一些常量,NSFoundationVersionNumber是在NSObjCRuntime.h中定义的,作为Xcode7.3.1的一部分,我们设定常熟范围从iPhone OS 2到#define NSFoundationVersionNumber_iOS_8_4 1144.17,在iOS 10(Xcode 8)中,苹果补充了缺少的数字,设置有未来的版本.


   

#define NSFoundationVersionNumber_iOS_9_0 1240.1

#define NSFoundationVersionNumber_iOS_9_1 1241.14

#define NSFoundationVersionNumber_iOS_9_2 1242.12

#define NSFoundationVersionNumber_iOS_9_3 1242.12

#define NSFoundationVersionNumber_iOS_9_4 1280.25

#define NSFoundationVersionNumber_iOS_9_x_Max 1299

   

Swift中这样写:


   

if NSProcessInfo().isOperatingSystemAtLeastVersion(NSOperatingSystemVersion(majorVersion: 10, minorVersion: 0, patchVersion: 0)) { 

         // 代码块

}

   

或者使用


   

if #available(iOS 10.0, *) { 

         // 代码块

} else { 

         // 代码块

}

   

2.隐私数据访问问题:

你的项目中访问了隐私数据,比如:相机,相册,联系人等,在Xcode8中打开编译的话,统统会crash,控制台会输出下面这样的日志:


Snip20160905_1.png

 

这是因为iOS对用户的安全和隐私的增强,在申请很多私有权限的时候都需要添加描述,但是,在使用Xcode 8之前的Xcode还是使用系统的权限通知框.
要想解决这个问题,只需要在info.plist添加NSContactsUsageDescription的key, value自己随意填写就可以,这里列举出对应的key(Source Code模式下):


   

<!-- 相册 --> 

<key>NSPhotoLibraryUsageDescription</key> 

<string>App需要您的同意,才能访问相册</string> 

<!-- 相机 --> 

<key>NSCameraUsageDescription</key> 

<string>App需要您的同意,才能访问相机</string> 

<!-- 麦克风 --> 

<key>NSMicrophoneUsageDescription</key> 

<string>App需要您的同意,才能访问麦克风</string> 

<!-- 位置 --> 

<key>NSLocationUsageDescription</key> 

<string>App需要您的同意,才能访问位置</string> 

<!-- 在使用期间访问位置 --> 

<key>NSLocationWhenInUseUsageDescription</key> 

<string>App需要您的同意,才能在使用期间访问位置</string> 

<!-- 始终访问位置 --> 

<key>NSLocationAlwaysUsageDescription</key> 

<string>App需要您的同意,才能始终访问位置</string> 

<!-- 日历 --> 

<key>NSCalendarsUsageDescription</key> 

<string>App需要您的同意,才能访问日历</string> 

<!-- 提醒事项 --> 

<key>NSRemindersUsageDescription</key> 

<string>App需要您的同意,才能访问提醒事项</string> 

<!-- 运动与健身 --> 

<key>NSMotionUsageDescription</key> <string>App需要您的同意,才能访问运动与健身</string> 

<!-- 健康更新 --> 

<key>NSHealthUpdateUsageDescription</key> 

<string>App需要您的同意,才能访问健康更新 </string> 

<!-- 健康分享 --> 

<key>NSHealthShareUsageDescription</key> 

<string>App需要您的同意,才能访问健康分享</string> 

<!-- 蓝牙 --> 

<key>NSBluetoothPeripheralUsageDescription</key> 

<string>App需要您的同意,才能访问蓝牙</string> 

<!-- 媒体资料库 --> 

<key>NSAppleMusicUsageDescription</key> 

<string>App需要您的同意,才能访问媒体资料库</string>

   

如果不起作用,可以请求后台权限,类似于这样:


   

<key>UIBackgroundModes</key>

  

<!-- 在这里写上你在后台模式下要使用权限对应的key --> 

<string>location</string>

...

</array>

   

或者在Xcode里选中当前的target,选择Capabilities,找到Background Modes,打开它,在里面选择对应权限


后台模式的操作.png

 

3.UIColor的问题

官方文档中说:大多数core开头的图形框架和AVFoundation都提高了对扩展像素和宽色域色彩空间的支持.通过图形堆栈扩展这种方式比以往支持广色域的显示设备更加容易。现在对UIKit扩展可以在sRGB的色彩空间下工作,性能更好,也可以在更广泛的色域来搭配sRGB颜色.如果你的项目中是通过低级别的api自己实现图形处理的,建议使用sRGB,也就是说在项目中使用了RGB转化颜色的建议转换为使用sRGB,在UIColor类中新增了两个api:


- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);

   

4.真彩色的显示

真彩色的显示会根据光感应器来自动的调节达到特定环境下显示与性能的平衡效果,如果需要这个功能的话,可以在info.plist里配置(在Source Code模式下):


   

<key>UIWhitePointAdaptivityStyle</key>

   

它有五种取值,分别是:


   

<string>UIWhitePointAdaptivityStyleStandard</string> // 标准模式

<string>UIWhitePointAdaptivityStyleReading</string> // 阅读模式

<string>UIWhitePointAdaptivityStylePhoto</string> // 图片模式

<string>UIWhitePointAdaptivityStyleVideo</string> // 视频模式

<string>UIWhitePointAdaptivityStyleStandard</string> // 游戏模式

   

也就是说如果你的项目是阅读类的,就选择UIWhitePointAdaptivityStyleReading这个模式,五种模式的显示效果是从上往下递减,也就是说如果你的项目是图片处理类的,你选择的是阅读模式,给选择太好的效果会影响性能.

5.ATS的问题

1.在iOS 9的时候,默认非HTTS的网络是被禁止的,我们可以在info.plist文件中添加NSAppTransportSecurity字典,将NSAllowsArbitraryLoads设置为YES来禁用ATS;
2.从2017年1月1日起,,所有新提交的 app 默认不允许使用NSAllowsArbitraryLoads来绕过ATS的限制,默认情况下你的 app 可以访问加密足够强的(TLS V1.2以上)HTTPS内容;
3.可以选择使用NSExceptionDomains设置白名单的方式对特定的域名开放HTTP内容来通过审核,比如说你的应用集成了第三方的登录分享SDK,可以通过这种方式来做,下面以新浪SDK作为示范(Source Code 模式下):


   

<key>NSAppTransportSecurity</key>

<dict>

 <key>NSExceptionDomains</key>

 <dict>

  <key>sina.cn</key>

  <dict>

   <key>NSThirdPartyExceptionMinimumTLSVersion</key>

   <string>TLSv1.0</string>

   <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

   <false>

   <key>NSIncludesSubdomains</key>

   <true>

  </true></false></dict>

  <key>weibo.cn</key>

  <dict>

   <key>NSThirdPartyExceptionMinimumTLSVersion</key>

   <string>TLSv1.0</string>

   <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

   <false>

   <key>NSIncludesSubdomains</key>

   <true>

  </true></false></dict>

  <key>weibo. com</key>

  <dict>

   <key>NSThirdPartyExceptionMinimumTLSVersion</key>

   <string>TLSv1.0</string>

   <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

   <false>

   <key>NSIncludesSubdomains</key>

   <true>

  </true></false></dict>

  <key>sinaimg.cn</key>

  <dict>

   <key>NSThirdPartyExceptionMinimumTLSVersion</key>

   <string>TLSv1.0</string>

   <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

   <false>

   <key>NSIncludesSubdomains</key>

   <true>

  </true></false></dict>

  <key>sinajs.cn</key>

  <dict>

   <key>NSThirdPartyExceptionMinimumTLSVersion</key>

   <string>TLSv1.0</string>

   <key>NSThirdPartyExceptionRequi    

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程