FinOps有望降低企业50%+的云成本! 了解详情
写点什么

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

  • 2016-11-16
  • 本文字数:1198 字

    阅读完需:约 4 分钟

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

2016-11-16 18:001618
用户头像

发布了 33 篇内容, 共 99867 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营第 1 期 - 作业提交

Todd-Lee

极客大学架构师训练营

第十二周作业

Jam

UML 练习

黄立

作业

项目滞后,如何让自己的技术快速成长

郎哲158

个人成长 舒适区 熟练工

RxSwift和RxCocoa入门

teoking

ios swift

week1-UML图

张兵

极客大学架构师训练营

区块链将掀开人类的伟大时代

CECBC

区块链 智能合约 价值物联网

中国法定数字货币发展新机遇

CECBC

数字货币 数字经济

第六周作业

Jam

食堂就餐卡系统设计

应鹏

极客大学架构师训练营

架构方法--课后练习

Nick~毓

我们需要软件工艺

Bruce Talk

敏捷 随笔 Agile

架构师训练营第一周作业

木头发芽

架构师训练营大作业二

Hanson

Spring Cloud 微服务实践 (3) - 服务间的调用

xiaoboey

Spring Cloud 熔断 服务调用 Feign

oeasy 教您玩转 linux 之 010302 火狐浏览器 firefox

o

只要我跑的够快,内卷它就卷不到我,一名高中生是如何做到在疫情下涨薪70%的?

程序员DMZ

面试 程序人生

go runtime debug 小技巧

Gopher指北

debug 后端 runtime Go 语言

架构师训练营第一周

子青

网络安全中的机器学习-恶意软件安装

计算机与AI

学习 网络安全

架构师训练营大作业一同城快递

Hanson

Spring事件执行流程源码分析

编号94530

spring Spring Cloud 源码阅读 事件监听

架构师训练营大作业

吴吴

食堂就餐卡系统设计

……

极客大学--架构师训练营1期-第一周总结(vaik)

行之

电商管理系统之交易子系统设计(一)

长沙造纸农

系统设计 产品经理 系统架构 订单管理 电商平台

第十三周作业

Jam

采用docker相关测试

菜鸟小sailor 🐕

Nacos如何实现服务自动注册

编号94530

spring nacos 源码阅读 spring cloud alibaba

LeetCode题解:94. 二叉树的中序遍历,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

「架构师训练营第 1 期」-食堂卡管理系统

睡不着摇一摇

极客大学架构师训练营

  • 需要帮助,请添加网站小助手,进入 InfoQ 技术交流群
Rollout打算实现Swift iOS应用的在线更新_移动_Sergio De Simone_InfoQ精选文章