XCode8升级到Xcode9(操作系统为iOS11)后原来的工程中遇到的问题

简介: XCode8升级到Xcode9(操作系统为iOS11)后原来的工程中遇到的问题

1.无法识别check_compile_time,导致工程无法编译不过。

原来的工程中使用了QNNetDiag第三方库.

QNNPing.m中使用check_compile_time,所以编译时报下面的错误。

本来就是编译时的断言,暂时去掉就可以了。就是有问题断言条件成立,那么应用就会crash,所以在发布版本有断言本来就没有什么好处,只有调试时才有用,提前暴露问题。所以去掉这些断言没有什么影响。

2.报declaration of ‘select’ must be imported from module ‘Darwin.POSIX.sys.time’ before it is required的错误。

解决办法是加入这个头文件就可以了:

#include <sys/time.h>

3.在系统iOS11,在[[UIApplication sharedApplication].windows lastObject]上面增加的控件无法显示。如:自定义MBProgressHUD的弹出框toast,在iOS11之下的系统显示正常,而iOS11系统下就显示不出来。修改办法是修改为:[[[UIApplication sharedApplication] delegate] window]。

代码如下:

4.定位失效。

原来的应用使用的是后台一直定位,升级到xcode9后,无法定位,在隐私定位中看到的应用是永不。

在info.Plist中的添加新Key NSLocationAlwaysAndWhenInUseUsageDeion和旧Key

NSLocationWhenInUseUsageDeion。仍然没有用,暂时没有找到解决方案,不知道是证书无效还是高德地图key无效。

这个老工程iOS11以后定位失效问题终于解决了,网上的方案都不全面,完美解决方案见我的文章:iOS11及以上操作系统无法定位问题完美解决方案 (https://blog.csdn.net/jia12216/article/details/81316479)。

5.在iphonex模拟器上,下部工具条的位置不在最底部。现在还没有解决。iphone x的宽度是375像素,高度是667像素。相当于是iPhone8的放大模式。

6.对UILabel的text赋值时,若是以空格结束的字符串,那么字符串后面的空格自动被过滤。

7.iOS11状态栏增加了20像素。

iOS11版本,若页面从顶部算起需要留64个像素的导航栏高度再放置下面的控件,不然导航栏下面的控件会被导航栏遮挡。

OS11以下版本,若页面从顶部算起需要留44个像素的导航栏高度再放置下面的控件,若留64个像素会多空出20像素。

8.iOS11以下版本,UITextView的默认键盘没有完成键,导致不能自动收起键盘,想收起键盘自己处理。这个问题导致很多应用不能使用。

9.iOS11出来前发布的版本,当在有placeholder的UITextField输入框输入文字时,placeholder显示在应用页面的左上角。不需要改代码,用Xcode9重新打包发布苹果商店就能解决。


非表格页面通过这样的处理可以解决。

- (void)viewDidLoad {
    [super viewDidLoad];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onClickBackGround)];
    [self.view addGestureRecognizer:singleTap];
    self.view.userInteractionEnabled = YES;
}
- (void)onClickBackGround
{
    [self.view endEditing:YES];
}

注意:表格页面这样处理会造成表格行时间无效。需要另行处理。

10.新版本发布,需要提供一张1024*1024的AppIcon,这个图片需要是png格式的图片并且不能有圆角。不然会上传不上去或提交不了。

11.访问系统图片库权限说明配置项(Privacy - Photo Library Usage Description)变更,不在.plist文件中增加新的配置项(Privacy - Photo Library Additions Usage Description),当应用存储图片时崩溃。崩溃时的日志如下:

This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app’s Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value explaining to the user how the app uses this data.

这次xcode9和ios11的修改好大啊。

12.iPhone X的状态栏视图数组结构变化,读取网络状态栏的网络状态时崩溃。找不到foregroundView这个子视图。

    UIApplication *app = [UIApplication sharedApplication];
    NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];

崩溃信息:

#0 Thread
NSUnknownKeyException
[<UIStatusBar_Modern 0x15f906160> valueForUndefinedKey:]: this class is not key value coding-compliant for the key foregroundView.

这是项目中使用状态栏中图标判断当前网络的具体状态,而 iPhone X手机状态栏和其他版本手机存在差异,状态栏是多嵌套了一层,所以在读取时候需要注意。

修改后的代码如下:

    UIApplication *app = [UIApplication sharedApplication];
//    NSArray *children = [[[app valueForKeyPath:@"statusBar"]valueForKeyPath:@"foregroundView"]subviews];
    NSArray *children;
    // 不能用 [[self deviceVersion] isEqualToString:@"iPhone X"] 来判断,因为模拟器不会返回 iPhone X
    if ([[app valueForKeyPath:@"_statusBar"] isKindOfClass:NSClassFromString(@"UIStatusBar_Modern")]) {
        children = [[[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    }
    else
    {
        children = [[[app valueForKeyPath:@"_statusBar"] valueForKeyPath:@"foregroundView"] subviews];
    }

13.ios11系统使用UITextField的页面退出时,MLeaksFinder检测出内存泄漏。

这个也不完全算内存泄漏,因为dealloc函数被调用了,说明这个页面被销毁了。只是文本框在被系统引用而没有释放。对内存影响不大。

真正的内存泄漏是这样的,你在一个页面起一个定时器,然后在viewWillDisappear里关闭定时器,你会发现该页面的dealloc函数永远不调用,这个才是真的内存泄漏。

所以可以暂时把他归类为内存泄漏误报吧(其实它占着内存不放,也可以说它是内存泄漏。貌似系统把文本框做成单例类型的了。),这个和ios11有关。当然你很讨厌那个报告,可以在viewWillDisappear增加[self.* removeFromSuperview];就能去掉这个告警,注意:再次进入该页面要重新加载该部件了。代码:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    if(!(self.isGotoNewPage))
    {
        [self.biddingBackView removeFromSuperview];
    }
}


目录
相关文章
|
6天前
|
安全 Java Android开发
Android 与 iOS:探索两大操作系统的差异与优势
本文将深入探讨安卓和iOS这两大主流移动操作系统的差异与优势。我们将分别从用户界面、应用生态系统、开发者支持以及性能与安全方面进行比较,帮助读者更好地了解并选择适合自己的操作系统。
10 0
|
7天前
|
Java Android开发 iOS开发
深入探讨移动操作系统的性能优化:安卓与iOS的对比分析
在现代移动设备中,操作系统的性能优化至关重要。本文从系统架构、内存管理、电池续航和应用程序运行效率等多个维度,深入探讨了安卓(Android)和iOS两大主流移动操作系统的优化策略及其实际效果,旨在为开发者和用户提供更清晰的了解和选择依据。
17 0
|
6天前
|
搜索推荐 安全 Android开发
安卓与iOS操作系统的对比分析
在移动设备市场上,安卓和iOS操作系统一直是主要竞争对手。本文将从用户界面、应用生态系统、定制化程度和安全性等方面对安卓和iOS进行对比分析,并探讨两者在不同场景下的适用性。
|
8天前
|
搜索推荐 Android开发 iOS开发
深入解析安卓与iOS操作系统的异同
安卓和iOS是目前两大主流移动操作系统,它们分别代表了开放性和封闭性的设计理念。本文将从系统架构、用户界面、应用生态等方面深入探讨安卓和iOS之间的异同,帮助读者更好地理解这两个操作系统的特点和优势。
21 3
|
13天前
|
安全 Android开发 iOS开发
安卓与iOS操作系统的比较分析
【6月更文挑战第5天】本文将深入探讨安卓和iOS两大主流操作系统的特点、优势和劣势。通过对比分析,我们将揭示这两个系统在性能、安全性、用户体验等方面的差异,帮助用户更好地了解这两个系统,从而做出更明智的选择。
|
20天前
|
安全 Android开发 iOS开发
探索安卓与iOS手机操作系统的发展趋势与差异
在移动互联网时代,安卓和iOS手机操作系统一直处于激烈的竞争之中。本文将从技术角度出发,探讨两大操作系统的发展趋势、特点以及差异,并分析其对用户体验和开发者生态的影响,旨在为读者提供对移动操作系统发展方向的深入了解。
|
20天前
|
安全 iOS开发 MacOS
Mac pro升级 MacOS 10.15 Catalina 后根目录是只读的, Recovery OS不能访问
Mac pro升级 MacOS 10.15 Catalina 后根目录是只读的, Recovery OS不能访问
20 0
|
26天前
|
iOS开发
XCode10.2.1打开老工程报Multiple commands produce与Info.plis错误
XCode10.2.1打开老工程报Multiple commands produce与Info.plis错误
19 0
|
28天前
|
Linux 数据安全/隐私保护 iOS开发
Xcode8.1如何支持iOS8.0以下版本
Xcode8.1如何支持iOS8.0以下版本
19 0