美文网首页
iOS 13适配

iOS 13适配

作者: iOS苦逼开发 | 来源:发表于2019-10-10 15:28 被阅读0次

    1.深夜模式(之后适配了再更新)

    如果不想适配深夜模式,在info.plist上添加UIUserInterfaceStyle,并且设置为Light即可

    2.蓝牙权限

    使用到蓝牙,需要在info.plist上声明蓝牙权限使用,之前是只需要添加NSBluetoothPeripheralUsageDescription,iOS13之后需要添加NSBluetoothAlwaysUsageDescription

    3.获取Wi-Fi名

    iOS 12之前:

    id info = nil;
        NSArray *ifs = (__bridge_transfer id)CNCopySupportedInterfaces();
        for (NSString *ifnam in ifs) {
            info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
            NSString *str = info[@"SSID"];//name
            
        }
    

    iOS 12之后以上方法获取不到,需要在Xcode中TARGET-->Capabilities打开Access WiFi Information选项


    1A9BB7FD-1FC9-4EBA-BD0A-7438F3F86624.png

    iOS 13之后以上方法获取Wi-Fi名返回的都是固定值"WLAN",这里可能是因为苹果保护用户隐私而产生的问题,因为通过wifi信息可以定位到用户地理位置。所以iOS13以后如果想要继续获取WiFi名称,需要在调用接口前判断用户是否同意App使用地理位置信息。可以在程序一启动时请求用户权限,调用的方法如下:

    #import <CoreLocation/CoreLocation.h>
    
    @property (strong, nonatomic) CLLocationManager *locationManager;
    
    NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];
    CGFloat version = [phoneVersion floatValue];
    // 如果是iOS13 未开启地理位置权限 需要提示一下
    if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined && version >= 13) {
        self.locationManager = [[CLLocationManager alloc] init];
        [self.locationManager requestWhenInUseAuthorization];
    }
    

    如果用户拒绝了授权,在需要获取Wi-Fi名的界面加上提示:

        NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];
        CGFloat version = [phoneVersion floatValue];
        //如果开启地理位置权限未开启 需要提示一下
        if (([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusRestricted || [CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied  )&& version >= 13) {
            [PracticalTools showAlertViewWithTitle:@"提示" message:@"您的位置权限尚未授权,将无法获取当前Wi-Fi进行配置网络,请前往“设置”-“****App”-“位置”进行授权!" doneText:@"确定" cancelText:nil doneHandle:nil cancelHandle:nil vc:self];
        }
    

    4.Tabbar字体选中颜色在push后返回时被修改成系统蓝色

    iOS13之前使用的是

    + (void)load{
        UITabBarItem * item = [UITabBarItem appearance];
        
        NSMutableDictionary *dictSel = [[NSMutableDictionary alloc]init];
        
        dictSel[NSForegroundColorAttributeName] = [UIColor colorWithHexString:@"f76710"];
            
        [item setTitleTextAttributes:dictSel forState:UIControlStateSelected];
        
        NSMutableDictionary *dictNor = [[NSMutableDictionary alloc]init];
        
        dictNor[NSFontAttributeName] = [UIFont systemFontOfSize:11];
        
        dictNor[NSForegroundColorAttributeName] = [UIColor colorWithHexString:@"909090"];
        
        [item setTitleTextAttributes:dictNor forState:UIControlStateNormal];
            
    }
    

    这方法在iOS13界面初始化的时候是可以的,但是当界面push之后,返回来时会被修改成系统的默认蓝色,iOS13修改成即可:

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self prepareSubChildVC];
        self.delegate = self;
        if (@available(iOS 13.0,*)) {
              self.tabBar.tintColor = [UIColor colorWithHexString:@"f76710"];//选中颜色
    //        全局默认颜色
    //        [[UITabBar appearance] setUnselectedItemTintColor:[UIColor colorWithHexString:@"f76710"]]; 
        }
    }
    

    5.UITextField使用kvc修改placeholder字体大小颜色crash

    iOS 13禁止使用kvc修改私有属性,之前一直使用kvc修改UITextField的palceholder,但是iOS13直接崩溃

    //iOS13禁止使用kvc修改
    + (void)setDifferentFontForPlaceholderInTextField:(UITextField *)textField withFont:(UIFont *)font andColor:(UIColor *)textColor{
        if ([UIDevice currentDevice].systemVersion.floatValue < 13.0) {
            [textField setValue:textColor forKeyPath:@"_placeholderLabel.textColor"];
            [textField setValue:font forKeyPath:@"_placeholderLabel.font"];
        }
    }
    

    修改为:

    + (void)setDifferentFontForPlaceholderInTextField:(UITextField *)textField withFont:(UIFont *)font andColor:(UIColor *)textColor andPlaceholderText:(NSString *)placeholder{
        NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:placeholder attributes:@{NSForegroundColorAttributeName:textColor,NSFontAttributeName:font}];
        textField.attributedPlaceholder = attrString;
    }
    

    6.UISearchBar删除黑线crash

    iOS 13之前都是遍历后移除UISearchBarBackground,但是iOS13之后会导致渲染失败而崩溃,解决方法是修改UISearchBarBackground.layer.contents为nil

    + (void)searchBarDeleteBackgroundLine:(UISearchBar*)searchBar{
        for (UIView *obj in [searchBar subviews]) {
            for (UIView *objs in [obj subviews]) {
                if ([objs isKindOfClass:NSClassFromString(@"UISearchBarBackground")]){
                    if (@available(iOS 13.0,*)) {
                        objs.backgroundColor = [UIColor whiteColor];
                        objs.layer.contents = nil;
                    }else{
                        [objs removeFromSuperview];
                    }
                }
            }
            if ([obj isKindOfClass:NSClassFromString(@"UISearchBarBackground")]){
                if (@available(iOS 13.0,*)) {
                    obj.backgroundColor = [UIColor whiteColor];
                    obj.layer.contents = nil;
                }else{
                    [obj removeFromSuperview];
                }
            }
        }
    }
    

    7.模态视图变成分页形式

    在iOS 13之前,模态视图默认都是全屏的,而在iOS13中,默认的样式变成了类iPhone上safari的分页样式,只需要修改modalPresentationStyle为UIModalPresentationFullScreen即可

    LoginVC *vc = [[LoginVC alloc]init];
    vc.delegate = self;
    vc.view.backgroundColor = [UIColor whiteColor];
    MainNavigationController *navVC = [[MainNavigationController alloc]initWithRootViewController:vc];
    navVC.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:navVC animated:YES completion:nil];
    

    8.使用CryptLib加密失败

    iOS13之前使用都正常,在iOS13加密后的字符串是错误的,在https://stackoverflow.com/questions/58098958/aes-encryption-cryptlib-in-ios-13-not-working找到了问题所在及解决方法
    错误地方:

    NSString *hash = [out description];
    

    解决方法:

    /**
     * This function computes the SHA256 hash of input string
     * @param key input text whose SHA256 hash has to be computed
     * @param length length of the text to be returned
     * @return returns SHA256 hash of input text
     */
    - (NSString*) sha256:(NSString *)key length:(NSInteger) length{
        const char *s=[key cStringUsingEncoding:NSASCIIStringEncoding];
        NSData *keyData=[NSData dataWithBytes:s length:strlen(s)];
        
        uint8_t digest[CC_SHA256_DIGEST_LENGTH]={0};
        CC_SHA256(keyData.bytes, (CC_LONG)keyData.length, digest);
        NSData *out=[NSData dataWithBytes:digest length:CC_SHA256_DIGEST_LENGTH];
    //    NSString *hash=[out description];//iOS13 Error
        NSString *hash = [self hex:out];
        hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
        hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
        hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
        
        if(length > [hash length])
        {
            return  hash;
        }
        else
        {
            return [hash substringToIndex:length];
        }
    }
    
    #pragma mark - String Conversion
    -(NSString*)hex:(NSData*)data{
         NSMutableData *result = [NSMutableData dataWithLength:2*data.length];
         unsigned const char* src = data.bytes;
         unsigned char* dst = result.mutableBytes;
         unsigned char t0, t1;
    
         for (int i = 0; i < data.length; i ++ ) {
              t0 = src[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];
    }
    
    

    相关文章

      网友评论

          本文标题:iOS 13适配

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