ios - 如何在 iOS 应用中使用 LuaSocket?

标签 ios objective-c lua cocoapods luasocket

我正在开发一个可以运行的iOS应用Lua脚本,我可以轻松集成基础 lua支持 CocoaPods , 但是我怎样才能添加 LuaSocket图书馆进吗? LuaSocket包含一些 C还有一些 Lua文件,有人有想法吗?谢谢!

最佳答案

iOS 8 允许动态框架(库)可能有更优雅的方法,但以下适用于 Lua 5.2.3(因为您使用的是 Cocoapods,而 5.2.3 是 Cocoapod 提供的版本)和 LuaSocket 3.0-rc1 .

请注意,我实际上并没有使用 Cocoapod;在你的 iOS 项目中包含 Lua 非常简单,我发现使用 Cocoapods 不值得。 YMMV。由于路径差异,您可能需要对我在下面描述的内容进行一些调整。

  • 创建一个新的 iOS 'Single View' 项目
  • 在 XCode 的项目导航器中创建一个名为 Lua 的组
  • src 复制所有文件(除了 lua.c、luac.c、lua.hpp 和 makefile) Lua目录下下载到本组
  • 在 XCode 的项目导航器中创建一个名为 LuaSocket 的组
  • src 复制所有文件(除了 makefile、wsocket.c、wsocket.h) LuaSockets目录下下载到本组
  • 添加行 #import "luasocket.h"到 LuaSocket 源中的文件 serial.h

  • 此时,您应该能够构建和运行应用程序而不会出现任何错误。当然,它还没有真正做任何事情......

    首先,我们要修改luaL_openlibs使其初始化 LuaSocket 的 C 代码如下。

    在 Lua 源中,找到文件 linit.c 并更改
    static const luaL_Reg loadedlibs[] = {
      {"_G", luaopen_base},
      {LUA_LOADLIBNAME, luaopen_package},
      {LUA_COLIBNAME, luaopen_coroutine},
      {LUA_TABLIBNAME, luaopen_table},
      {LUA_IOLIBNAME, luaopen_io},
      {LUA_OSLIBNAME, luaopen_os},
      {LUA_STRLIBNAME, luaopen_string},
      {LUA_BITLIBNAME, luaopen_bit32},
      {LUA_MATHLIBNAME, luaopen_math},
      {LUA_DBLIBNAME, luaopen_debug},
      {NULL, NULL}
    };
    


      {"_G", luaopen_base},
      {LUA_LOADLIBNAME, luaopen_package},
      {LUA_COLIBNAME, luaopen_coroutine},
      {LUA_TABLIBNAME, luaopen_table},
      {LUA_IOLIBNAME, luaopen_io},
      {LUA_OSLIBNAME, luaopen_os},
      {LUA_STRLIBNAME, luaopen_string},
      {LUA_BITLIBNAME, luaopen_bit32},
      {LUA_MATHLIBNAME, luaopen_math},
      {LUA_DBLIBNAME, luaopen_debug},
      {"socket", luaopen_socket_core},
      {"mime", luaopen_mime_core},
      {NULL, NULL}
    };
    

    您需要添加 #include "luasocket.h"#include "mime.h"在 linit.c 的顶部。

    您还需要将一些其他 C 函数添加到此列表中,例如 luaopen_socket_unix ,但我会将它们作为练习留给读者。

    现在我们将转向 LuaSocket 中包含的各种 Lua 源文件,例如 socket.lua 和 mime.lua。而不是使用require要加载这些,我们将使用 luaL_dofile 执行它们.

    为了具体一点,假设我们想使用 LuaSocket 为我们的 View Controller 做一些初始化。我们将在 viewDidLoad 中创建 Lua 状态, 调用luaL_openlibs , 初始化核心库和 LuaSocket 的 C 库,然后我们将使用 NSBundle 中的例程获得要运行的 Lua 文件的文件路径.

    我们需要编辑 Lua 文件以删除 require 的所有行。 socket.core、mime.core 等,因为这比尝试获取 require 更简单行为正确。此外,socket.core 和 mime.core 已经被我们修改过的 luaL_openlibs 初始化了。 ,所以不需要require他们。

    所以viewDidLoad看起来像这样:
    - (void)viewDidLoad
    {
      [super viewDidLoad];
    
      lua_State *L = luaL_newstate();
      luaL_openlibs(L);
    
      // Load socket.lua and mime.lua
    
      NSString *fp = [[NSBundle mainBundle] pathForResource:@"socket" ofType:@"lua"];
      luaL_dofile(L, [fp cStringUsingEncoding:NSUTF8StringEncoding]);
    
      fp = [[NSBundle mainBundle] pathForResource:@"mime" ofType:@"lua"];
      luaL_dofile(L, [fp cStringUsingEncoding:NSUTF8StringEncoding]);
    
      lua_settop(L, 0); // ignore return values from the calls to dofile
    
    
      // Now do something with the Lua state and LuaSockets
    
      NSString *script = @"res = mime.b64('LuaSocket', 'works')";
      luaL_dostring(L, [script cStringUsingEncoding:NSUTF8StringEncoding]);
      lua_getglobal(L, "res");
      const char *s  = luaL_checkstring(L, 1);
      NSLog(@"res = %@", [NSString stringWithCString:s encoding:NSUTF8StringEncoding]);
    }
    

    还有一些松散的结局,但这应该说明要点。您可以查看 example project我在 Github 上创建的。在接下来的几天里,我会清理它并展示更多 LuaSocket 的功能。

    关于ios - 如何在 iOS 应用中使用 LuaSocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28382583/

    相关文章:

    objective-c - 如何在我的 iOS 应用程序中从 SHOUTCast 流式传输在线广播?

    iphone - 获取元素的位置

    ios - 如何为 Twitter/action sheet 设置社交分享异常(exception)?

    ios - 在 Swift iOS 中未调用 Google Places 回调

    android - 为什么 React Native WebView 会转到 :blank in release build? 左右

    c++ - 从 lua 调用 c++ 函数传递更少的参数

    c - 如何将 lua 字符串转换为 C char*?

    c - 如何在C中读取lua表

    ios - 如何像3D touch一样做出像背景一样的模糊效果

    ios - 在项目中有多个目标时如何使用结构