因为之前项目中包含大量swift3.0的代码,一直使用xcode10.2没有时间升级,最近swift升级到4.0后,xcode版本也升级到最新的xcode11.2,发现出现一些适配的问题,主要发现以下几类:
视频播放库MPMoviePlayerController废除,导致闪退。
解决办法:视频播放库改为AVKit库下面的AVPlayerViewController。
UITextField私有属性闪退
iOS 13禁止使用kvc修改私有属性,之前一直使用kvc修改UITextField的palceholder,但是iOS13直接崩溃。
[textField setValue:textColor forKeyPath:@"_placeholderLabel.textColor"];
[textField setValue:font forKeyPath:@"_placeholderLabel.font"];
解决方法:设置textField的attributedPlaceholder属性进行设置。
NSAttributedString* attrString = [[NSAttributedString alloc]initWithString:placeholder attributes:@{NSForegroundColorAttributeName:textColor,NSFontAttributeName:font}];
textField.attributedPlaceholder = attrString;
TabBar中选中颜色在页面push后返回颜色变为蓝色
旧代码使用如下:
/**
设置tabbarItem的字体
@param tabBarItem tabbar
*/
- (void)initTitleWithAtrributions:(UITabBarItem*)tabBarItem{
NSDictionary *noramalAtributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor darkGrayColor],NSForegroundColorAttributeName,[UIFont systemFontOfSize:13.0],NSFontAttributeName,
nil];
NSDictionary *selectedAtributes = [NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithHexString:@"#F65757"],NSForegroundColorAttributeName,
[UIFont systemFontOfSize:13.0],NSFontAttributeName,
nil];
[tabBarItem setTitleTextAttributes:noramalAtributes forState:UIControlStateNormal];
[tabBarItem setTitleTextAttributes:selectedAtributes forState:UIControlStateSelected];
//tabBarItem.badgeValue = @"";
[tabBarItem setTitlePositionAdjustment:UIOffsetMake(0.0, 0.0)];
}
解决方法:设置tabBar的tintColor和unselectedItemTintColor来设置。
// iOS 13以上
self.tabBar.tintColor= [UIColor colorWithHexString:@"#F65757"];
self.tabBar.unselectedItemTintColor = [UIColor darkGrayColor];
iOS13新出之后会有收不到推送的问题
因为iOS13的处理方法变了,处理方案代码如下:
//获取DeviceToken成功- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
//Xcode11打的包,iOS13获取Token有变化if([[[UIDevice currentDevice] systemVersion] floatValue] >=13) {
if(![deviceToken isKindOfClass:[NSDataclass]]) {
//记录获取token失败的描述return;
}
constunsigned *tokenBytes = (constunsigned *)[deviceToken bytes];
NSString *strToken = [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(@"deviceToken1:%@", strToken);
return;
} else {
NSString *token = [NSString
stringWithFormat:@"%@",deviceToken];
token = [token stringByReplacingOccurrencesOfString:@"<"withString:@""];
token = [token stringByReplacingOccurrencesOfString:@">"withString:@""];
token = [token stringByReplacingOccurrencesOfString:@""withString:@""];
NSLog(@"deviceToken2 is: %@", token);
}
}
模式视图不能到顶部(没有设置modalPresentationStyle)
在iOS 13之前,模态视图默认都是全屏的,而在iOS13中,默认的样式变成了类iPhone上safari的分页样式。
解决办法:
只需要修改modalPresentationStyle为UIModalPresentationFullScreen。
黑夜模式
目前没有适配深夜模式,避免黑夜模式显示异常,在info.plist上添加UIUserInterfaceStyle,并且设置为Light。
使用CryptLib加密后解密失败
iOS13之前使用都正常,在iOS13加密后的外部同样的加密字符串解密时返回为nil错误的,在https://stackoverflow.com/questions/58098958/aes-encryption-cryptlib-in-ios-13-not-working找到了问题所在及解决方法。跟上面推送的问题类似。
NSString*hash=[out description];
解决方法:
#pragmamark - String Conversion-方法一
-(NSString*)hex:(NSData*)data{
NSData*data=resultData;
const unsigned*dataBytes=[data bytes];
NSUInteger groupNum=data.length/4;
NSString*result=[NSString string];
for(int i=0;i>4;
t1=src[i]&0x0F;
dst[i*2]=48+t0+(t0/10)*39;
dst[i*2+1]=48+t1+(t1/10)*39;
}
return [[NSString alloc]initWithData:result encoding:NSASCIIStringEncoding];
}