iOS12适配及兼容问题解决

栏目: IOS · 发布时间: 6年前

内容简介:1、Multiple commands produce 'xxx/Info.plist'2、3、

1、Multiple commands produce 'xxx/Info.plist'

2、 iOS 12 系统 WiFi 获取 SSID (wifi名称)和 BSSID (mac地址)失败

3、 Xcode 10#import 的时候闪退或导入头文件不提示

4、[ Xcode 10 ] library not found for -lstdc++.6.0.9

5、[ iOS 12.1 ] 二级页面返回时 tabbar 图标和文字位置偏移

6、 webView 播放视频返回后状态栏消失

7、[ iPhone X ] StatusBar 内部结构改变导致 crash

文章来自于我的简书:原文在这里

  • 1、Multiple commands produce 'xxx/Info.plist'

    升级 Xcode 10 之后,编译之前的项目,发生编译错误: Multiple commands produce 'xxx/Info.plist' ,项目中存在重复命名的info.plist文件。

    解决方案:

    (I)标准方案:删除所有重复命名的文件。

    (II)临时方案:

    xcworkspace 项目:Xcode菜单栏 File -> Workspace Settings -> Build System -> Legacy Build System

    xcodeprj 项目:Xcode菜单栏 File -> Project Settings -> Build System -> Legacy Build System

  • 2、 iOS 12 系统 WiFi 获取 SSID (wifi名称)和 BSSID (mac地址)失败

    iOS 12 系统之后,苹果提升了获取 WiFi 名称和 mac 地址的权限控制,要获取这些信息,需要手动为应用打开获取WiFi信息的权限。具体操作可以参考《 获取iOS设备WiFi名字和mac地址+iOS12系统获取失败解决 》。

    解决方案:

    在开发者账号中,勾选项目的 App IDAccess WiFi Infomation 选项;

    在Xcode的 Capabilities 中,勾选项目的 Access WiFi Infomation 选项。

  • 3、 Xcode 10#import 的时候闪退或导入头文件不提示

    Xcode 10 中出现输入 #import 引入文件/类库头文件的时候 Xcode 闪退。或者输入 #import 导入头文件时不提示。

    解决方案:

    xcworkspace 项目:Xcode菜单栏 File -> Workspace Settings -> Build System -> Legacy Build System

    xcodeprj 项目:Xcode菜单栏 File -> Project Settings -> Build System -> Legacy Build System

  • 4、[ Xcode 10 ] library not found for -lstdc++.6.0.9

    苹果在 Xcode 10iOS 12 中移除了 libstdc++ 库,由 libc++ 这个库取而代之,苹果的解释是libstdc++已经标记为废弃有5年了,建议大家使用经过了llvm优化过并且全面支持C++11的libc++库。所以Xcode 10中libstdc++相关的3个库( libstdc++libstdc++.6libstdc++6.0.9 )都已被移除,不可再使用。

    解决方案:

    (I)调整代码为依赖 libc++

    更改c++库文件, TARGETS -> Build Phases -> Link Binary With Libraries ,删除 stdc++.6.0.9 依赖,添加 libc++.tdbTARGETS -> Build Settings -> Other Linker Flags ,删除 -l "stdc++.6.0.9" 。修改代码为依赖 libc++

    (II)从 Xcode 9 中导入 libstdc++Xcode 10 中。

    找到 Xcode 9 中的 libstdc++ 库文件copy到 Xcode 10lib 文件夹下。参考路径方法如下,分别是真机和模拟器的运行库文件导入:

    cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/lib/
    
    cp /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/libstdc++.* /Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib/
    复制代码
  • 5、[ iOS 12.1 ] 二级页面返回时 tabbar 图标和文字位置偏移

    iOS 12.1 系统中 UINavigationController+UITabBarControllerUITabBar 为磨砂,并且 pushViewController 的时候使用 hidesBottomBarWhenPushed = YES ,则在使用 popViewController:animated 返回,或者手势返回的时候,就会出现 tabbar 布局错乱,图标和文字位置偏移的问题。出现这个问题的直接原因是 UITabBar 为磨砂的情况下,返回页面时 tabBar 内的按钮 UITabBarButton 被设置了错误的 frameframe.size 变为了 (0, 0) 。

    最简单的解决方案是:

    [[UITabBar appearance].translucent = NO;
    复制代码
  • 6、 webView 播放视频返回后状态栏消失

    视频播放完成主 window 成为 KeyWindow 的时候仍隐藏着 UIStatusBar

    解决方案:

    - (void)videoPlayerFinishedToShowStatusBar
    {
        if (@available(iOS 12.0, *)) {
            [[NSNotificationCenter defaultCenter] addObserverForName:UIWindowDidBecomeKeyNotification
                                                            object:self.window
                                                             queue:[NSOperationQueue mainQueue]
                                                        usingBlock:^(NSNotification * _Nonnull note) {
                                                            [[UIApplication sharedApplication] setStatusBarHidden:NO
                                                                                                    withAnimation:UIStatusBarAnimationNone];
                                                        }];
        }
    }
    复制代码
  • 7、[ iPhone X ] StatusBar 内部结构改变导致 crash

    苹果17年底推出全面屏刘海手机之后,应用顶部 StatusBar 内部结构发生改变,如果项目中使用状态栏中图标获取手机状态信息(如:获取当前网络的状态),则在 iPhone X (Xs,Xs Max,XR) 手机上会发生崩溃。

    注意:发生崩溃的机型是有刘海的手机 iPhone X (Xs,Xs Max,XR) 。 例如获取当前网络状态。

    crash log:
    *** Terminating app due to uncaught exception 'NSUnknownKeyException',
    reason: '[<UIStatusBar_Modern 0x7ffbf2c05670> valueForUndefinedKey:]:
    this class is not key value coding-compliant for the key foregroundView.'
    复制代码

    导致上面崩溃的代码如下:

    - (NSString *)getiPhoneNetWorkStates
    {
        UIApplication *app = [UIApplication sharedApplication];
        NSString *states = @"UnKnow";
        NSArray *subViews = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
        for (id child in subViews) {
            if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
                int networkType = [[child valueForKeyPath:@"dataNetworkType"] intValue];
                NSString *networkStatus = @"UnKnow";
                switch (networkType) {
                    case 0:
                        networkStatus = @"UnKnow";
                        break;
                    case 1:
                        networkStatus = @"2G";
                        break;
                    case 2:
                        networkStatus = @"3G";
                        break;
                    case 3:
                        networkStatus = @"4G";
                        break;
                    case 4:
                        networkStatus = @"LTE";
                        break;
                    case 5:
                        networkStatus = @"WiFi";
                        break;
                    default:
                        break;
                }
            }
        }
        return states;
    }
    复制代码

    导致崩溃的原因是: StatusBar 内部结构发生变化,在上面代码第5行获取 foregroundView 的时候, foregroundView 不存在。

    解决方案:

    iPhone X上通过StatusBar只能获取到网络是WiFi还是蜂窝网,当网络为蜂窝网的时候,无法获取到具体的网络状态。要获取更具体的网络状况,建议使用官方提供的Reachability。

    - (NSString *)getiPhoneNetWorkStates
    {
        UIApplication *app = [UIApplication sharedApplication];
        NSString *states = @"UnKnow";
        id statusBar = [app valueForKeyPath:@"statusBar"];
        if ([self checkDeviceIsiPhoneX]) {
            if ([statusBar isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
                id curData = [statusBar valueForKeyPath:@"statusBar.currentData"];
                BOOL wifiEnable = [[curData valueForKeyPath:@"_wifiEntry.isEnabled"] boolValue];
                BOOL cellEnable = [[curData valueForKeyPath:@"_cellularEntry.isEnabled"] boolValue];
                // iPhone X上通过StatusBar只能获取到网络是WiFi还是蜂窝网
                // 当网络为蜂窝网的时候,无法获取到具体的网络状态
                if (wifiEnable) {
                    states = @"WiFi";
                } else if (cellEnable) {
                    states = @"Cellular";
                }
            }
        } else {
            NSArray *subViews = [[statusBar valueForKeyPath:@"foregroundView"] subviews];
            for (id child in subViews) {
                if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
                    int networkType = [[child valueForKeyPath:@"dataNetworkType"] intValue];
                    switch (networkType) {
                        case 0:
                            states = @"UnKnow";
                            break;
                        case 1:
                            states = @"2G";
                            break;
                        case 2:
                            states = @"3G";
                            break;
                        case 3:
                            states = @"4G";
                            break;
                        case 4:
                            states = @"LTE";
                            break;
                        case 5:
                            states = @"WiFi";
                            break;
                        default:
                            break;
                    }
                }
            }
        }
        return states;
    }
    复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First HTML and CSS

Head First HTML and CSS

Elisabeth Robson、Eric Freeman / O'Reilly Media / 2012-9-8 / USD 39.99

Tired of reading HTML books that only make sense after you're an expert? Then it's about time you picked up Head First HTML and really learned HTML. You want to learn HTML so you can finally create th......一起来看看 《Head First HTML and CSS》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试