iOS10适配问题,很全的 ^_^

搜集了网上的资料,再整理了一下


1、TencentOpenAPI的坑

表现:启动就crash

原因:由于很久没有更新该sdk了,用的版本是2.3.1。后来想着去官网下个最新的吧,不过最新的是3.0的版本,替换原来的sdk后,有些接口和头文件定义的问题,直接编译不过。为了少踩点坑,还是选择了其他项目已经在用的2.8版本。该版本可以直接替换,在iOS10上顺利解决。

2、私有权限申请的坑

表现:Xcode8编译的版本,首次打开相机、相册、获取通讯录、录视频...统统crash

原因:由于iOS10对Security and Privacy Enhancements 安全和保密性增强,在申请很多私有权限时,都需要添加描述,不添加会crash。但使用之前的Xcode编译的话,仍然会采用系统的权限通知框。

填这个坑,只需在Info.list里配置上请求权限的描述信息就可以了。

我在Info.list添加了程序中用到的权限,就解决了。

示例图

这里列出相关的key,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
NSBluetoothPeripheralUsageDescription
NSCalendarsUsageDescription
NSCameraUsageDescription
NSContactsUsageDescription
NSHealthShareUsageDescription
NSHealthUpdateUsageDescription
NSHomeKitUsageDescription
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
NSMicrophoneUsageDescription
NSMotionUsageDescription
NSPhotoLibraryUsageDescription
NSRemindersUsageDescription
NSSiriUsageDescription
NSSpeechRecognitionUsageDescription
NSVideoSubscriberAccountUsageDescription
NSVoIPUsageDescription

直接在plist文件里面输入:

<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>



注意:网上有很多把这些放在一个 information property List的dictionary里面,这个在首次运行的时候,是没办法识别的,还是会崩溃,已亲测.

3、statusBar不见了

表现:statusBar会消失掉或颜色没有改变

原因:找到原因是,程序经常会在全屏浏览的时候隐藏掉statusBar,相信很多应用都用到这个功能,当退出是使用以下方法还原:

[[UIApplication sharedApplication] setStatusBarStyle:_previousStatusBarStyle animated:animated];

不过该方法使用寿命就到iOS9了,iOS10彻底不能用了。要想以后iOS10也能保持statusBar的正确显示,就按下图接口备注的来改吧。估计改动会比较多,那又有什么办法呢,苹果爸爸就给你指定好规则了,你就老实的跟着走吧。

4、Xcode8打包,ios7安装后调用[UIImage imageNamed:]奔溃

表现:堆栈信息如下:

原因:使用xcassets管理图片,拿掉xcassets后正常。这个是针对iOS7的,别的同事遇到,因为我暂时没有iOS7的设备,没有验证,大家遇到了可以参考。

5、从App中直接跳转到特定的设置项失效或审核不过

表现:之前使用prefs:root=xxxx,"xxxx"可以是Photos,WIFI等这些具体的设置项,在升级到iOS10后发现失效。

原因:其实这种设置方式并没有在任何苹果的官方文档里出现,只是之前很多人这么使用了,而且顺利提交AppStore了。之前就有应用使用过多这种方式,被拒了,苹果给出的理由是使用了私有接口。在iOS10时发现,我们之前也使用了这种方式跳转到相册权限设置,原本通过的功能失效了,可能在iOS10中出于安全性的考虑,这些系统的scheme被修改或禁用了。

解决方法:iOS8以后可以跳转到系统的“设置”页面。

?
1
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

不过iOS10这个openURL的API也有所调整,应使用下面的方法

?
1
- ( void )openURL:(NSURL*)url options:(NSDictionary<NSString *, id> *)options completionHandler:( void (^ __nullable)(BOOL success))completion NS_AVAILABLE_IOS(10_0) NS_EXTENSION_UNAVAILABLE_IOS( "" );

6、字体的变化,导致中文显示宽度变大,英文没有影响。

表现:固定宽度的按钮,变...了,显示不全。

原因:iOS10的字体变化了

解决方法:一个个修改控件的吧,还没想到好方法。


7.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);


8.真色彩显示

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

<key>UIWhitePointAdaptivityStyle</key>

它有五种取值,分别是:

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

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

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

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

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

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



9. A TS 问题

 第一种:(关闭安全保障)

---iOS 9的时候,默认非HTTS的网络是被禁止的,我们可以在info.plist文件中添加NSAppTransportSecurity字典,将NSAllowsArbitraryLoads设置为YES来禁用ATS;

这个是关闭了安全保障,

第二种:(添加例外)
---201711日起,,所有新提交的 app默认不允许使用NSAllowsArbitraryLoads来绕过ATS的限制,默认情况下你的 app可以访问加密足够强的(TLS V1.2以上)HTTPS内容;
---可以选择使用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/>

   </dict>

   <key>weibo.cn</key>

   <dict>

    <key>NSThirdPartyExceptionMinimumTLSVersion</key>

    <string>TLSv1.0</string>

    <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

    <false/>

    <key>NSIncludesSubdomains</key>

    <true/>

   </dict>

   <key>weibo. com</key>

   <dict>

    <key>NSThirdPartyExceptionMinimumTLSVersion</key>

    <string>TLSv1.0</string>

    <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

    <false/>

    <key>NSIncludesSubdomains</key>

    <true/>

   </dict>

   <key>sinaimg.cn</key>

   <dict>

    <key>NSThirdPartyExceptionMinimumTLSVersion</key>

    <string>TLSv1.0</string>

    <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

    <false/>

    <key>NSIncludesSubdomains</key>

    <true/>

   </dict>

   <key>sinajs.cn</key>

   <dict>

    <key>NSThirdPartyExceptionMinimumTLSVersion</key>

    <string>TLSv1.0</string>

    <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

    <false/>

    <key>NSIncludesSubdomains</key>

    <true/>

   </dict>

   <key>sina.com.cn</key>

   <dict>

    <key>NSThirdPartyExceptionMinimumTLSVersion</key>

    <string>TLSv1.0</string>

    <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

    <false/>

    <key>NSIncludesSubdomains</key>

    <true/>

   </dict>

  </dict>

 </dict>

---iOS 10 info.plist文件新加入了NSAllowsArbitraryLoadsInWebContent键,允许任意web页面加载,同时苹果会用 ATS来保护你的app;
---安全传输不再支持SSLv3, 建议尽快停用SHA13DES算法;

10、UIStatusBar

原来setStatusBarStyle不能用了,现在可以通过属性来设置

@property(nonatomic,readonly)UIStatusBarStyle preferredStatusBarStyle 

@property(nonatomic,readonly)BOOL prefersStatusBarHidden 

-(BOOL)prefersStatusBarHidden

-(UIStatusBarAnimation)preferredStatusBarUpdateAnimation

11、UITextField

iOS 10 中,UITextField新增了textContentType字段,是UITextContentType类型,它是一个枚举,作用是可以指定输入框的类型,以便系统可以分析出用户的语义.是电话类型就建议一些电话,是地址类型就建议一些地址.可以在#import <UIKit/UITextInputTraits.h>文件中,查看textContentType字段,有以下可以选择的类型:

 UITextContentTypeName

 UITextContentTypeNamePrefix

 UITextContentTypeGivenName

 UITextContentTypeMiddleName

 UITextContentTypeFamilyName

 UITextContentTypeNameSuffix

 UITextContentTypeNickname

 UITextContentTypeJobTitle

 UITextContentTypeOrganizationName

 UITextContentTypeLocation

 UITextContentTypeFullStreetAddress

 UITextContentTypeStreetAddressLine1

 UITextContentTypeStreetAddressLine2

 UITextContentTypeAddressCity

 UITextContentTypeAddressState

 UITextContentTypeAddressCityAndState

 UITextContentTypeSublocality

 UITextContentTypeCountryName

 UITextContentTypePostalCode

 UITextContentTypeTelephoneNumber

 UITextContentTypeEmailAddress

 UITextContentTypeURL

 UITextContentTypeCreditCardNumber

12、对UICollectionView进行了优化

UICollectionView进行了优化,并新增加了预加载的UICollectionViewDataSourcePrefetching代理协议及代理方法

-(void)collectionView:(UICollectionView*)collectionView prefetchItemsAtIndexPaths:(NSArray*)indexPaths

-(void)collectionView:(UICollectionView*)collectionView cancelPrefetchingForItemsAtIndexPaths:(NSArray*)indexPaths

注意:这两个代理方法并不能代替之前读取数据的方法,仅仅是辅助加载数据在iOS 10 之前,UICollectionView上面如果有大量cell,当用户活动很快的时候,整个UICollectionView的卡顿会很明显,为什么会造成这样的问题,这里涉及到了iOS系统的重用机制,当cell准备加载进屏幕的时候,整个cell都已经加载完成,等待在屏幕外面了,也就是整整一行cell都已经加载完毕,这就是造成卡顿的主要原因,专业术语叫做:掉帧.要想让用户感觉不到卡顿,我们的app必须帧率达到60/秒,也就是说每帧16毫秒要刷新一次.

iOS 10 之前UICollectionViewCell的生命周期是这样的:

  • 1.用户滑动屏幕,屏幕外有一个cell准备加载进来,把cellreusr队列拿出来,然后调用prepareForReuse方法,在这个方法里面,可以重置cell的状态,加载新的数据;
  • 2.继续滑动,就会调用cellForItemAtIndexPath方法,在这个方法里面给cell赋值模型,然后返回给系统;
  • 3.cell马上进去屏幕的时候,就会调用willDisplayCell方法,在这个方法里面我们还可以修改cell,为进入屏幕做最后的准备工作;
  • 4.执行完willDisplayCell方法后,cell就进去屏幕了.cell完全离开屏幕以后,会调用didEndDisplayingCell方法.

iOS 10 UICollectionViewCell的生命周期是这样的:

  • 1.用户滑动屏幕,屏幕外有一个cell准备加载进来,把cellreusr队列拿出来,然后调用prepareForReuse方法,在这里当cell还没有进去屏幕的时候,就已经提前调用这个方法了,对比之前的区别是之前是cell的上边缘马上进去屏幕的时候就会调用该方法,而iOS 10 提前到cell还在屏幕外面的时候就调用;
  • 2.cellForItemAtIndexPath中创建cell,填充数据,刷新状态等操作,相比于之前也提前了;
  • 3.用户继续滑动的话,当cell马上就需要显示的时候我们再调用willDisplayCell方法,原则就是:何时需要显示,何时再去调用willDisplayCell方法;
  • 4.cell完全离开屏幕以后,会调用didEndDisplayingCell方法,跟之前一样,cell会进入重用队列.
    iOS 10 之前,cell只能从重用队列里面取出,再走一遍生命周期,并调用cellForItemAtIndexPath创建或者生成一个cell.
    iOS 10 中,系统会cell保存一段时间,也就是说当用户把cell滑出屏幕以后,如果又滑动回来,cell不用再走一遍生命周期了,只需要调用willDisplayCell方法就可以重新出现在屏幕中了.
    iOS 10 
    中,系统是一个一个加载cell的,二以前是一行一行加载的,这样就可以提升很多性能;

13、UIRefreshControl

iOS 10 中, UIRefreshControl可以直接在UICollectionViewUITableView中使用,并且脱离了UITableViewController.现在RefreshControlUIScrollView的一个属性.
使用方法:

UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

[refreshControl addTarget:self action:@selector(loadData) forControlEvents:UIControlEventValueChanged];

collectionView.refreshControl = refreshControl;

 14UserNotifications(用户通知)

iOS 10 中将通知相关的 API 都统一了,在此基础上很多用户定义的通知,并且可以捕捉到各个通知状态的回调.以前通知的概念是:大家想接受的提前做好准备,然后一下全两分发,没收到也不管了,也不关心发送者,现在的用户通知做成了类似于网络请求,先发一个request得到response的流程,还封装了error,可以在各个状态的方法中做一些额外的操作,并且能获得一些字段,比如发送者之类的.这个功能的头文件是:#import <UserNotifications/UserNotifications.h>



猜你喜欢

转载自blog.csdn.net/klong27/article/details/71439322