iOS 앱에서 LuaSocket을 어떻게 사용할 수 있습니까?

빨다

Lua스크립트 를 실행할 수있는 iOS 앱을 개발 중입니다. 기본 lua지원 을와 쉽게 통합 할 수 CocoaPods있지만 LuaSocket라이브러리를 추가하려면 어떻게 해야합니까? 일부 파일이 LuaSocket포함되어 있습니다. 누구든지 아이디어가 있습니까? 감사합니다!CLua

매튜 버크

iOS 8에서 동적 프레임 워크 (라이브러리)를 허용하는 경우보다 우아한 접근 방식이있을 수 있지만 다음은 Lua 5.2.3 ( Cocoapods를 사용하고 5.2.3이 Cocoapod에서 제공하는 버전 임 ) 및 LuaSocket 3.0-rc1에서 작동 합니다.

실제로 Cocoapod를 사용하고 있지 않습니다. iOS 프로젝트에 Lua를 포함하는 것은 Cocoapods를 사용하는 데 문제가 없을만큼 간단합니다. YMMV. 경로 차이로 인해 아래에서 설명하는 내용을 약간 조정해야 할 수도 있습니다.

  1. 새로운 iOS 'Single View'프로젝트 생성
  2. XCode의 프로젝트 탐색기에서 Lua라는 그룹을 만듭니다.
  3. srcLua 다운로드 디렉토리의 모든 파일 (lua.c, luac.c, lua.hpp 및 makefile 제외)을이 그룹으로 복사합니다.
  4. XCode의 프로젝트 탐색기에서 LuaSocket이라는 그룹을 만듭니다.
  5. srcLuaSockets 다운로드 디렉토리의 모든 파일 (makefile, wsocket.c, wsocket.h 제외)을이 그룹에 복사합니다.
  6. #import "luasocket.h"LuaSocket 소스의 serial.h 파일에 추가하십시오.

이 시점에서 오류없이 앱을 빌드하고 실행할 수 있어야합니다. 물론 아직 아무것도하지 않습니다 ...

먼저 luaL_openlibsLuaSocket의 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}
};

linit.c의 맨 위에 #include "luasocket.h"추가해야합니다 #include "mime.h".

이 목록에 추가하고 싶은 몇 가지 다른 C 함수 (예 :) luaopen_socket_unix가 있지만 독자를위한 연습용으로 포함하도록하겠습니다.

이제 socket.lua 및 mime.lua와 같이 LuaSocket에 포함 된 다양한 Lua 소스 파일을 살펴 보겠습니다. 를 사용 require하여로드하는 대신을 사용하여 실행할 것입니다 luaL_dofile.

구체적으로보기 위해 LuaSocket을 사용하여 뷰 컨트롤러에 대한 초기화를 수행한다고 가정합니다. 코어 라이브러리와 LuaSocket의 C 라이브러리를 초기화하기 위해 viewDidLoad, 에서 Lua 상태를 생성 luaL_openlibs하고 .NET의 루틴을 사용하여 실행하려는 Lua 파일의 파일 경로를 가져옵니다 NSBundle.

Lua 파일을 편집하여 requiresocket.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]);
}

여전히 몇 가지 느슨한 끝이 있지만 이것이 주요 요점을 보여줄 것입니다. 내가 Github에서 만든 예제 프로젝트를 볼 수 있습니다 . 앞으로 며칠 동안 정리하고 LuaSocket의 기능을 더 많이 시연 할 것입니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

내 앱은 사용자의 iOS 기기에있는 소셜 앱을 어떻게 식별 할 수 있습니까?

분류에서Dev

Ruby on Rails 앱에서 postgresql "inner join"을 어떻게 사용할 수 있습니까?

분류에서Dev

IOS 용 ionic 4에서 크롬 캐스트 사용을 어떻게 사용할 수 있습니까?

분류에서Dev

Windows에서 TortoiseSVN을 어떻게 사용할 수 있습니까?

분류에서Dev

Javascript에서 DOMStringMap을 어떻게 사용할 수 있습니까?

분류에서Dev

if 문에서 OR을 어떻게 사용할 수 있습니까?

분류에서Dev

CucumberJS에서 Jasmine을 어떻게 사용할 수 있습니까?

분류에서Dev

iOS 앱에서 특정 레벨을 어떻게 잠그고 잠금 해제 할 수 있습니까?

분류에서Dev

Meteor Cordova에서 iOS 앱 구성을 어떻게 영구적으로 변경할 수 있습니까?

분류에서Dev

앱 서랍과 앱 헤더에서 동일한 메뉴 항목을 어떻게 사용할 수 있습니까?

분류에서Dev

IOS14에서 여러 fullScreenCover를 어떻게 사용할 수 있습니까?

분류에서Dev

iOS 앱 파일 (.ipa)을 어떻게 디버깅 할 수 있습니까?

분류에서Dev

ionic 3 앱에서 사용 가능한 RAM을 어떻게 확인할 수 있습니까?

분류에서Dev

Flutter 앱에서 Facebook 사용자 로그인 세션을 어떻게 저장할 수 있습니까?

분류에서Dev

새 앱에서 Android 기본 아이콘을 어떻게 사용할 수 있습니까?

분류에서Dev

함수에서 별칭을 어떻게 사용할 수 있습니까?

분류에서Dev

Heroku의 Rails 앱에서 npm을 어떻게 실행할 수 있습니까?

분류에서Dev

ionic 2 앱에서 여러 탭을 어떻게 표시 할 수 있습니까?

분류에서Dev

Linux에서 Foundation의 URLRequest 유형을 어떻게 사용할 수 있습니까?

분류에서Dev

nextjs에서 application / ld + json을 어떻게 사용할 수 있습니까?

분류에서Dev

JS 파일에서 Github 비밀을 어떻게 사용할 수 있습니까?

분류에서Dev

vue에서 v-html을 어떻게 사용할 수 있습니까?

분류에서Dev

nunit TestCases에서 튜플을 어떻게 사용할 수 있습니까?

분류에서Dev

React App에서 DataTable을 어떻게 사용자 정의 할 수 있습니까?

분류에서Dev

VS Code에서 Intellisense for Selenium을 어떻게 사용할 수 있습니까?

분류에서Dev

Vue 구성 요소에서 Bootstrap을 어떻게 사용할 수 있습니까?

분류에서Dev

podman에서 --network 옵션을 어떻게 사용할 수 있습니까?

분류에서Dev

맵에서 어떻게 비트 셋을 사용할 수 있습니까?

분류에서Dev

fastify에서 ajv-i18n을 어떻게 사용할 수 있습니까?

Related 관련 기사

  1. 1

    내 앱은 사용자의 iOS 기기에있는 소셜 앱을 어떻게 식별 할 수 있습니까?

  2. 2

    Ruby on Rails 앱에서 postgresql "inner join"을 어떻게 사용할 수 있습니까?

  3. 3

    IOS 용 ionic 4에서 크롬 캐스트 사용을 어떻게 사용할 수 있습니까?

  4. 4

    Windows에서 TortoiseSVN을 어떻게 사용할 수 있습니까?

  5. 5

    Javascript에서 DOMStringMap을 어떻게 사용할 수 있습니까?

  6. 6

    if 문에서 OR을 어떻게 사용할 수 있습니까?

  7. 7

    CucumberJS에서 Jasmine을 어떻게 사용할 수 있습니까?

  8. 8

    iOS 앱에서 특정 레벨을 어떻게 잠그고 잠금 해제 할 수 있습니까?

  9. 9

    Meteor Cordova에서 iOS 앱 구성을 어떻게 영구적으로 변경할 수 있습니까?

  10. 10

    앱 서랍과 앱 헤더에서 동일한 메뉴 항목을 어떻게 사용할 수 있습니까?

  11. 11

    IOS14에서 여러 fullScreenCover를 어떻게 사용할 수 있습니까?

  12. 12

    iOS 앱 파일 (.ipa)을 어떻게 디버깅 할 수 있습니까?

  13. 13

    ionic 3 앱에서 사용 가능한 RAM을 어떻게 확인할 수 있습니까?

  14. 14

    Flutter 앱에서 Facebook 사용자 로그인 세션을 어떻게 저장할 수 있습니까?

  15. 15

    새 앱에서 Android 기본 아이콘을 어떻게 사용할 수 있습니까?

  16. 16

    함수에서 별칭을 어떻게 사용할 수 있습니까?

  17. 17

    Heroku의 Rails 앱에서 npm을 어떻게 실행할 수 있습니까?

  18. 18

    ionic 2 앱에서 여러 탭을 어떻게 표시 할 수 있습니까?

  19. 19

    Linux에서 Foundation의 URLRequest 유형을 어떻게 사용할 수 있습니까?

  20. 20

    nextjs에서 application / ld + json을 어떻게 사용할 수 있습니까?

  21. 21

    JS 파일에서 Github 비밀을 어떻게 사용할 수 있습니까?

  22. 22

    vue에서 v-html을 어떻게 사용할 수 있습니까?

  23. 23

    nunit TestCases에서 튜플을 어떻게 사용할 수 있습니까?

  24. 24

    React App에서 DataTable을 어떻게 사용자 정의 할 수 있습니까?

  25. 25

    VS Code에서 Intellisense for Selenium을 어떻게 사용할 수 있습니까?

  26. 26

    Vue 구성 요소에서 Bootstrap을 어떻게 사용할 수 있습니까?

  27. 27

    podman에서 --network 옵션을 어떻게 사용할 수 있습니까?

  28. 28

    맵에서 어떻게 비트 셋을 사용할 수 있습니까?

  29. 29

    fastify에서 ajv-i18n을 어떻게 사용할 수 있습니까?

뜨겁다태그

보관