Xcode8下iOS10常见报错闪退,字体适配和编译不过的问题及解决方案
Xcode8下iOS10常见报错、闪退、字体适配和编译不过的问题及解决方案
在使用Xcode8开发iOS10应用时,常常会遇到报错、闪退、字体适配和编译不过的问题。本文将介绍常见的这些问题及其解决方案。
1. 报错和闪退问题
1.1 NSAllowsArbitraryLoads导致的网络请求报错
iOS10引入了新的安全策略,禁止非HTTPS的网络请求,默认情况下,只允许使用HTTPS的网络请求。而之前开发的应用中,如果使用了HTTP的网络请求,就会导致程序无法正常访问网络,甚至造成崩溃。
解决方案:在Info.plist文件中添加NSAppTransportSecurity键,并将其值设置为一个字典类型。在字典中添加NSAllowsArbitraryLoads键值对,将其值设置为YES。注意,NSAllowsArbitraryLoads参数只是临时解决方案,应该尽快将所有的HTTP请求转换为HTTPS请求。
示例:添加NSAppTransportSecurity键及NSAllowsArbitraryLoads键值对,如下:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
1.2 使用新API导致的闪退问题
iOS10引入了许多新的API,但有些API只能在特定的环境下使用。如果在不支持该API的设备上使用,就会导致程序崩溃。
解决方案:使用前先检查该API是否可用,例如使用以下代码:
if (@available(iOS 10, *)) {
//调用iOS10的新API
} else {
//使用旧版本API
}
1.3 应用切换到后台后进入后台模式时导致的闪退问题
如果应用在切换到后台时,没有正确地进入后台模式,就会导致程序在后台运行时崩溃或被系统杀掉。
解决方案:在AppDelegate中添加以下代码:
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
}
2. 字体适配问题
在iOS10中,系统默认使用了一种新的字体San Francisco来代替之前使用的Helvetica Neue,并且对字体的适配策略做了一些更改。
2.1 自适应字体大小的适配问题
在iOS10中,UILabel、UITextField、UITextView等控件默认开启了自适应字体大小的功能,可以根据不同的屏幕尺寸、不同的文本内容来自动调整字号大小,并且避免了使用固定字号时出现的显示不全、字号过大或过小等问题。
解决方案:如果不需要自适应字体大小的功能,可以将对应的控件属性adjustsFontSizeToFitWidth设置为NO,并手动设置合适的字号大小。
示例:设置UILabel控件的字号大小为16(在设置文字之前进行设置):
[label setFont:[UIFont systemFontOfSize:16]];
[label setText:@"Hello, world!"];
2.2 自定义字体文件的适配问题
如果应用中使用了自定义字体文件,并且在iOS10中出现了显示问题,可能是因为iOS10对字体的适配策略做了更改,导致字体文件无法正常显示。
解决方案:在Info.plist文件中添加UIAppFonts键,并将自定义字体文件的名称添加到列表中。另外,可以将字体文件复制到应用程序工程目录下的Resources文件夹中,这样Xcode就能正确地识别并打包这些字体文件。
示例:添加UIAppFonts键及CustomFont.ttf字体文件名称,如下:
<key>UIAppFonts</key>
<array>
<string>CustomFont.ttf</string>
</array>
3. 编译不过问题
3.1 NSNotificationName导致的编译错误
在iOS10中,NSNotification定义了新的常量NSNotificationName,如果在旧版本的Xcode中编译这些代码,会出现编译错误。
解决方案:检查使用NSNotificationName常量的代码,如果是在旧版本的Xcode中,需要将常量替换为字符串。
示例:使用NSNotificationName替代NSNotification中的常量NSNotifications,如下:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:UIKeyboardDidShowNotification object:nil];
3.2 第三方库的编译问题
在Xcode8中,默认使用的Swift版本是Swift3,而许多第三方库仍然使用Swift2.3的版本,如果直接将这些库添加到工程中,就会出现编译不过的问题。
解决方案:将Swift2.3的第三方库升级为Swift3的版本,并更新工程中引用该库的代码。如果第三方库作者没有提供Swift3的版本,可以使用CocoaPods等工具将其转换为Swift3的版本。
示例:升级Alamofire第三方库的Swift版本为Swift3,更新工程中引用该库的代码,如下:
import Alamofire
Alamofire.request("https://httpbin.org/get").responseJSON { response in
debugPrint(response)
}