美文网首页
iOS 13适配

iOS 13适配

作者: Roc_Wu512 | 来源:发表于2019-11-08 16:34 被阅读0次

iOS 13 适配

1. 私有属性KVC

iOS不允许valueForKey、setValue: forKey 获取和设置是有属性,需要使用其他方式修改。如:

[textField setValue:[UIColor red] forKeyPath:@"_placeholderLabel.textColor"];
//替换为
textField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:@"输入" attributes:@{NSForegroundColorAttributeName: [UIColor red]}];
2.DeviceToken获取方式改变
#include <arpa/inet.h>
-(void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    if(![deviceToken isKindOfClass:[NSData class]])return;
    const unsigned *tokenBytes =(const unsigned *)[deviceToken bytes];
    NSString *hexToken =[NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                          ntohl(tokenBytes[0]),ntohl(tokenBytes[1]),ntohl(tokenBytes[2]),
                          ntohl(tokenBytes[3]),ntohl(tokenBytes[4]),ntohl(tokenBytes[5]),
                          ntohl(tokenBytes[6]),ntohl(tokenBytes[7])];
    NSLog(@"deviceToken:%@",hexToken);
}

3.控制器模态跳转默认效果改变,新版默认跳转至新VC不全屏

默认跳转不全屏,修改为全屏效果,跳转前修改新VC的modalPresentationStyle

if(@available(iOS 13.0,*)){
        newVC.modalPresentationStyle = UIModalPresentationFullScreen;
    }
    [oldVC presentViewController:newVC animated:YES completion:nil];
}

4.UIWebView被废弃,尽快使用WKWebView
5. MPMoviePlayerController废弃

解决方案是使用 AVFoundation 里的 AVPlayer。

6.UISegmentedControl 默认样式改变

默认样式变为白底黑字

7.Sign In with Apple

专门使用第三方或社交登录服务的应用程序(如Facebook登录,Google登录,使用Twitter登录,使用LinkedIn登录,使用亚马逊登录或微信登录)来设置或验证用户的主帐户使用该应用程序还必须提供与Apple等同的登录选项,必须在2020年4月之前加入。
用户的主要帐户是他们与您的应用程序建立的帐户,用于识别自己,登录和访问您的功能和相关服务。
如果符合以下条件,则无需使用Apple登录:

  • 您的应用专门使用您公司自己的帐户设置和登录系统。
  • 您的应用是教育,企业或商业应用,需要用户使用现有的教育或企业帐户登录。
  • 您的应用使用政府或行业支持的公民身份识别系统或电子ID来验证用户身份。
  • 您的应用是特定第三方服务的客户,用户需要直接登录其邮件,社交媒体或其他第三方帐户才能访问其内容。
8.即将废弃的 LaunchImage

从 iOS 8 的时候,苹果就引入了 LaunchScreen,我们可以设置 LaunchScreen来作为启动页。当然,现在你还可以使用LaunchImage来设置启动图。不过使用LaunchImage的话,要求我们必须提供各种屏幕尺寸的启动图,来适配各种设备,随着苹果设备尺寸越来越多,这种方式显然不够灵活。而使用 LaunchScreen的话,情况会变的很简单, LaunchScreen是支持AutoLayout+SizeClass的,所以适配各种屏幕都不在话下。 从2020年4月开始,所有使⽤ iOS13 SDK 的 App 将必须提供 LaunchScreen。

9.Dark Mode

系统设置中深色模式下,view的背景色默认为深黑色,影响整个APP,可以修改回默认白色。
1.APP统一修改,在info.plist中强制白色模式

<key>UIUserInterfaceStyle</key>
<string>Light</string>

2.单个view及其子view强制修改默认模式,解除系统深色模式影响

view.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;

3.修改window的默认模式,对整个APP有效,官方不推荐使用,推荐修改info.plist

[UIApplication sharedApplication].keyWindow.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;

H5页面适配,参考链接:

https://blog.csdn.net/u012413955/article/details/92198556

10.Xcode 11 创建的工程在低版本设备上运行黑屏

使用 Xcode 11 创建的工程,运行设备选择 iOS 13.0 以下的设备,运行应用时会出现黑屏。这是因为 Xcode 11 默认是会创建通过 UIScene 管理多个 UIWindow 的应用,工程中除了 AppDelegate 外会多一个 SceneDelegate。这是为了 iPadOS 的多进程准备的,也就是说 UIWindow 不再是 UIApplication 中管理。但是旧版本根本没有 UIScene,因此解决方案就是在 AppDelegate 的头文件加上:

@property (strong, nonatomic) UIWindow *window;
11.使用 @available 导致旧版本 Xcode 编译出错

在 Xcode 11 的 SDK 工程的代码里面使用了 @available 判断当前系统版本,打出来的包放在 Xcode 10 中编译,会出现一下错误:

Undefine symbols for architecture i386:
    "__isPlatformVersionAtLeast", referenced from:
        ...
ld: symbol(s) not found for architecture i386

从错误信息来看,是 __isPlatformVersionAtLeast 方法没有具体的实现,但是工程里根本没有这个方法。实际测试无论在哪里使用@available ,并使用 Xcode 11 打包成动态库或静态库,把打包的库添加到 Xcode 10 中编译都会出现这个错误,因此可以判断是 iOS 13 的 @available 的实现中使用了新的 api。如果你的 SDK 需要适配旧版本的 Xcode,那么需要避开此方法,通过获取系统版本来进行判断:

if ([UIDevice currentDevice].systemVersion.floatValue >= 13.0) {
    ...
}

另外,在 Xcode 10 上打开 SDK 工程也应该可以正常编译,这就需要加上编译宏进行处理:

#ifndef __IPHONE_13_0
#define __IPHONE_13_0 130000
#endif

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_13_0
...
#endif
12.TabBar红点偏移

如果之前有通过TabBar上图片位置来设置红点位置,在iOS13上会发现显示位置都在最左边去了。遍历UITabBarButton的subViews发现只有在TabBar选中状态下才能取到UITabBarSwappableImageView,解决办法是修改为通过UITabBarButton的位置来设置红点的frame。

13.StatusBar 与之前版本不同

之前 Status Bar 有两种状态,default 和 lightContent。
现在 Status Bar 有三种状态,default, darkContent 和 lightContent。
现在的 darkContent 对应之前的 default,现在的 default 会根据情况自动选择 darkContent 和 lightContent。

14.UIActivityIndicatorView

之前的 UIActivityIndicatorView 有三种 style 分别为 whiteLarge, white 和 gray,现在全部废弃。
增加两种 style 分别为 medium 和 large,指示器颜色用 color 属性修改。

15.蓝牙权限需要申请

iOS13以前,使用蓝牙时可以直接用,不会出现权限提示,iOS13后,再使用就会提示了。 在info.plist里增加

<key>NSBluetoothAlwaysUsageDescription</key> 
<string>我们要一直使用您的蓝牙</string>
16.CNCopyCurrentNetworkInfo

iOS13 以后只有开启了 Access WiFi Information capability,才能获取到 SSID 和 BSSID wi-fi or wlan 相关使用变更。获取WiFi SSID的接口CNCopyCurrentNetworkInfo 不再返回SSID的值。可以先获取用户位置权限才能返回SSID。
注意:本身已经打开位置权限,则可以直接获取。

相关文章

网友评论

      本文标题:iOS 13适配

      本文链接:https://www.haomeiwen.com/subject/fosibctx.html