您当前的位置:科技评论网资讯正文

那些年 iOS 升级踩过的坑

放大字体  缩小字体 2019-08-28 22:47:36  阅读量:9390 作者:责任编辑。陈微竹0371

作者 |刘欣

责编|郭芮

每年iOS SDK的晋级关于从事iOS开发的同学来说,犹如噩梦一般,由于每次晋级都会带来大大小小的坑。信任每个iOS开发者都领会过其间的痛苦。今天和咱们共享一下我的一个与此相关的填坑阅历。记住那年,iPhone4和iPad2横空出世,是市面上的干流机型,iOS SDK版别仍是4.3。

功用需求

其时做的一个功用要求简化后大概是这样的:其时UIViewController是固定的,也便是不会pop其时的UIViewController,也不会push或许present新的UIViewController。其时UIViewController对应的UIView是分页的,左右滑动能够切换页面。这个功用要求是,左右滑动切换页面时,需求依据方针页面的方向设置,有时候需求强制旋转方针页面。比方,其时iPad的方向是横向(landscape),我向右滑动切换到第二页时,第二页只支撑纵向(portrait)方向,此刻需求将这一页强制转换为纵向方向。

最早的完成

众所周知,苹果一个比较坑的当地便是敞开的SDK是比较有限的,特别是其时的iOS SDK 4.3。许多功用通过敞开的API很欠好完成,上述的功用便是一个比如。当然,这难不倒我策天才般的iOS开发同学。一会就试出来实际上UIViewController上有一个私有办法(private method)就叫[UIViewController rotate],供给的功用刚好便是咱们需求的。但惋惜的是由于苹果审阅机制,它是不允许上架app中运用iOS SDK的私有办法的。(至今我仍是不明白为什么这个办法不给敞开出来给咱们用。)通过进一步的研讨,咱们测验出来的一个解决办法是这样的:

便是在其时的UIViewController上present一个新的UIViewController,然后立刻再dismiss掉。看起来如同啥事都没做。实际上这几行代码的仅有作用是让体系(UIKit)从头评价(re-evaluate)其时UIViewController应该处于的方向,也便是说旋转相关的体系回调函数[UIViewController shouldAutorotate]和[UIViewController supportedInterfaceOrientations]会被再次调用。此刻咱们能够趁机在这两个回调函数中回来适宜的值,使得其时的UIViewController的方向强制变成咱们所期望的。

赞,一个略显tricky可是完美的解决计划!产品司理看了很满足,大快人心。

榜首个坑来了

这个功用一向很好用,bug也根本没有。一切都这么完美,直到一年多后,某测验同学手里捧着晋级到iOS 5.0的iPad急吼吼跑到咱们的开发同学面前,“粗大事了!这功用彻底挂了!”(BTW,该测验同学现在已然是我司资深测验架构师)。略微调试一下就发现原因是在iOS SDK 5.0中,上面的这几行代码调用完今后,这次体系(UIKit)并不会从头评价其时UIViewController应该处于的方向,也意味着咱们并没有机会来改动其时UIViewController的方向了。苍天啊,大地啊!苹果你咋这么坑呢?行为改了也不说一声?其实前面那个办法苹果也没有在开发文档里提过,彻底是靠咱们自己试出来的,所以这个办法不论用了,也确实没地说理去。

假如找不到新的解决办法,可是会发生严峻的regression的!通过开发同学的不懈努力,愣是又找到一个办法:

其原理和上面那个办法相似。横竖便是要迫使体系(UIKit)从头评价其时UIViewController应该处于的方向。

赞,新的解决计划!Make MSTR mobile app great again!

第二个坑来了

又过了一年多,iOS6发布,仍是上面那位测验同学拿着晋级后的iPad又过来了,脸上写着“我就知道会这样”。提到:“额…你们快来看看!这个功用如同又挂了!”。其时咱们的榜首反应是iOS5的那个办法又不论用了,调试后承认公然是的。然后细心看了iOS SDK 6的文档,这次方向和旋转又换了新玩法:

意思咱们这次需求其时的UIViewController和它地点的UINavagationController一同改。所以新的解决计划是这样的,关于UIViewController,代码又变回和iOS4相同了:

关于UINavagationController,咱们需求承继或许运用method swizzling来改动[UIViewController shouldAutorotate]和[UIViewController supportedInterfaceOrientations]这两个回调函数的完成:

总算,在接下来的几年中,iOS SDK的晋级都没有影响这个功用了。但是最近又呈现了与这个功用相关的一个bug。接连屡次的意外让我对相关代码发生了置疑。终究,我眼中望着桌上一堆装有不同iOS版别的iPhone和iPad,手里抚摸着如丝般顺滑硬件指数爆表的iPhone Xs,鬼怪般的创意涌上心头。我忽然想到了一个终极完美解决计划,以确保这些相关代码再也不会由于iOS SDK晋级出问题了。

终究计划

我压服产品司理把这个功用去掉了。

作者:刘欣,微战略架构师。结业于清华大学电子系,2007年加入微战略。参加过微战略多个产品的研制,包含可视化引擎、移动端使用。现在担任微战略管理工具以及REST服务器的研讨开发作业。

声明:本文为作者投稿,版权归其所有。

【END】

热 文推 荐

你点的每个“在看”,我都仔细当成了喜爱

“如果发现本网站发布的资讯影响到您的版权,可以联系本站!同时欢迎来本站投稿!