使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器

iOS 开发过程中,调试 UI,因为官方开发环境不足,一般都是配合 Reveal这种工具,来调试修改,后来苹果推出 Swift 的时候,引入了 Playground,Xcode 中也增加了 UIView Debug,这样一来就简化了 View 层的调试难度。然而因为两者各自有问题:

Playground:

  • 不是在完整的应用执行环境中执行的
  • 设置 View 属性不够灵活,只能通过 Playground 中的代码来执行

Reveal:

  • 能设置的属性有限
  • 能设置控件的属性有限

此外这两种方式都没有交互执行代码的能力。一般解释执行的语言都带这个福利,一边调试一边写代码,效率飙升。Swift 中带一个环境,然而也不是完整的环境。


是时候让 RubyMotion 出场了。这个项目好几年了,目标是拿 Ruby 来写移动端的项目,听起来很 Cool,然而因为各种原因,最终没发展起来,我感觉以后也够呛,有些狗注定单身,有些项目注定小众。项目的作者也是 MacRuby 的作者,有兴趣自己了解,不赘述。

RubyMotion 的思路是用 Ruby 代码根据一定规范,去调用各个平台的接口,然后它从中间做一些兼容和转换,因为有完整的兼容层和解释器,所以拿来做 iOS 环境的解释器十分合适。


首先来注册个免费账户:

http://www.rubymotion.com/cn/download/starter/

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第1张图片

然后会给你邮箱发个 Key,和下载地址。安装的时候输入那个 Key 就能继续了。

我曾经满心欢喜花 199 刀买了一个收费版(当时还没有免费版),一年多后才用 RubyMotion 把这个钱给挣回来……

安装完毕后在终端下执行 motion create testApp:

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第2张图片

这样就创建了一个 iOS 工程。进去执行 Rake:

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第3张图片

然后一片空白:

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第4张图片

很好,执行起来了。现在你已经得到一个完整的交互式 iOS 执行环境了。

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第5张图片

还支持 tab 键列出方法名。

切换到模拟器界面,然后按 cmd 键在空白的地方,会发现出现一个红线,点一下然后切换到终端:

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第6张图片

可以看到终端的标签变成了这个 View,你已经进入了这个 View 的内部了。调整个背景色看看:

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第7张图片

添加个子视图:

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第8张图片
使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第9张图片

这样已经能用了,然而命令还是有些繁琐,在 Ruby 社区里,大家都想法儿少写代码。我们引入 SugarCube 这个项目。在 Gemfile 中增加:

source 'https://rubygems.org'

gem 'rake'
# Add your dependencies here:

gem 'sugarcube', :require => [
  'sugarcube',
  'sugarcube-repl',
  'sugarcube-factories',
  'sugarcube-ui',
  'sugarcube-color',
  'sugarcube-foundation',
  'sugarcube-constants',
  'sugarcube-timer',
  'sugarcube-notifications',
  'sugarcube-nsuserdefaults',
  'sugarcube-gestures',
  'sugarcube-nsdata'
]

这下就好写多了。

这个项目还对 REPL 增加了各种优化,比如查找当前应用的所有 Controller,当前的视图,等便利的操作。详情参考文档

使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器_第10张图片

这时这个调试环境就很具可用性了。


我开发维护过几个 RubyMotion 的项目,并不是很推荐使用 RubyMotion 作为移动端开发,原因这个社区的老哥已经说的很清楚了:Why I stopped using RubyMotion,不过拿来当一个辅助工具使用,还是极好的。

你可能感兴趣的:(使用 RubyMotion 构建一个完整的 iOS 交互执行环境的解释器)