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


目录
相关文章
|
3月前
|
iOS开发 MacOS Perl
解决Xcode运行IOS报错:redefinition of module ‘Firebase‘和could not build module ‘CoreFoundation‘
解决Xcode运行IOS报错:redefinition of module ‘Firebase‘和could not build module ‘CoreFoundation‘
140 4
|
3月前
|
iOS开发 开发者
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
264 3
|
18天前
|
人工智能 安全 Linux
|
18天前
|
存储 人工智能 安全
【通义】AI视界|苹果停止签署iOS 18.0.1,升级用户无法降级
本文由通义自动生成,涵盖24小时内精选的五条科技资讯:奥特曼谈OpenAI未来发展方向,ChatGPT新搜索功能上线遇故障,Perplexity AI选举搜索面临挑战,马斯克谈特斯拉造手机的可能性,以及苹果停止签署iOS 18.0.1。更多精彩内容,欢迎访问通通知道。
|
3月前
|
人工智能 自然语言处理 云计算
iOS迎来AI升级:揭秘Apple全新“智能”系统
iOS迎来AI升级:揭秘Apple全新“智能”系统
iOS迎来AI升级:揭秘Apple全新“智能”系统
|
3月前
|
缓存 iOS开发
如何在Xcode删除某个版本的IOS模拟器
如何在Xcode删除某个版本的IOS模拟器
595 1
|
3月前
|
iOS开发
mac不通过Xcode直接打开IOS模拟器
mac不通过Xcode直接打开IOS模拟器
227 2
|
3月前
|
运维 网络安全 iOS开发
厉害!外国网络工程师用Ansible给思科IOS设备升级!
厉害!外国网络工程师用Ansible给思科IOS设备升级!
|
4月前
|
人工智能 搜索推荐 vr&ar
苹果手机iOS18最新升级:植入AI人工智能,国内百度文心一言,国外GPT4o来辅助
iOS 18亮点速览:AI强化的Siri、RCS安卓消息兼容、自定义主屏、辅助功能增强,VR进步,新隐私工具,包括锁定APP和眼动追踪。Passwords app保障安全,Apple Intelligence提升个性化体验。
210 1
|
5月前
|
iOS开发
技术好文:xcode动态图,ios实现动态图,iosgif,暂停和继续播放
技术好文:xcode动态图,ios实现动态图,iosgif,暂停和继续播放
52 1