适配 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推 ...
随机推荐
- 关于使用动态语言运行时 (. net)
AutoCAD Managed .NET API允许您使用使用. NET 4.0 引入的动态语言运行时 (DLR). 使用DLR可以直接访问对象, 而无需: 打开一个对象进行读取或写入, 然后在完成后 ...
- nginx 查看每秒有多少访问量
nginx访问量统计 1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l 2.统计访问URL统计PV awk '{print ...
- 求第K大的数字
除了用最大堆(求最小的K个数)或最小堆(求最大的K个数) 可以用partition,然后直到返回index为k为止.参数可以是实际下标.然后返回index,就是partition的pivot的位置.
- 认识一下Kotlin语言,Android平台的Swift
今天在CSDN首页偶然看到一个贴子JetBrains正式公布Kotlin 1.0:JVM和Android上更好用的语言 看完后,感觉Kotlin语法非常简洁,有一系列动态语言的特点,Lambda表达式 ...
- hdu2546 饭卡 01-背包问题
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 Problem ...
- lscript.ld 链接器脚本
sumary选项卡 lscript.ld是这个应用程序的链接器脚本. 这是实用的作为一个报告 看看内存是针相应用程序. 它也能够被编辑以改变应用程序的位置.双击Hello_Zynqàsrcà lscr ...
- 使用LSTM做电影评论负面检测——使用朴素贝叶斯才51%,但是使用LSTM可以达到99%准确度
基本思路: 每个评论取前200个单词.然后生成词汇表,利用词汇index标注评论(对 每条评论的前200个单词编号而已),然后使用LSTM做正负评论检测. 代码解读见[[[评论]]]!embeddin ...
- 【实战经验】64位Win7安装+32位Oracle + PL/SQL 解决方法
软件环境:64位win7.32位Oracle 10g. PL/SQL 9.0.4.1644 前言:以前开发用的都是32位系统,突然换到64位上,安装环境真的有点麻烦了,尤其对于PL/SQL只支持32位 ...
- Codeforces 982 C. Cut 'em all!(dfs)
解题思路: 代码中有详细注解,以任意一点为根,dfs遍历这棵树. 每一个节点可能有好几个子树,计算每棵子树含有的节点数,再+1即为这整棵树的节点. 判断子树是否能切断与根之间的联系,如果子树含有偶数个 ...
- Glidar测试安装
在上一篇随笔中,我们完成了对Glidar 仿真器的概念层面的认识.接下来,我们将着手对该该仿真器进行安装测试. 1 依赖库的安装 安装环境为Windows 7 64位+Ubuntu14.04 LTS的 ...