iOS 13適配

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",這里可能是因為蘋果保護用戶隱私而產(chǎn)生的問題,因為通過wifi信息可以定位到用戶地理位置。所以iOS13以后如果想要繼續(xù)獲取WiFi名稱,需要在調(diào)用接口前判斷用戶是否同意App使用地理位置信息??梢栽诔绦蛞粏訒r請求用戶權限,調(diào)用的方法如下:

#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進行配置網(wǎng)絡,請前往“設置”-“****App”-“位置”進行授權!" doneText:@"確定" cancelText:nil doneHandle:nil cancelHandle:nil vc:self];
    }

4.Tabbar字體選中顏色在push后返回時被修改成系統(tǒng)藍色

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之后,返回來時會被修改成系統(tǒng)的默認藍色,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.模態(tài)視圖變成分頁形式

在iOS 13之前,模態(tài)視圖默認都是全屏的,而在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];
}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容