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无效。
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];
    }
}

猜你喜欢

转载自blog.csdn.net/jia12216/article/details/78147250