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


目录
打赏
0
23
23
0
54
分享
相关文章
Android vs iOS:深入剖析两大移动操作系统的优劣与未来趋势####
【10月更文挑战第21天】 本文旨在通过技术视角,全面对比分析Android与iOS两大主流移动操作系统的架构差异、用户体验、安全性及生态系统等方面,探讨其各自优势与不足,并预测未来发展趋势。 ####
246 1
深入探索iOS与Android操作系统的架构差异及其对应用开发的影响
在当今数字化时代,移动设备已经成为我们日常生活和工作不可或缺的一部分。其中,iOS和Android作为全球最流行的两大移动操作系统,各自拥有独特的系统架构和设计理念。本文将深入探讨iOS与Android的系统架构差异,并分析这些差异如何影响应用开发者的开发策略和用户体验设计。通过对两者的比较,我们可以更好地理解它们各自的优势和局限性,从而为开发者提供有价值的见解,帮助他们在这两个平台上开发出更高效、更符合用户需求的应用。
GeneralUpdate应用程序自动升级跨平台解决方案,支持国产操作系统。
前些年随着技术的发展逐渐兴起“一次编码到处运行”、“国产化”的概念那么跨平台就是各大技术争相主推的能力之一。具备跨平台的能力同时也需要自动升级的能力,GeneralUpdate 随之应运而生。
218 11
OS 升级迭代与向前向后兼容问题
本次分享的主题是OS 升级迭代与向前向后兼容问题,由中科方德内核研发工程师李力琼分享。主要分为四个部分: 1. OS更新的兼容性问题 2. 内核API向后兼容 3. 内核API向前兼容 4. 内核API的修改
AI 驱动,全面升级!操作系统服务套件体验评测
作为一名运维工程师,我体验了阿里云的操作系统服务套件,选择了Alibaba Cloud Linux作为测试环境。通过安装SysOM和OS Copilot组件,轻松管理集群健康数据、进行系统诊断并获得优化建议。OS Copilot智能解答技术问题,节省查阅资料时间;订阅管理帮助我及时升级操作系统,保障安全。整体功能强大,提升了约20%的工作效率,值得推广。建议增加更多系统版本支持及自动优化功能。
深入探索iOS与Android操作系统的安全性差异
本文旨在通过对比分析iOS和Android两大主流移动操作系统在安全性方面的差异,揭示它们各自的安全机制、面临的挑战以及用户如何提升自身设备的安全保护。通过对系统架构、应用审核机制、数据加密方式及隐私政策的深入探讨,本文为读者提供了一个全面了解两大平台安全性的视角,并提出了实用的安全建议。
深入探索Android与iOS操作系统的架构差异
本文旨在对比分析Android和iOS两大主流移动操作系统在架构设计上的根本差异。通过详细解读两者的系统架构、开发环境、以及安全性等方面,揭示它们各自的特点及优势,为开发者选择合适的平台提供参考。
深入探索Android与iOS操作系统的安全性差异
【10月更文挑战第21天】 在当今数字化时代,智能手机已成为我们生活中不可或缺的一部分。其中,Android和iOS作为两大主流操作系统,各自拥有庞大的用户群体。然而,它们在安全性方面的表现却大相径庭。本文将深入探讨Android与iOS在安全机制、隐私保护以及应对恶意软件方面的差异,帮助读者更全面地了解这两个平台的安全特性。
深入探讨Android与iOS操作系统的差异性
本文旨在通过对比分析Android和iOS两大主流移动操作系统,揭示它们在设计理念、用户体验、安全性、应用生态及系统更新等方面的根本差异。不同于传统的功能列表式摘要,本摘要强调了两大系统背后的哲学思想及其对用户日常使用的实际影响,为读者提供了一个宏观且深入的视角来理解这两种操作系统的独特之处。

热门文章

最新文章