适配 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推 ...
随机推荐
- Nutch2 WebPage 字段解释
Nutch2 WebPage 字段解释 Nutch2.2.1 id
- 洛谷—— P3388 【模板】割点(割顶)
https://www.luogu.org/problem/show?pid=3388 题目背景 割点 题目描述 给出一个n个点,m条边的无向图,求图的割点. 输入输出格式 输入格式: 第一行输入n, ...
- AIX查看某个端口被哪个进程占用
AIX查看某个端口被哪个进程占用 学习了:https://zhidao.baidu.com/question/1928716757722021467.html 1. netstat -Aan|grep ...
- Oracle字符乱码、数据越界訪问典型Bug分析
Oracle字符乱码.数据越界訪问典型Bug分析 前言: 作为乙方,在甲方客户那里验收阶段发现两个诡异Bug. 下面就问题来源.问题根因.解决方式.怎样避免做具体描写叙述. .且两 ...
- ffmpeg在android上输出滑屏问题处理
ffmpeg部分机器上有花屏的问题 原代码例如以下: while(av_read_frame(formatCtx, &packet)>=0 && !_stop & ...
- sql server2008对字符串日期字段分区
近期对公司产品的日志数据库做了一个数据分区,数据库使用的是sql server 2008,这里给大家提供一个參考. 须要特别说明的是,非常多网上的样例分区字段都使用的是时间类型的.而这里因为时间字段原 ...
- 千万别相信鲁大师的硬件測温柔CPU測温功能!!
非常多人本来随手安装的一个软件. 相信也信任得过它 . 这下让我測试对它失望了.没想到鲁大师这个測温功能实在太搓了!! 白白浪费了我一晚上, 搞来了硅胶 ,弄了几遍 , 还是一样, 还以为买了水货 ...
- 143.vector模板库
myvector.h #pragma once #include <initializer_list> #include <iostream> using namespace ...
- Android 设置AlertDialog的大小 .
AlertDialog dialog = builder.setTitle("消息列表") .setView(layout) .create(); dialog.show(); / ...
- (转载) android项目大全,总有你所需的
目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 [置顶] android项目大全,总有你所需的 标签: 源 ...