iOS 13 适配小记

本文仅为记录个人适配iOS13的历程

1、第一步先升级所有第三方库 **

先到cd到项目文件夹下,pod setup。
执行完毕对Podfile里的SDK进行挨个search,查看当前最新版本。
pod search xxxx 找到当前最新版本并修改版本号。
确保有可能会受13影响的库都升级到最新之后 pod install。

2、处理升级各SDK之后的报错 **

比如升级AFNetworking到4.0之后,所有请求发送处新加了便于客户配置请求头的header参数,若无特殊配置直接传空字典就是。幸好给发送请求的方法又套了一层,否则得改死我。。。

/**
 Creates and runs an `NSURLSessionDataTask` with a `POST` request.
 
 @param URLString The URL string used to create the request URL.
 @param parameters The parameters to be encoded according to the client request serializer.
 @param headers The headers appended to the default headers for this request.
 @param uploadProgress A block object to be executed when the upload progress is updated. Note this block is called on the session queue, not the main queue.
 @param success A block object to be executed when the task finishes successfully. This block has no return value and takes two arguments: the data task, and the response object created by the client response serializer.
 @param failure A block object to be executed when the task finishes unsuccessfully, or that finishes successfully, but encountered an error while parsing the response data. This block has no return value and takes a two arguments: the data task and the error describing the network or parsing error that occurred.
 
 @see -dataTaskWithRequest:uploadProgress:downloadProgress:completionHandler:
 */
- (nullable NSURLSessionDataTask *)POST:(NSString *)URLString
                             parameters:(nullable id)parameters
                                headers:(nullable NSDictionary <NSString *, NSString *> *)headers
                               progress:(nullable void (^)(NSProgress *uploadProgress))uploadProgress
                                success:(nullable void (^)(NSURLSessionDataTask *task, id _Nullable responseObject))success
                                failure:(nullable void (^)(NSURLSessionDataTask * _Nullable task, NSError *error))failure;

再有,有些项目会有用到 Application Extension;比如显示多媒体通知的notification extension。会默认也配置到主项目里边去,此时就会飘红了,需要去主项目的 “Pods-项目名.debug.xcconfig”“Pods-项目名.debug.release”删掉对GTExtensionSDK的配置。


用到的个推的一个SDK
3、运行起来之后,各个页面点点,改掉13下的各种崩溃 **

发现了大概三处崩溃吧,其中两处是之前各文章中都提到过的KVC了私有属性;如:对searchBar修改,UITextField修改placeholdercolor等。

另外一处是notification发通知更改UI的代码没有getmainqueue导致,添加获取主线程之后再进行更新UI,解决。

- (void)updateSendProgres:(NSNotification *)notice{
        NSInteger progress = [notice.object[K_SEND_PROGRESS] integerValue];
        dispatch_async(dispatch_get_main_queue(), ^{
            if (progress >= 100) {
                self.maskV.progressL.text = @"1%";
            }else{
                self.maskV.progressL.text = [[NSString stringWithFormat:@"%ld",progress] stringByAppendingString:@"%"];
            }
        });
}

11下的xcode编译运行到13以下的设备执行该段代码并无异常,不知道是13后要求更严了还是13后通知的事件响应线程发生了变化。。。
这块有待深入探索

4、modalPresentationStyle 默认值的改变 **

由原来的默认0 改成了UIModalPresentationAutomatic,虽然效果不错,但是13以下的怎么办呢🤣。只好挨处在present之前修改要present的VC的modalPresentationStyle。
另外,UIModalPresentationAutomatic下,该VC的生命周期也将收到影响。

5、UIWebview的废弃 **

对我没啥影响,起项目初就是封装的WKWebView😄。

6、暗黑模式 **

个人感觉就是再配一套icon,动态获取下颜色;具体操作看原本项目里的封装和规范吧。
我的icon基本都在asset里,相对简单,找到对应的imageset修改Appearances为”Any,Dark“放进去就好。


快捷键:cmd+option+4

颜色这块儿,我目前项目里就会很尴尬了;设计中极其相似的蓝都非得俩色号、、、最后决定先放弃适配dark mode。

直接配置项目不适配dark,
info.plist里添加键值对User Interface Style 值设置为 Light。也可代码关闭:

if(@available(iOS 13.0,*)){
    self.window.overrideUserInterfaceStyle = UIUserInterfaceStyleLight;
}
7、改用LaunchScreen.storyboard **

老项目嘛,肯定删掉了的;如今就是创建个SB,拖个UIImageView,约束一下,视当前项目启动图样式决定图片的填充模式就行了。
值得一提的是记得☑️use as Launch Screen


设置LaunchScreen
8、deviceToken的格式 **
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    NSString *token;
    BOOL bSucc;
    [[RCIMClient sharedRCIMClient] setDeviceTokenData:deviceToken];
    if (@available(iOS 13.0, *)){
        bSucc = [GeTuiSdk registerDeviceTokenData:deviceToken];

        NSMutableString *deviceTokenString = [NSMutableString string];
        const char *bytes = deviceToken.bytes;
        NSInteger count = deviceToken.length;
        for (int i = 0; i < count; i++) {
            [deviceTokenString appendFormat:@"%02x", bytes[i]&0x000000FF];
        }
        token = [deviceTokenString mutableCopy];
    }else{
        token = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
        token = [token stringByReplacingOccurrencesOfString:@" " withString:@""];
        bSucc = [GeTuiSdk registerDeviceToken:token];
    }

当然,各SDK的新版本也已经进行了处理,例如我用到的个推和融云。

提到这俩SDK, 还特么闹了个笑话:
我去质问这两家的技术支持为什么升级之后用以上方法设置了deviceToken之后,所有设备都收不到远程推送了?
搞半天是我的P12过期了、、、
主要是因为最初去apple developer看的证书还一个多月到期,但是不知为何挂人官网的p12早在7天前就过期了。

9、keywindow的获取和状态栏的隐藏 **
@property(nullable, nonatomic,readonly) UIWindow *keyWindow API_DEPRECATED("Should not be used for applications that support multiple scenes as it returns a key window across all connected scenes", ios(2.0, 13.0));
@property(nonatomic,readonly) NSArray<__kindof UIWindow *>  *windows;

大体意思就是往日的keywindow属性无法满足多窗口时使用。
13后可以用windows数组取其0元素获取,但是我当前APP不适配pad,我也就暂时没去管它。
大概可以这么干:

#define KEYWINDOW [[UIApplication sharedApplication] keyWindow]

//#if (__IPHONE_13_0)
//#define KEYWINDOW [UIApplication sharedApplication].windows[0]
//#elif (__IPHONE_9_0)
//#define KEYWINDOW [[UIApplication sharedApplication] keyWindow]
//#endif

关于隐藏状态栏,之前我设keywindow的level为最大使其在statusBar之上的办法,在13完全失效。。。

UIWindow *window = [UIApplication sharedApplication].keyWindow;
window.windowLevel = UIWindowLevelStatusBar+10.0f;

由于此处是在一个小工具类里用到,暂时还没想到什么办法可以解决😭。
哪位仁兄解决了view里隐藏状态栏的话,还请不吝赐教!!!
🍻我先干为敬了~~🍺🍺🍺

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • iOS 13 如期而至,适配工作可以开展起来啦。在适配 iOS 13 过程中,遇到了如下一些问题。 1. UITe...
    前行哲阅读 20,197评论 48 136
  • iOS 13 支持适配的机型 iPhone X、iPhone XR、iPhone XS、iPhone XS Max...
    sunnyxg0812阅读 1,557评论 2 2
  • 技术参考: apple login IOS13适配-详细 iOS 13 适配(持续更新中) iOS13适配 掘金 ...
    nuannuan_nuan阅读 1,035评论 0 1
  • 1、前言 针对 iOS 13,苹果做了非常大的调整,其中 Dark 模式是最新的 UI 层面可见的改变,而针对iP...
    iHTCboy阅读 1,931评论 0 3
  • 2020.4.14,今天是我在千锋“逆战”学习第98天。 有志者事竟成! 今天我学习了mongodb的使用,以及m...
    量子力学量力学阅读 155评论 0 0