iOS开发针对苹果新系统iOS26的兼容适配UITabBarButtonItem & UITabBar的液态玻璃效果/当前wifi ssid获取

1. UITabBarButtonItem液态玻璃效果

        兼容处理:

        第一种方式(不推荐):把所有的UITabBarButtonItem关闭液态玻璃效果:

    if (@available(iOS 26.0, *)) {
        self.navigationItem.rightBarButtonItem.hidesSharedBackground = YES;
        self.navigationItem.leftBarButtonItem.hidesSharedBackground = YES;
    } else {
        // Fallback on earlier versions
    }

        第二种方式:所有导航栏按钮全部采用UITabBarButtonItem,支持液态玻璃效果。

2.  采用UILayoutFittingExpandedSize设置自定义的navigationItem.titleView的内容尺寸,在iOS26上高度偏大,高度变为屏幕的高度,预期是高度应该为导航栏的高度;

原因:在iOS26之前UILayoutFittingExpandedSize最大尺寸限制在导航栏范围内,而在iOS26则允许充斥整个屏幕:

- (CGSize)intrinsicContentSize { return UILayoutFittingExpandedSize; }

        兼容处理:

        修改intrinsicContentSize,指定titleView的尺寸大小为导航栏大小:


#define SCREEN_WIDTH ([[UIScreen mainScreen] respondsToSelector:@selector(nativeBounds)]?[UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale:[UIScreen mainScreen].bounds.size.width)

- (CGSize)intrinsicContentSize { return CGSizeMake(SCREEN_WIDTH, 44); }

3、UITabBarController调用self.setValue(yourTabBar, forKey: "tabBar")自定义tabBar失效

        原因:iOS 26 之后对 UITabBarController 的 KVC 注入限制,导致无效,但不会crash

        兼容处理:

        方案1:使用兼容模式显示传统UI风格,也就是取消TabBar液态玻璃效果:

        打开info.plist,添加一个Boolean键值对,取消液态玻璃效果,添加完成后重新运行,UITabBar恢复旧的样式:

<key>UIDesignRequiresCompatibility</key>
<true/>

        方案2:改为使用系统的UITabBarItem组件,能够支持新系统的液态玻璃效果

4、创建一个由URL标识的代表任何资源的assert对象时报错:

AVAssetExportSessionStatusFailed: 
Error Domain=AVFoundationErrorDomain Code=-11800 "这项操作无法完成" 
UserInfo={
    NSUnderlyingError=0x1586626a0 {
        Error Domain=NSOSStatusErrorDomain Code=-16979 "(null)"
    }, NSLocalizedFailureReason=发生未知错误(-16979),        
    NSURL=file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV, NSLocalizedDescription=这项操作无法完成
}

        原因:AVAssetExportSession -11800 / -16979 转码失败,权限不足、文件不可读,创建一个由URL标识的代表任何资源的assert对象时,传入的originFilePath示例: file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV,没有读的权限,因为iOS 26对相册视频读取权限收紧,代码示例:

//originFilePath示例: file:///var/mobile/Media/DCIM/100APPLE/IMG_0426.MOV
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:originFilePath options:nil];

        兼容处理:先将相册的视频拷贝到 App 沙盒临时目录,然后再去创建资源对象AVURLAsset


[self copyVideoToSandbox:originFilePath completion:^(NSURL *localUrl) {
    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:localUrl options:nil];
}];

- (void)copyVideoToSandbox:(NSURL *)originUrl completion:(void (^)(NSURL *localUrl))completion {

    NSString *temp = [NSTemporaryDirectory() stringByAppendingPathComponent:@"tempVideo.mov"];
    NSURL *localUrl = [NSURL fileURLWithPath:temp];

    NSFileManager *fm = [NSFileManager defaultManager];
    if ([fm fileExistsAtPath:temp]) {
        [fm removeItemAtPath:temp error:nil];
    }

    NSError *err = nil;
    BOOL ok = [fm copyItemAtURL:originUrl toURL:localUrl error:&err];
    if (!ok || err) {
        NSLog(@"拷贝失败: %@", err);
        completion(nil);
        return;
    }
    completion(localUrl);
}

5. 通过CNCopySupportedInterfaces获取wifi ssid的方式已失效:


    class func getWifiSSID() -> String? {
        var wifiName: String = ""
        let wifiInterfaces = CNCopySupportedInterfaces()
        if wifiInterfaces != nil {
            let interfaceArr = CFBridgingRetain(wifiInterfaces) as! [String]
            if interfaceArr.count > 0 {
                let interfaceName = interfaceArr[0] as CFString
                let ussafeInterfaceData = CNCopyCurrentNetworkInfo(interfaceName)
                if ussafeInterfaceData != nil {
                    let interfaceData = ussafeInterfaceData as! [String: Any]
                    wifiName = interfaceData["SSID"] as? String ?? ""
                } else {
                    return nil
                }
            }
        }
        
        return wifiName
    }

        原因:iOS26不再推荐使用CNCopySupportedInterfaces,在iOS26将返回空值

        兼容处理:Capabilities添加Access WiFi Information权限;通过CLLocationManager确保有定位权限,然后使用NEHotspotNetwork获取wifi ssid:

NEHotspotNetwork.fetchCurrent { curNetwork in
    block(curNetwork?.ssid ?? "")
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值