lua in iOS App
创始人
2025-01-10 18:00:13
0次

起源

其实很早我在参加一个沙龙的时候,就听到了点评的同学在用lua做ab test,虽然那个时候我觉得我自己很牛逼了,但是其实还是啥都没有听懂,直到今天才回过神来仔细看了下这个东西。

Lua(简称撸啊)在iOS中的确被广泛的使用着,在行业中***的莫过于魔兽世界(山口山)以及移动互联网的愤怒的小鸟。

Lua在cocos2d以及iOS的应用动态变化上面使用比较广泛,下面我们用两个例子来说明下。
框架

不得不说,***的莫过于wax和waxpatch,一个是能够在iOS中使用lua语言编写界面控件,一个是能够动态更新。
wax

我们首先先要下载wax.framework,然后新建一个iOS app的project,将该模块添加到我们的工程中去。

接着我们需要在 AppDelegate.h import #import

在AppDlegate的实现中增加

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
  2.     // Override point for customization after application launch. 
  3.     wax_start("init.lua", nil); 
  4.     return YES; 
  5. } 

接着我们来增加这个 init.lua ,如下代码,其实就如同ViewController头文件定义一样。

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
  2.     // Override point for customization after application launch. 
  3.     wax_start("init.lua", nil); 
  4.     return YES; 
  5. } 

有了头文件之后我们也需要有实现吧,这个代码可读性就比oc来的高多了,但是需要在***行声明在oc中的这个类名。

  1. waxClass{"ViewController", UIViewController} 
  2.   
  3. function viewDidLoad(self) 
  4. self.super:viewDidLoad(self) 
  5.   
  6. local label = UILabel:initWithFrame(CGRect(0, 120, 320, 40)) 
  7. label:setColor(UIColor:blackColor()) 
  8. label:setText("Hello Wax!") 
  9. label:setTextAlignment(UITextAlignmentCenter) 
  10. local font = UIFont:fontWithName_size("Helvetica-Bold",50) 
  11. label:setFont(font) 
  12. self:view():addSubview(label) 
  13. end 

先不要急着编译,我们还需要更改一下编译的方式以及确认framework已经被准确导入

我们来看下效果:

 

waxpatch

waxpatch完全就是基于这个wax的框架之上去做的一个动态更新的组件了。我们来看下动态更新的流程。

***步:增加一个加载的协议

增加一个 ProtocolLoader.h ,其中添加需要去动态更新的组建名称。

  1. #import < UIKit/UIKit.h> 
  2.   
  3. @interface ProtocolLoader : NSObject < UIApplicationDelegate, UIWebViewDelegate, UIActionSheetDelegate, UIAlertViewDelegate, UISearchBarDelegate, UITextViewDelegate, UITabBarControllerDelegate> {} 
  4. @end 
  5.   
  6. @implementation ProtocolLoader 
  7. @end 

第二步:声明需要加载的远程服务器地址,并且增加解压缩的头文件和实现

我在 AppDelegate.m 中先声明了我远程更新库的地址:

  1. #define WAX_PATCH_URL @"https://github.com/monkeytest15/waxDemo/raw/master/patch.zip" 

同时增加解压缩实现:

第三步:加载

当然,我们都会理解为加载的逻辑是在 AppDelegate.m 中实现的,不过其实在该文件中只是调用了加载这个方法,具体的实现我在debug的过程发现在 wax.m 的文件中,核心代码如下:

  1. // Load stdlib 
  2.     // --------------- 
  3.     #ifdef WAX_STDLIB  
  4.         // If the stdlib was autogenerated and included in the source, load 
  5.         char stdlib[] = WAX_STDLIB; 
  6.         size_t stdlibSize = sizeof(stdlib); 
  7.     #else 
  8.         char stdlib[] = "require 'wax'"; 
  9.         size_t stdlibSize = strlen(stdlib); 
  10.     #endif 
  11.   
  12.     if (luaL_loadbuffer(L, stdlib, stdlibSize, "loading wax stdlib") || lua_pcall(L, 0, LUA_MULTRET, 0)) { 
  13.         fprintf(stderr,"Error opening wax scripts: %s\n", lua_tostring(L,-1)); 
  14.     } 

加载之后就会动态的加载我们远程服务端的逻辑.
远程zip包

接着我们来看下远程服务端上都有什么,远程服务端可以自己定义zip包的名字以及内容,但约定的内容是必须有一个patch.lua文件以及其他的.lua的文件,patch.lua中是需要定义本次更新的View的主类名称。比如 require "MainViewController"

而其他的类自然就是需要更新的逻辑,如:

  1. waxClass{"MainViewController", UITableViewController} 
  2.   
  3. function tableView_cellForRowAtIndexPath(self, tableView, indexPath) 
  4.     local cell = self:ORIGtableView_cellForRowAtIndexPath(tableView, indexPath) 
  5.     cell:textLabel():setText("" .. (20 - indexPath:row())) 
  6.     cell:detailTextLabel():setText("This is monkey") 
  7.     cell:textLabel():setTextColor(UIColor:blueColor()) 
  8.     return cell 
  9. end 

动态效果

然后我们来看下我更新之后的效果吧:

原文链接:http://blog.sina.com.cn/s/blog_7022adbf0102vcg3.html

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
只需三步,让你掌握阿尔法路由器... 请参照以下阿尔法路由器设置方法,通过浏览器进入及设置宽带路由器。经过这三个步骤的设置,基本上能够熟悉...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何更省钱? 近期特价热门硒鼓... 如今激光打印设备已经成为商务或企业的绝对主力办公设备,但采购者往往忽视了激光打印设备所用的耗材,相对...