BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Rollout打算实现Swift iOS应用的在线更新

| 作者 Sergio De Simone 关注 12 他的粉丝 ,译者 王纯超 关注 0 他的粉丝 发布于 2016年11月17日. 估计阅读时间: 4 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

Rollout创建了能绕开AppStore评审流程的在线更新(live-update)原生Objective-C应用的解决方案 。它宣布该解决方案能支持Swift了。Rollout把这项在线更新Swift应用的技术叫伪方法偷换(pseudo method-swizzling)。

Rollout给Objective-C应用打补丁的机制是一项叫做方法偷换的动态编程技术。通过修改Objective-C运行时将方法签名关联到一个类中的某个函数的方式,开发人员能更改该方法的实现。被偷换的方法(swizzled method)会被完全替代或者被一个从Rollout云上下载下来的新实现简单包裹起来。Rollout允许开发人员使用JavaScript定义偷换方法(swizzling method),这是这项机制与苹果的指导方针兼容的关键。苹果的指导方针只允许下载在WebKit或者JavaScript Core上运行的代码。或者,使用预定义的模板作为Objective-C的补丁。这些模板用来完成特定的目标,例如给方法调用添加跟踪日志、禁用方法等等。

Swift不支持原生的方法偷换。所以正如Rollout的CTO Eyal Keren解释的,因为Swift没有运行时编程(runtime-programming )能力,针对Swift他们不得不开发出类似的东西来。简而言之,Rollout做的就是在Swift中间语言层(Swift Intermediate Language,SIL)给每个方法添加一个前缀来操作应用的。方法类似如下代码:


func add(a:Int, b:Int) -> Int {
if Rollout_shouldPatch(ROLLOUT_a79ee6d5a41da8daaa2fef82124dcf74) {
    let resultRollout : Int =
    Rollout_invokeReturn(Rollout_tweakData!,
        target:self,
        arguments:[a,
            b,
            origClosure: { args in return self.add(a:args[0],b:args[1]);});
    return resultRollout;

在上面的代码中,Rollout_invokeReturn负责执行一个从Rollout云下载的JavaScript函数。如果需要,该函数可以回调初始的方法。

Rollout能在多种情境中支持Objective-C。尽管Rollout在努力改进,但相比Rollout对Objective-C的支持而言,Rollout对Swift的支持仍然在起步阶段。尤其是:

  • Swift补丁不能执行原生的Swift方法,除非该方法就是被打补丁的方法或者带有@objc的方法。它也不能创建原生的Swift对象。
  • 仅仅能覆盖有限类型的返回值,例如String、Number、Optional和所有与Objective-C兼容的类。
  • 不能捕获Swift的原生异常。
  • 仍然不支持Swift的一些特性,例如静态类方法、重载实例方法、struct方法等等。

Rollout证实,以上列举的一些限制已经实现了,当前正处于beta测试中。

Rollout表明,它们的在线更新解决方案当前正用于数以千计的移动应用程序,绝对是符合苹果指导方针的正统解决方案

查看英文原文:Rollout Aims to Enable Live Updates for Swift iOS Apps


感谢冬雨对本文的审校。

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT