zoukankan      html  css  js  c++  java
  • iOS12适配及兼容问题解决,xcode10问题

    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;
      }

    作者:CircusJonathan
    链接:https://juejin.im/post/5c825bd35188257ddb6af21a
    来源:掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    C++之用程序理解浅拷贝
    es6 | 新增语法 | 总结
    http协议 | http缓存
    Mobx | 强大的状态管理工具 | 可以用Mobx来替代掉redux
    nohup和&后台运行,进程查看及终止
    MIME Type介绍 Content-Type 各种定义
    Meta http-equiv属性详解(转)
    sublme text 3 快捷键
    【坑】【数组的坑】1、对象assign复制的假深度,2、数组slice复制的坑,3、还有数组map复制的坑
    Proxy监听对象的数据变化,处理绑定数据很有用
  • 原文地址:https://www.cnblogs.com/-ios/p/10525151.html
Copyright © 2011-2022 走看看