剑客
关注科技互联网

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

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
)关注我们。

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址