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 !

posted @ 2016-06-30 10:57  ekhome  阅读(310)  评论(0编辑  收藏  举报