iOS开发--OC篇&常用问题解答
一:旧版本新浪微博 SDK 在 iOS9 上会导致的 Crash
app was compiled with optimization - stepping may behave oddly; variables may not be available
打印出来这句话,然后崩溃。多是启动的过程中程序就崩溃。
在iOS9下,新浪微博SDK里面使用的 JSONKit 在部分机型可能导致崩溃。崩溃信息如下图。
解决:更新新浪微博SDK,新浪的SDK最新版做了对iOS9兼容。
二:iOS9 下使用 Masonry 会引起崩溃的一种情况
我们在使用时候一直将 leading 与 left 划为等号,这样做在 iOS8(及以前)上是正常的,但在 iOS9 上这样的观念可能会引起崩溃,比如:
1 make.left.equalTo(self.mas_leading).offset(15);
应该为:
1 make.left.equalTo(self.mas_left).offset(15);
同理 mas_training 也需要改为right
三:Xcode 升级后,旧的状态栏的样式设置方式会引起警告
: CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.: CGContextTranslateCTM: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.: CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
出错原因:设置 app 的状态栏样式的时候,使用了旧的方式,在 info.plist 里面的 View controller-based status bar appearance 默认会为 YES,即使不设置也是 YES,但一般 iOS6 的时候为了设置状态栏样式,需要将其设为NO,iOS7,8也兼容,但是到了iOS9 就会报警告。
解决办法:
删除原先的设置代码,通常老的设置方式是这样的:
//设置状态栏的白色 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
删除的原因见下:
// Setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system. @property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]"); - (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]");
修改方式是在 Info.plist 文件中做如下修改:
将 View controller-based status bar appearance 删除(默认为 YES),或设置为YES:
对应的 plist 里的 XML源码:
- UIViewControllerBasedStatusBarAppearance
看起来长这样:
然后使用新的方式来实现状态栏的样式:
- - (UIStatusBarStyle)preferredStatusBarStyle;
- - (UIViewController *)childViewControllerForStatusBarStyle;
- - (void)setNeedsStatusBarAppearanceUpdate
比如,你想将状态栏设置为白色,就可以这样写:
//设置状态栏的白色
-(UIStatusBarStyle)preferredStatusBarStyle { return UIStatusBarStyleLightContent; }
记得要 clean 下或者删除应用程序重新运行。
四:navigationController状态栏样式新的设置方法
如果你按照上面的方法设置了,但还是不行。八成是 rootViewController 设置的问题,你必须设置 rootViewController,编译器才会去 rootViewController 中重载 preferredStatusBarStyle 方法。
另外当你在 appdelegate 中将 navigationController 设为 rootViewController 的时候:
1 self.window.rootViewController = self.navigationController;
因为 rootViewController 变为了 navigationController,你在 ViewController 里重写 preferredStatusBarStyle 方法是不会起作用的。所以最好的方法是
1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 self.title = @"微博@iOS程序犭袁"; 5 self.navigationController.navigationBar.barStyle = UIBarStyleBlack; 6 }
如果你还是想重写 preferredStatusBarStyle 方法来达到作用,那最好使用分类来解决:
1 #import "UINavigationController+StatusBarStyle.h" 2 3 @implementation UINavigationController (StatusBarStyle) 4 5 - (UIStatusBarStyle)preferredStatusBarStyle 6 { 7 //also you may add any fancy condition-based code here 8 return UIStatusBarStyleLightContent; 9 } 10 11 @end
五:Xcode7 在 debug 状态下也生成 .dSYM 文件引起的警告
Xcode6 的工程升级到 Xcode7上来,会报警告:
这是 debug 编译时导出符号文件出现的告警,然而新建的Xcode7工程不会有该问题。
解决方法是让 debug 编译的时候不生成符号文件:
Xcode7 无法使用 8.x 系统的设备调试,一运行就报错 there is an intenal API error
Xcode7 调试 iOS8.x 的真机,需要确保项目名改为英文,中间含有中文会报错 there is an intenal API error
按照下面的步骤检查:
bulid settings -> packaging -> product name
六:使用了 HTML 的 iframe 元素可能导致无法从 Safari 跳转至 App
我们都知道,从网易新闻分享一条新闻到QQ,然后从QQ中打开链接再用safari打开链接,在iOS8上,这个时候会跳转到网易新闻App。但是现在(2015年09月23日)版本的网易新闻在 iOS9 就不能正常跳转,会跳转到 App Store 页面并提示要不要打开 App Store。
这是很可能是因为使用了 HTML 的 iframe 元素,并将自定义的链接放进了该元素中
举例说明:
我之前写的一个 Demo: 模仿 《简书 App》 的效果:在html中跳转到App中的对应页面,并能从App跳转到原来的网址,在例子中直接调用自定义链接在 iOS9上是可以跳转到 App 中的,然而,如果用 iframe 元素包起来就会变不可用。
七:iOS9锁屏控制台会打印警告
加入运行如下示例代码:
- (void)viewDidLoad { [super viewDidLoad]; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^(void) { //在这个10秒内锁屏 NSLog(@"准备休眠"); sleep(10); NSLog(@"打印成功"); }); }
应用运行过程中锁屏,总是会出现以下提示:
1 [UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action ->{ 2 handler = remote; 3 info ={ 4 (1) = 5; 5 }; 6 }
当应用处于空闲状态时(无网络请求)锁屏对于用户而言并无较大影响,但是当应用在执行某个异步任务时(比如下拉刷新一下列表)锁屏,重新解锁进入就可能会发现异步任务失败,控制台也会提示 Error 信息:
1 [UIApplication _handleNonLaunchSpecificActions:forScene:withTransitionContext:completion:] ** unhandled action ->{ 2 handler = remote; 3 info ={ 4 (1) = 5; 5 }; 6 } 7 error in __connection_block_invoke_2: Connection interrupted
以上情况不易复现,但确有发生。
在 iOS8 系统下测试并未发现此问题。
对此并未找到合理的解释和对应的解决办法,如果你有解决方法,欢迎提 PR !