适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue

原文:http://imtx.me/archives/1910.html

昨天我在微博上吐槽:iOS
8 / Xcode 6 真是史上对开发者最糟糕的版本了
。收到很多朋友表达同感。

之所以这么说,倒不是针对 iOS 8 本身的特性来说的,相反,iOS 8 开放的那些扩展机制以及各种 Kit 对开发者来说是非常好。

我抱怨的是 Apple 最近对软件质量的控制不太好,上次发一个让手机不工作的 iOS 8.0.1 就不说了,iOS 8 / Xcode 6 本身充满了非常多的 Bug。Xcode 作为 IDE,提交 App 的时候还经常失败。比如前几天我提交 Manico 1.4.1 版本,Xcode 6 还直接失败,最后还用
Xcode 5 完成了提交。这让作为开发者的我们非常窝火。

除此之外,Apple 在 iOS 上的演进越来越激烈,为了推进新的系统特性,Apple 直接 break 了软件在升级后的向下兼容兼容特性,实在是让我吃惊。今天就谈两则最近遇到的吧。

实际上我要记录的这些在 Apple 的 WWDC 上应该都有提到,无奈视频没有全部看完,只有在碰到问题的时候才去解决。

远程推送机制的变化

如果你还在代码里用 registerForRemoteNotificationTypes 这个方法来注册推送功能,你的 App 又用 iOS 8 的 SDK 编译了,那么你的 App 在 iOS 8 下将无法注册功能推送(在 iOS 7 下是可以的)。Apple 直接将这个 API 在 iOS 8 下设置成了「无法工作」,而不是简单的标记了
deprecated。

那么在 iOS 8 下用哪个 API 去注册远程推送功能?用新的 API:registerForRemoteNotifications。

但是,这个 API,仅仅会注册一个静默功能的远程推送,尽管 App 之后会收到推送并进行处理,它不会在用户界面上有任何提示。那么如何在 iOS 8 下完成和 iOS 7 下一样的远程推送注册支持?下面的代码可以让推送的支持在 iOS 7 和 iOS 8 下都正常工作,if 里面的是 iOS 8 的,而
else 那里是 iOS 7。

UIApplication *application = [UIApplication sharedApplication];

if ([application respondsToSelector:@selector(isRegisteredForRemoteNotifications)]) {
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:(UIRemoteNotificationTypeBadge
                                                                                         |UIRemoteNotificationTypeSound
                                                                                         |UIRemoteNotificationTypeAlert)
                                                                             categories:nil];
    [application registerUserNotificationSettings:settings];
    [application registerForRemoteNotifications];
} else {
    [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge
                                                     |UIRemoteNotificationTypeSound
                                                     |UIRemoteNotificationTypeAlert)];
}

可以看到,iOS 8 把原先一步到位的 RemoteNotification 的注册分成两部分,一部分是注册新引入的那个「UIUserNotificationSettings」,另一部分才是 RemoteNotifications。Apple 为什么要这样设计?

简单的说,Apple 在 iOS 8 将 RemoteNotification 和 LocalNotification 统一了起来。两种 Notifications 将统一由 UIUserNotificationSettings 来管理用户界面相关的东西:标记、声音和提醒。除了统一用户界面的通知外,UIUserNotificationSettings
还引入了 UIUserNotificationCategory,可以让用户方便的直接在 Notification 上进行一些快捷的操作(Action)。这部分我还没玩过,所以又不多讲了。

总之,Apple 为了推进新的技术,不惜直接把老的 API 弄成不工作,实在是让人惊叹…

Unwind Segue 的变化

Unwind Segue 是 Storyboard 里面一项我非常喜欢而且实用的技术。通过 Unwind,可以很方便的在同一层级(通过 Push 进行)和不同层级(通过 Modal 进行)的 ViewController 之间进行回退,只要前面的 ViewController 有一个实现了特定的 Unwind,那么在当前的
ViewController 执行这个 Unwind,就会回跳到前面的某个 ViewController,不管中间隔了几个,都能准确的跳回去。

喜欢这个技术主要是因为 Unwind 比 Delegate 更灵活,ViewController 中间可以隔好几个,不需要用 delegate 关联起来,只要实现特定的 Unwind 方法就可以了。

然而,在 iOS 8 当中,很遗憾的,Unwind 不再像以前一样好好工作了:如果你的 ViewController 是基于NavigationController,那么现在它只支持同一层级的 ViewController 之间的相互跳转(即通过 Push 方式产生的),而不支持不同层级的
ViewController 之间的相互跳转了(即通过 Modal 形式产生)。

Apple 没有什么 Depcated 的 Warning,直接就让 Modal 形式的 ViewController 下执行 Unwind 不工作了,没有任何错误和提示…

关于这个,StackOverflow 上有一个讨论:Unwind
Segue not working in iOS 8

目前为止,没有一个好办法(包括那个被接受的 Answer 实际上了不行),目前为止我发现最好的办法就是重写相关代码,然后用 delegate 去实现。如果你有更好的办法,请记得告诉我。

后记

由于我差不多是 iOS 7 时代才开始正式做 iOS 开发的,我不知道以前 Apple 从 iOS 5 -> iOS 6,从 iOS 6 -> iOS 7 有没有过类似的直接把某个 API 弄为不工作,而不是循序渐进的 deprecated 的过程。

总之这次让我真切的体验会到新旧版本切换时作为开发者的阵痛,且不说破坏 API 的向下兼容到底合不合适,光是 iOS 8 / Xcode 6 里各种令人无奈的 Bug 就让人足够头疼了,还是希望 Apple 能在 Xcode 6.1 里把问题变得少一些。

接下去,我要去适配 Manico 的 Yosemite 风格了…

时间: 2024-10-14 13:49:07

适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue的相关文章

IOS JPush 集成步骤(极光远程推送解决方案,支持android和iOS两个平台)

●  什么是JPush ●  一套远程推送解决方案,支持android和iOS两个平台 ●  它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量.开发复杂 度 ●  更多的信息,可以参考JPush官方网站:https://www.jpush.cn ●  集成iOS SDK的步骤可以参考 ●  http://docs.jpush.cn/pages/viewpage.action?pageId=2621727 JPush的集成步骤 注册帐号,创建应用 填写iOS App的必要信息

iOS推送之远程推送

最近公司项目升级重构(重写),除了本来我所负责的模块,最后临危受命接了推送(远程和本地)相关的模块,顺便把推送的相关知识复习了一遍.后期连续工作十几天加上最后一天的通(瞎)宵(熬)达(一)旦(夜),也算是不辱使命.此文除了讲解远程推送相关的基本知识外,也会涉及一些推送相关的奇淫技巧.另外本文主要讲解远程推送,后续会出一篇iOS推送之本地推送(iOS Notification Of Local Notification)的姊妹篇. 此篇文章的逻辑如下图所示: 图0-0 此篇文章的逻辑图 远程推送原

IOS本地,APNS远程推送(具体过程)

添加本地推送 ///本地添加 -(void)addLocalPushNotification:(UIButton*)sender; { NSLog(@"%s",__FUNCTION__); UILocalNotification* localNotification=[[UILocalNotification alloc]init]; if (localNotification) { //设置时间当前加20秒 NSDate* pushDate=[NSDate dateWithTimeI

iOS开发中的远程推送实现(最新,支持iOS9)

我的个人项目<丁丁印记>中加入了远程推送功能,按照操作说明去做还是比较容易实现的,但是学的不够不系统,因此这篇文章希望总结一下最新的iOS推送功能,因为iOS8之后的推送和致之前的版本是有所不同的,也希望想能帮助到需要的朋友.这篇文章将从零开始,向大家介绍远程推送功能的原理和使用. 什么是远程推送通知 顾名思义,就是从远程服务器推送给客户端的通知(需要联网)远程推送服务,又称为APNs(Apple Push Notification Services). 为什么程序中需要远程推送功能 1.传统

IOS测试,远程推送证书

程序上传:准备工作证书创建流程 1:证书:证书用来为我们的应用程序签名,只有经过签名的应用程序才能保证他的来源是可信任的,并且代码是完整的, 未经修改的.证书的创建过程: 登陆开发者中心 点击Certificates(证书)该项,进入下面的界面 点击Certificates(证书)进入 看到左边栏有一个Certificates(证书)一项,我们发现该项中有Developerment和Production两个类型,其中Developerment类型的证书用于开发使用(比如我们的真机测试),Prod

iOS 远程推送 根据后台推送内容的不同跳转指定页面

转发自:http://www.jianshu.com/p/4531bd6e3a01 iOS 远程推送,根据后台推送内容的不同, 跳转指定页面 我目前的需求是总体分为两类: 1:私信.关注.点赞一类,只需跳转到对应的tabbar 中的某一项 2:每日精品文章项目推送,分两个子类 (1)如果当前已经打开 文章项目页面,则直接刷新,不推出新页面 (2)如果当前未打开此页面,则push出新的文章项目页面 iOS 推送情况分为 应用未启动的 情况: 打开应用 ,推送信息 会通过 - (BOOL)appli

iOS远程推送原理及实现过程

推送通知,是现在的应用必不可少的功能.那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题.那么首先让我们准备一些做推送需要的东西.我们需要一个付费的苹果开发者账号(免费的不可以做远程推送),有了开发者账号,我们可以去苹果开发者网站,配置自己所需要的推送的相关证书.然后下载证书,供我们后面使用,详细的证书配置过程,我们下面再说. 首先我们要说说iOS推送通知的基本原理: 苹果的推送服务通知是由自己专门的推送服务器AP

IOS之推送通知(本地推送和远程推送)

推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification):手机应用本身的通知,比如:闹铃 远程推送通知:(Remote Notification)从服务器发送过来的通知 推送通知的作用:让不在前台运行的App,告知用户App内部发生了什么事情.比如我们正在聊微信,突然界面上面出现了黑色半透明横幅(QQ好友给你发送的消息)这就是一个推送通知. 推送通知的呈

玩转ios友盟远程推送,16年5月图文防坑版

最近有个程序员妹子在做远程推送的时候遇到了困难,求助本帅.尽管本帅也是多彩的绘图工具,从没做过远程推送,但是本着互相帮助,共同进步的原则,本帅还是掩饰了自己的彩笔身份,耗时三天(休息时间)帮她完成了推送功能.PS:三天只打了一局dota,你们就知道这有多难,多耗时了.(其实并没有,真正做过一次就知道这其实很简单了,现在有程序媛再找本帅做推送,简直就是分分钟的事). 对不起请允许我这一次! 鉴于这次做推送的时间绝大多数都浪费在了"寻找教程->教程有误(更新不及时)->寻找教程"