iOS13适配研究
iOS13今年秋季会发布,最近深入研究了下公司APP适配iOS13的注意点,适配如下。
1.由于Xcode10移除了libstdc++,之前虽然采用拷贝粘贴的方案将Xcode9的相关c++库复制到Xcode10还可以完美运行,但是现在最新的Xcode11对于c++库的引用又发生了改变,虽然libstdc++拷贝粘贴方案对于部分功能起效,但是由于App太多老旧的C++代码,依旧导致项目无法正常编译,所以必须要删除历史遗留的libstdc++和其他老旧的c++的代码,App才能被编译,坑!
2.关于推送deviceToken获取逻辑
目前App推送token是按照以前的老办法来获取:
NSString * hexToken = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; //去掉"<>"
hexToken = [[hexToken description] stringByReplacingOccurrencesOfString:@" " withString:@""];//去掉中间空格
但是网上有部分开发者反馈iOS13上的description方法对应存在缺陷,甚至会闪退,无法准确获取到token。
虽然自测没有复现,但是为了安全考虑换了种大家推崇的获取方式
if (![deviceToken isKindOfClass:[NSData class]]) return;
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];
当然友盟官方也给出了相应的获取方式:
https://developer.umeng.com/docs/66632/detail/126489
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])];
3.基于iOS13一运行APP,发现界面变样了
image.png
原来是Apple官方修改了控制器的 modalPresentationStyle 默认值,以前都是默认UIModalPresentationFullScreen,现在新增了个UIModalPresentationAutomatic,自动把以前默认值修改了。
它影响App所有的present出的界面,所以必须要手动将 modalPresentationStyle一个个设为UIModalPresentationFullScreen,真的坑!
4.App运行过程中,会产生奔溃,仔细定位,发现Apple新增了imageWithTintColor方法 image 与App分类中的自定义的方法名产生冲突了 image 所以需要重新修改方法名进行适配5.注意iOS13新增深色模式,需要适配,但发现很多主流App都没有支持深色模式,如果你公司的App也没有支持深色模式的话,需要在Plist文件中设置——添加"User Interface Style"键,将值设为"UIUserInterfaceStyleLight"
<key>UIUserInterfaceStyle</key>
<string>UIUserInterfaceStyleLight</string>
否则深色模式下,UI展示颜色上会有问题!
其他相关iOS13适配问题:
iOS 13 CoreText performance note 问题适配
以上