适配 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 风格了…
适配 iOS 8 时遇到的问题两则:远程推送和 Unwind Segue的更多相关文章
- iOS---iOS10适配iOS当前所有系统的远程推送
一.iOS推送通知简介 众所周知苹果的推送通知从iOS3开始出现, 每一年都会更新一些新的用法. 譬如iOS7出现的Silent remote notifications(远程静默推送), iOS8出 ...
- IOS JPush 集成步骤(极光远程推送解决方案,支持android和iOS两个平台)
● 什么是JPush ● 一套远程推送解决方案,支持android和iOS两个平台 ● 它能够快捷地为iOS App增加推送功能,减少集成APNs需要的工作量.开发复杂 度 ● 更多的信息,可 ...
- IOS本地,APNS远程推送(具体过程)
添加本地推送 ///本地添加 -(void)addLocalPushNotification:(UIButton*)sender; { NSLog(@"%s",__FUNCTION ...
- iOS远程推送原理及实现过程
➠更多技术干货请戳:听云博客 推送通知,是现在的应用必不可少的功能.那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题 ...
- iOS 远程推送通知
1.什么是推送通知 在某些特殊情况下,应用程序被动收到的以不同种界面形式出现的提醒信息 推送通知的作用:可以让不在前台运行的app通知app发生了改变 iOS中得推送通知种类 远程推送通知(Remot ...
- iOS远程推送1
一.APNS 远程推送 1.所有的苹果设备,在联网状态下,都会与苹果服务器建立长连接. 2.长连接:就是只要联网了,就一直建立连接. 3.长连接的作用:时间校准,系统升级,查找我的iPhone. 4. ...
- IOS之推送通知(本地推送和远程推送)
推送通知和NSNotification是有区别的: NSNotification:是看不到的 推送通知:是可以看到的 IOS中提供了两种推送通知 本地推送通知:(Local Notification) ...
- iOS开发笔记10:圆点缩放动画、强制更新、远程推送加语音提醒及UIView截屏
1.使用CAReplicatorLayer制作等待动画 CALayer+CABasicAnimation可以制作很多简单的动画效果,之前的博客中介绍的“两个动画”,一个是利用一张渐变色图片+CABas ...
- iOS开发中的远程推送实现(最新,支持iOS9)
我的个人项目<丁丁印记>中加入了远程推送功能,按照操作说明去做还是比较容易实现的,但是学的不够不系统,而且iOS8之后的推送和之前的版本是有所不同的,因此这篇文章希望总结一下最新的iOS推 ...
随机推荐
- C#-常用对象-思维导图
C#-常用对象-思维导图 链接:http://pan.baidu.com/s/1jHNgS78 密码:3i74 如有错误,请告知我!
- 洛谷 P1461 海明码 Hamming Codes
P1461 海明码 Hamming Codes 题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B &l ...
- 使用docker搭建hadoop分布式集群
使用docker搭建部署hadoop分布式集群 在网上找了非常长时间都没有找到使用docker搭建hadoop分布式集群的文档,没办法,仅仅能自己写一个了. 一:环境准备: 1:首先要有一个Cento ...
- 黑马day14 过滤器概述&生命周期&运行过程
过滤器:当訪问一个web资源的时候,过滤器就在你訪问这个web资源的前进行拦截...在放行过后...filter过滤器也能够做一些其它的事情. 编写过滤器的步骤: 1.写一个过滤器类实现filter接 ...
- swift学习第四章
// Playground - noun: a place where people can play import UIKit var age=100 //假设年龄不大于50的就会在这里断言,和之前 ...
- Python一行代码获得IP地址
比较靠谱的方法, 通过构造UDP包获得本机IP地址 python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.gets ...
- node,koa 图片批量添加水印,可手动配置水印位置
公司设计在处理京东上架商品图片的时候,需要给设计好的图片添加京东的“logo”,并且logo位置得根据图片来摆放,需要通过计算得出logo位置.那样太麻烦了,于是就用node,koa写了批量给图片添加 ...
- WinForm关于listview的用法介绍
public Form1() { InitializeComponent(); //控件的行为 listView1.Bounds = , ), , ));//相对位置 listView1.View = ...
- 你不知道的JavaScript博文参考书籍
you don't know js系列书籍是谷歌地图开发人员编写,内容非常好,四卷已收集齐全. 笔者打包上传到了CSDN,下载地址: http://download.csdn.net/detail/r ...
- (转载)JS与WebView交互存在的一些问题
JS与WebView交互存在的一些问题 作者 隔壁的李小宝 关注 2015.06.09 19:30 字数 2896 阅读 11117评论 3喜欢 35 一.背景概述 2013年Android平台暴露出 ...