[关闭]
@xxtouch 2017-11-19T08:15:05.000000Z 字数 119394 阅读 94430

XXTouch iOS 开发手册

XXTouch


Windows 平台按 Ctrl + F 可以输入文字搜索

Mac 平台按 command + F 可以输入文字搜索


关于 XXTouch

XXTouch 使用 Lua 作为脚本语言,支持 Lua 5.3 版的所有语法与基本函数,并于其基础之上添加了一些扩展功能, 用于取色、找色、发送触摸、键盘事件等高级功能的实现。XXTouch 仅支持 UTF-8 编码的脚本。


如何阅读本手册








如何使用 XXTouch

售前及安装答疑

用户使用图文说明

普通用户交流 QQ 群 (483853614)

开发交流 QQ 群 (40898074)







脚本及相关资源存在设备的哪个位置?







保护脚本,正确接受 require







基本控制函数









开发辅助函数





屏幕模块(screen)



































模拟触摸模块(touch)

























模拟按键模块(key)









示例及支持的键码列表







模拟重力加速计模块(accelerometer)

















系统模块(sys)



































剪贴板模块(pasteboard)









对话框模块(dialog)

































清理模块(clear)























应用程序模块(app)











































app 模块 额外说明

Process Identifier(进程标识符)为应用运行期的进程号,是个整数,每次运行都不一样







设备相关模块(device)



















































































图片对象模块(image)

































































进程字典

























线程模块(thread)

thread 模块使用 Lua 自带协程(coroutine)模块实现,非通常意义上的多线程













thread 示例代码

  1. tmid = thread.dispatch( -- 派发一个异步任务
  2. function()
  3. sys.msleep(2700)
  4. sys.toast("这是第 2.7 秒")
  5. end
  6. )
  7. tid = thread.dispatch( -- 派发一个异步任务
  8. function()
  9. sys.msleep(300)
  10. for i=1,10 do
  11. sys.toast("线程 2: "..i)
  12. sys.msleep(1000)
  13. end
  14. sys.toast("应该运行不到这里")
  15. end
  16. )
  17. -- iPhone 5C 双指合拢缩小相册图片示例
  18. thread.dispatch(function() -- 派发一个滑动任务
  19. touch.on(59,165)
  20. :move(297,522)
  21. :delay(500)
  22. :off()
  23. end)
  24. thread.dispatch(function() -- 再派发一个滑动任务
  25. touch.on(580,1049)
  26. :move(371,1049)
  27. :delay(500)
  28. :off()
  29. end)
  30. proc_queue_clear("来自远方的消息")
  31. eid = thread.register_event( -- 注册监听字典状态有值事件
  32. "来自远方的消息",
  33. function(val)
  34. sys.toast("收到消息:"..val)
  35. end
  36. )
  37. sys.msleep(300)
  38. thread.wait(tmid)
  39. for i=1,10 do
  40. sys.toast("线程 1: "..i)
  41. sys.msleep(400)
  42. end
  43. thread.kill(tid) -- 杀死 线程 2
  44. thread.unregister_event("来自远方的消息", eid) -- 取消一个字典状态有值事件
  45. sys.toast("完了")

:上述代码中使用了非本章函数及方法 proc_queue_clearsys.msleepsys.toasttouch.on:move:delay:off







Web 视图模块(webview)











webview 使用示例







扩展 table 模块

table 模块是 Lua 基础模块,XXTouch 在其基础上做了一些扩展。











扩展 string 模块

string 模块是 Lua 基础模块,XXTouch 在其基础上做了一些扩展。

































扩展 string 示例代码

  1. -- 哈希校验
  2. local str = "sozereal"
  3. sys.alert('"'..str..'" 的 16 进制编码为: <'..str:to_hex()..'>')
  4. sys.alert('<'..str:to_hex()..'> 转换成明文为: "'..str:to_hex():from_hex()..'"')
  5. sys.alert('"'..str..'" 的 MD5 值是: '..str:md5())
  6. sys.alert('"'..str..'" 的 SHA1 值是: '..str:sha1())
  7. local binstr = "\0\1\2\3\4\5"
  8. sys.alert('<'..binstr:to_hex()..'> 的 MD5 值是: '..binstr:md5())
  9. sys.alert('<'..binstr:to_hex()..'> 的 SHA1 值是: '..binstr:sha1())
  10. -- 数据加/解密
  11. local msg = "\5\4\3\2\1\0"
  12. local key = "sozereal"
  13. local emsg = msg:aes128_encrypt(key)
  14. local emsgb64 = emsg:base64_encode()
  15. sys.alert('二进制数据<'..msg:to_hex()..'> \n 使用 AES128 算法 密钥 "'..key..'" 加密 值是: <'..emsg:to_hex()..'> \n base64 串为 "'..emsgb64..'"')
  16. local tmp = emsgb64:base64_decode()
  17. msg = tmp:aes128_decrypt(key)
  18. sys.alert('"'..emsgb64..'" base64 解码后的数据为 <'..tmp:to_hex()..'> \n使用 AES128 算法 密钥 "'..key..'" 解密 值是: <'..msg:to_hex()..'>')
  19. -- 字符串小工具
  20. str = " 哈哈,he he,1,3,6 "
  21. new = str:split(",") --将字符串str按照 `,` 分割并返回一个表
  22. sys.alert(new[2])
  23. sys.alert(str:rtrim()) -- 结果 " 哈哈,he he,1,3,6" ,删除字符串尾部的空白字符
  24. sys.alert(str:ltrim()) -- 结果 "哈哈,he he,1,3,6 " ,删除字符串首部的空白字符
  25. sys.alert(str:trim()) -- 结果 "哈哈,he he,1,3,6" ,删除字符串首尾的空白字符
  26. sys.alert(str:atrim()) -- 结果 "哈哈,hehe,1,3,6" ,删除字符串所有的空白字符

:上述代码中使用了非本章函数 sys.alert







! HTTP 模块(http)

当前模块并不支持 HTTP/1.0 或更低版本的 HTTP 协议,需求若无法使用当前模块完成,也可以使用 lcurl 模块 来实现。

















! FTP 模块(ftp)









JSON 模块(json)

JSON (JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。详情见:http://www.json.org/

该 JSON 模块 完全等同于 LuaCJSON 扩展库,非原创模块











PLIST 文件读写模块(plist)









小工具模块(utils)





















文件操作模块(file)

































云打码模块(cloud_ocr)

















系统回调消息













外部扩展



地理位置伪装模块(gps)









大漠找字/文字识别 模块







已集成的开源扩展库



LuaCJSON 扩展库

注: XXTouch 内置的 JSON 模块就是 LuaCJSON,参考 JSON 模块(json)



LuaSocket 扩展库



luaiconv 扩展库(编码转换库)



lpeg 扩展库



LuaFileSystem 扩展库



LuaSQLite3 模块



lcurl 模块

这个模块在 1.1.0-1 版以上方可使用







更多的编译好的开源扩展库















附录

开发及周边工具下载



扩展库及远程扩展接口






脚本守护模式是什么?



开机启动的时机说明



"URL Scheme" 的相关应用

具体使用方法参考:app.open_url

URL Scheme 跳转到
prefs:root=WIFI 设置-WiFi(或无线局域网)
prefs:root=Bluetooth 设置-蓝牙
prefs:root=INTERNET_TETHERING 设置-个人热点
prefs:root=Wallpaper 设置-墙纸与亮度
prefs:root=Sounds 设置-声音
prefs:root=Sounds&path=Ringtone 设置-声音-电话铃声
prefs:root=Photos 设置-照片与相机
prefs:root=STORE 设置-iTunes Store 和 App Store
prefs:root=Safari 设置-Safari
prefs:root=MUSIC 设置-音乐
prefs:root=MUSIC&path=EQ 设置-音乐-均衡器
prefs:root=VIDEO 设置-视频
prefs:root=NOTES 设置-备忘录
prefs:root=Phone 设置-电话
prefs:root=CASTLE 设置-iCloud
prefs:root=CASTLE&path=STORAGE_AND_BACKUP 设置-iCloud-存储与备份
prefs:root=NOTIFICATIONS_ID 设置-通知中心
prefs:root=ACCOUNT_SETTINGS 设置-邮件、日历、通讯录
prefs:root=LOCATION_SERVICES 设置-定位服务
prefs:root=MESSAGES 设置-信息
prefs:root=GAMECENTER 设置-Game Center
prefs:root=General 设置-通用
prefs:root=General&path=About 设置-通用-关于本机
prefs:root=General&path=SOFTWARE_UPDATE_LINK 设置-通用-软件更新
prefs:root=General&path=ACCESSIBILITY 设置-通用-辅助功能
prefs:root=General&path=ACCESSIBILITY/REDUCE_MOTION 设置-通用-辅助功能-减少动态效果
prefs:root=General&path=ACCESSIBILITY/ENHANCE_BACKGROUND_CONTRAST 设置-通用-辅助功能-增强对比度
prefs:root=General&path=AUTO_CONTENT_DOWNLOAD 设置-通用-后台应用刷新
prefs:root=General&path=USAGE 设置-通用-用量
prefs:root=General&path=AUTOLOCK 设置-通用-自动锁定
prefs:root=General&path=DATE_AND_TIME 设置-通用-日期与时间
prefs:root=General&path=Keyboard 设置-通用-键盘
prefs:root=General&path=INTERNATIONAL 设置-通用-多语言环境
prefs:root=General&path=VPN 设置-通用-VPN
prefs:root=General&path=Bluetooth 设置-通用-蓝牙
prefs:root=General&path=Network 设置-通用-网络
prefs:root=General&path=Network/VPN 设置-通用-网络-VPN
prefs:root=General&path=ManagedConfigurationList 设置-通用-描述文件
prefs:root=General&path=Reset 设置-通用-还原


"os.date" 日期格式化相关

os.date 第二个参数是可选参数,默认为当前时间

格式 示例 描述 结果
%Y-%m-%d %H:%M:%S os.date("%Y-%m-%d %H:%M:%S", 1487356783) 一种常用日期时间格式 2017-02-18 02:39:43
%Y-%m-%d os.date("%Y-%m-%d", 1487356783) 一种常用日期格式 2017-02-18
%a os.date("%a", 1487356783) 短星期名 Sat
%A os.date("%A", 1487356783) 全星期名 Saturday
%b os.date("%b", 1487356783) 简写的月份名 Feb
%B os.date("%B", 1487356783) 月份的全称 February
%c os.date("%c", 1487356783) 标准的日期的时间串 Sat Feb 18 02:39:43 2017
%d os.date("%d", 1487356783) 月的天[01-31] 18
%H os.date("%H", 1487356783) 24小时制的时[00-23] 02
%I os.date("%I", 1487356783) 12小时制的时[01-12] 02
%j os.date("%j", 1487356783) 年的天[001-366] 049
%M os.date("%M", 1487356783) 分钟[00-59] 39
%m os.date("%m", 1487356783) 月份[01-12] 02
%p os.date("%p", 1487356783) 上午AM 下午PM AM
%S os.date("%S", 1487356783) 秒钟[00-61] 43
%w os.date("%w", 1487356783) 星期几(星期日为0)[0-6] 6
%x os.date("%x", 1487356783) 标准的日期串 02/18/17
%X os.date("%X", 1487356783) 标准的时间串 02:39:43
%y os.date("%y", 1487356783) 不带世纪的年份 17
%Y os.date("%Y", 1487356783) 带世纪部分的年份 2017
%% os.date("%%", 1487356783) 百分号 %

更多 os.date 使用示例
实时显示当前日期时间



"os.execute" 相关示例代码

重启设备

  1. os.execute('reboot')

注销设备

  1. os.execute('killall -9 SpringBoard;killall -9 backboardd')

重建图标缓存

  1. os.execute('su mobile -c uicache')

创建脚本日志连接到脚本目录

  1. os.execute('ln -s /private/var/mobile/Media/1ferver/log/sys.log /private/var/mobile/Media/1ferver/lua/scripts/脚本日志.txt')

常用操作封装

  1. --[[
  2. 删除文件 文件删除 删除目录 重命名文件 文件重命名 移动文件 文件移动 新建目录 创建目录 新建文件夹 创建文件夹
  3. 以上是关键词,便于在手册中搜索到此处
  4. --]]
  5. local function sh_escape(path) -- XXTouch 原创函数,未经 XXTouch 许可,可以用于商业用途
  6. path = string.gsub(path, "([ \\()<>'\"`#&*;?~$])", "\\%1")
  7. return path
  8. end
  9. function fdelete(path) -- 删除一个文件或目录(递归删除子项)
  10. assert(type(path)=="string" and path~="", 'fremove 参数异常')
  11. os.execute('rm -rf '..sh_escape(path))
  12. end
  13. function frename(from, to) -- 重命名(移动)一个文件或目录
  14. assert(type(from)=="string" and from~="", 'frename 参数 1 异常')
  15. assert(type(to)=="string" and to~="", 'frename 参数 2 异常')
  16. os.execute('mv -f '..sh_escape(from).." "..sh_escape(to))
  17. end
  18. function fcopy(from, to) -- 拷贝一个文件或目录
  19. assert(type(from)=="string" and from~="", 'fcopy 参数 1 异常')
  20. assert(type(to)=="string" and to~="", 'fcopy 参数 2 异常')
  21. os.execute('cp -rf '..sh_escape(from).." "..sh_escape(to))
  22. end
  23. function mkdir(path) -- 新建一个目录(递归创建子目录)
  24. assert(type(path)=="string" and path~="", 'mkdir 参数异常')
  25. os.execute('mkdir -p '..sh_escape(path))
  26. end
  27. function openurl(url) -- 跳转到一个链接
  28. assert(type(url)=="string" and url~="", 'openurl 参数异常')
  29. os.execute('uiopen '..sh_escape(url))
  30. end
  31. -- 以上是封装好的函数,拷贝到自己脚本前就可以用。
  32. -- 以下是使用方式(不用拷贝)
  33. -- 删除 /var/mobile/1.png
  34. fdelete("/var/mobile/1.png")
  35. -- /var/mobile/2.png 重命名为 /var/mobile/1.png
  36. frename("/var/mobile/2.png", "/var/mobile/1.png")
  37. -- /var/mobile/1.png 移动到 /var/mobile/Media/1ferver/res/3.png
  38. frename("/var/mobile/1.png", "/var/mobile/Media/1ferver/res/3.png")
  39. -- /var/mobile/1.png 拷贝到 /var/mobile/Media/1ferver/res/4.png
  40. fcopy("/var/mobile/1.png", "/var/mobile/Media/1ferver/res/4.png")
  41. -- 建立 /var/mobile/1/2/3/4/ 目录
  42. mkdir("/var/mobile/1/2/3/4")
  43. -- 跳转到 www.google.com
  44. openurl("http://www.google.com")


"string库" 的相关应用

函数 描述 示例 结果
len 计算字符串长度 string.len("abcd") 4
rep 返回字符串s的n个拷贝 string.rep("abcd",2) abcdabcd
lower 返回字符串全部字母小写 string.lower("AbcD") abcd
upper 返回字符串全部字母大写 string.upper("AbcD") ABCD
format 格式化字符串 string.format("the value is:%d",4) the value is:4
sub 从字符串里截取字符串 string.sub("abcd",2) bcd
string.sub("abcd",-2) cd
string.sub("abcd",2,-2) bc
string.sub("abcd",2,3) bc
find 在字符串中查找(显示位置) string.find("cdcdcdcd","ab") nil
string.find("cdcdcdcd","cd") 1 2
string.find("cdcdcdcd","cd",7) 7 8
match 在字符串中查找(显示内容) string.match("cdcdcdcd","ab") nil
string.match("cdcdcdcd","cd") cd
gsub 在字符串中替换 string.gsub("abcdabcd","a","z") zbcdzbcd 2
string.gsub("aaaa","a","z",3) zzza 3
byte 返回字符的整数形式 string.byte("ABCD",4) 68
char 将整型数字转成字符并连接 string.char(97,98,99,100) abcd
字符类 描述 示例 结果
. 任意字符 string.find("",".") nil
%s 空白符 string.find("ab cd","%s%s") 3 4
%S 非空白符 string.find("ab cd","%S%S") 1 2
%p 标点字符 string.find("ab,.cd","%p%p") 3 4
%P 非标点字符 string.find("ab,.cd","%P%P") 1 2
%c 控制字符 string.find("abcd\t\n","%c%c") 5 6
%C 非控制字符 string.find("\t\nabcd","%C%C") 3 4
%d 数字 string.find("abcd12","%d%d") 5 6
%D 非数字 string.find("12abcd","%D%D") 3 4
%x 十六进制数字 string.find("efgh","%x%x") 1 2
%X 非十六进制数字 string.find("efgh","%X%X") 3 4
%a 字母 string.find("AB12","%a%a") 1 2
%A 非字母 string.find("AB12","%A%A") 3 4
%l 小写字母 string.find("ABab","%l%l") 3 4
%L 大写字母 string.find("ABab","%L%L") 1 2
%u 大写字母 string.find("ABab","%u%u") 1 2
%U 非大写字母 string.find("ABab","%U%U") 3 4
%w 字母和数字 string.find("a1()","%w%w") 1 2
%W 非字母非数字 string.find("a1()","%W%W") 3 4
字符类 描述 示例 结果
% 转义字符 string.find("abc%..","%%") 4 4
string.find("abc..d","%.%.") 4 5
字符类 描述 示例 结果
[01] 匹配二进制数 string.find("32123","[01]") 3 3
[AB][CD] 匹配AC、AD、BC、BD string.find("ABCDEF","[AB][CD]") 2 3
[[]] 匹配一对方括号[] string.find("ABC[]D","[[]]") 4 5
[1-3] 匹配数字1-3 string.find("312","[1-3][1-3][1-3]") 1 3
[b-d] 匹配字母b-d string.find("dbc","[b-d][b-d][b-d]") 1 3
[^%s] 匹配任意非空字符 string.find(" a ","[^%s]") 3 3
[^%d] 匹配任意非数字字符 string.find("123a","[^%d]") 4 4
[^%a] 匹配任意非字母字符 string.find("abc1","[^%a]") 4 4
字符类 描述 示例 结果
() 捕获字符串 string.find("12ab","(%a%a)") 3 4 ab
string.find("ab12","(%d%d)") 3 4 12
修饰符 描述 示例 结果
+ 表示1个或多个,匹配最多个 string.find("aaabbb","(a+b)") 1 4 aaab
string.find("cccbbb","(a+b)") nil
- 表示0个或多个,匹配最少个 string.find("zzxyyy","(xy-)") 3 3 x
string.find("zzzyyy","(x-y)") 4 4 y
* 表示0个或多个,匹配最多个 string.find("mmmnnn","(m*n)") 1 4 mmmb
string.find("lllnnn","(m*n)") 4 4 n
? 表示0个或1个 string.find("aaabbb","(a?b)") 3 4 ab
string.find("cccbbb","(a?b)") 4 4 b
描述 示例 结果
匹配中文 string.match("男女abc123","([^%w%p]+)") 男女
匹配英文 string.match("男女abc123","(%a+)") abc
匹配数字 string.match("男女abc123","(%d+)") 123
匹配英文和数字 string.match("男女abc123","(%w+)") abc123


"math库" 的相关应用

函数名 描述 示例 结果
pi 圆周率 math.pi 3.1415926535898
abs 取绝对值 math.abs(-2012) 2012
ceil 向上取整 math.ceil(9.1) 10
floor 向下取整 math.floor(9.9) 9
max 取参数最大值 math.max(2,4,6,8) 8
min 取参数最小值 math.min(2,4,6,8) 2
pow 计算x的y次幂 math.pow(2,16) 65536.0
sqrt 开平方 math.sqrt(65536) 256.0
modf 取整数和小数部分 math.modf(20.12) 20 0.12
randomseed 设随机数种子 math.randomseed(os.time())
random 取随机数 math.random(5,90) 5~90
rad 角度转弧度 math.rad(180) 3.1415926535898
deg 弧度转角度 math.deg(math.pi) 180.0
exp e的x次方 math.exp(4) 54.598150033144
log 计算x的自然对数 math.log(54.598150033144) 4.0
log10 计算10为底,x的对数 math.log10(1000) 3.0
frexp 将参数拆成x * (2 ^ y)的形式 math.frexp(160) 0.625 8
ldexp 计算x * (2 ^ y) math.ldexp(0.625,8) 160.0
sin 正弦 math.sin(math.rad(30)) 0.5
cos 余弦 math.cos(math.rad(60)) 0.5
tan 正切 math.tan(math.rad(45)) 1.0
asin 反正弦 math.deg(math.asin(0.5)) 30.0
acos 反余弦 math.deg(math.acos(0.5)) 60.0
atan 反正切 math.deg(math.atan(1)) 45.0






学习 Lua 注意避开的坑







开发常见运行期错误参考

错误描述片段 原因 处理方式
attempt to perform arithmetic on a 尝试对非数值进行了数学运算(+、-、*、/) 数学运算之前,检查运算输入是否都为数字
attempt to compare 尝试对非法值进行了比较运算(>、<、>=、<=) 比较运算之前,检查运算输入是否双方可以进行比较运算
attempt to concatenate a 尝试对非字符串值进行了连接(..) 在进行字符串连接之前,先确定连接双方都为字符串
attempt to call a 尝试调用了一个不是函数的变量 调用一个函数之前,先确定其是否为一个函数
attempt to index a 尝试对一个非表变量进行索引(下标运算) 在从数组变量或关联数组变量中取值前,先确定其是否为一个表
attempt to yield across a C-call boundary 尝试在不能让出的调用块中让出 require 一个模块的时候,请确认被 require 的模块返回之前没有调用会让出的函数(手册上函数前带叹号)。还有就是不要尝试在带 C 回调的函数中使用会让出的函数(手册上函数前带叹号)。
invalid order function for sorting 非法的排序函数,通常发生在排序函数的规则逻辑不够明确的情况下 调用排序函数时,明确排序规则,不要出现 a 大于 b 成立同时小于 b 也成立的规则
bad argument #1 to 'xxx' (number expected, got nil) 调用 xxx 函数时,第 #1 个参数的类型不正确,需要 number 却传入了 nil 参数错误,传入合适的参数就不会出错了
bad argument #2 to 'xxx' (number has no integer representation) 调用 xxx 函数时,第 #2 个参数无法转换成整数 参数错误,传入合适的参数就不会出错了
bad argument #3 to 'xxx' 调用 xxx 函数时,第 #3 个参数非法 参数错误,传入合适的参数就不会出错了







添加新批注