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


目录
相关文章
|
安全 Android开发 iOS开发
Android vs iOS:深入剖析两大移动操作系统的优劣与未来趋势####
【10月更文挑战第21天】 本文旨在通过技术视角,全面对比分析Android与iOS两大主流移动操作系统的架构差异、用户体验、安全性及生态系统等方面,探讨其各自优势与不足,并预测未来发展趋势。 ####
1559 1
|
Android开发 Swift iOS开发
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
|
Android开发 Swift iOS开发
iOS和安卓作为主流操作系统,开发者需了解两者差异以提高效率并确保优质用户体验。
【10月更文挑战第1天】随着移动互联网的发展,智能手机成为生活必需品,iOS和安卓作为主流操作系统,各有庞大的用户群。开发者需了解两者差异以提高效率并确保优质用户体验。iOS使用Swift或Objective-C开发,强调简洁直观的设计;安卓则采用Java或Kotlin,注重层次与动画。Swift和Kotlin均有现代编程特性。此外,iOS设备更易优化,而安卓需考虑更多兼容性问题。iOS应用仅能通过App Store发布,审核严格;安卓除Google Play外还可通过第三方市场发布,审核较宽松。开发者应根据需求选择合适平台,提供最佳应用体验。
412 3
|
Java Linux Android开发
移动应用开发与操作系统的交互:深入理解Android和iOS
在数字时代,移动应用成为我们日常生活的一部分。本文将深入探讨移动应用开发的核心概念、移动操作系统的工作原理以及它们如何相互作用。我们将通过实际代码示例,展示如何在Android和iOS平台上创建一个简单的“Hello World”应用,并解释其背后的技术原理。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和知识。
|
安全 生物认证 Android开发
深入探索iOS与Android操作系统的安全性差异
本文旨在通过对比分析iOS和Android两大主流移动操作系统在安全性方面的差异,揭示它们各自的安全机制、面临的挑战以及用户如何提升自身设备的安全保护。通过对系统架构、应用审核机制、数据加密方式及隐私政策的深入探讨,本文为读者提供了一个全面了解两大平台安全性的视角,并提出了实用的安全建议。
|
IDE 安全 Android开发
深入探索Android与iOS操作系统的架构差异
本文旨在对比分析Android和iOS两大主流移动操作系统在架构设计上的根本差异。通过详细解读两者的系统架构、开发环境、以及安全性等方面,揭示它们各自的特点及优势,为开发者选择合适的平台提供参考。
|
安全 Android开发 iOS开发
深入探讨Android与iOS操作系统的差异性
本文旨在通过对比分析Android和iOS两大主流移动操作系统,揭示它们在设计理念、用户体验、安全性、应用生态及系统更新等方面的根本差异。不同于传统的功能列表式摘要,本摘要强调了两大系统背后的哲学思想及其对用户日常使用的实际影响,为读者提供了一个宏观且深入的视角来理解这两种操作系统的独特之处。
|
安全 定位技术 Android开发
深入探索Android与iOS操作系统的安全性差异
【10月更文挑战第21天】 在当今数字化时代,智能手机已成为我们生活中不可或缺的一部分。其中,Android和iOS作为两大主流操作系统,各自拥有庞大的用户群体。然而,它们在安全性方面的表现却大相径庭。本文将深入探讨Android与iOS在安全机制、隐私保护以及应对恶意软件方面的差异,帮助读者更全面地了解这两个平台的安全特性。
|
搜索推荐 Android开发 iOS开发
安卓与iOS的较量:选择最适合你的移动操作系统
在智能手机市场上,安卓和iOS一直是两大主流操作系统。本文将深入探讨这两个系统的优缺点,帮助你根据自己的需求做出最佳选择。
|
搜索推荐 Android开发 iOS开发
安卓vs. iOS:操作系统的终极对决####
本文探讨了安卓和iOS两种主流移动操作系统的特点,从用户体验、系统生态、硬件兼容性等维度进行对比分析。通过深入浅出的方式,揭示了两者在技术层面的优劣及未来发展趋势,旨在帮助用户更好地理解并选择适合自己的平台。 ####

推荐镜像

更多