浏览正常百度搜索结果点击,经常是点击查看后跳转到xx应用下载,怎样举报这些

XXTouch iOS 开发手册XXTouchWindows 平台按 Ctrl + F 可以输入文字搜索Mac 平台按 command + F 可以输入文字搜索关于 XXTouchXXTouch 使用
作为脚本语言,支持
版的所有语法与基本函数,并于其基础之上添加了一些扩展功能, 用于取色、找色、发送触摸、键盘事件等高级功能的实现。XXTouch 仅支持 UTF-8 编码的脚本。如何阅读本手册
入门需要拥有 Lua 基础,可以参考及
示例代码中使用 0x 开头的数字为 16 进制数 (
参数描述中可选参数使用中括号包围
参数或返回值如果是表型固定结构值,则使用大括号表示表型结构
类型描述中 文本型 和 字符串型 都是 Lua 的 string 类型,但 文本型 一般是指可以打印的明文文字
章或节用叹号 ( ! ) 开头的说明这个函数或者这个模块的函数包含隐式 让出(在这个函数返回之前,其它的
可能会得到运行机会)
若无额外说明,手册内示例代码均不处理边界情况,不应该直接复制到自己的脚本中用
如何使用 XXTouch售前及安装答疑
用户使用图文说明
普通用户交流 QQ 群 ()
开发相关及交流 QQ 群 ()
脚本及相关资源存在设备的哪个位置?
脚本存放目录为 /var/mobile/Media/1ferver/lua/scripts/
插件存放目录为 /var/mobile/Media/1ferver/lib/
资源存放目录为 /var/mobile/Media/1ferver/res/
日志存放目录为 /var/mobile/Media/1ferver/log/
文字识别字库存放目录为 /var/mobile/Media/1ferver/tessdata/
内置脚本模块存放目录为 /var/mobile/Media/1ferver/lua/
保护脚本,正确接受 require
可能带来安全风险?
XXTouch 加密的脚本模块可以被其它脚本或者模块以
当您的加密脚本被
时,全局环境是不可信的,您的脚本调用的函数可能已经被替换
如何正确使用
XXTouch 保证部分模块的函数会在
之前恢复初始状态,这包括
os、io、string、device、http、file、table 模块所有函数
您可以深拷贝全局环境到模块内局部环境以确保安全调用上述模块中所有函数
-- 在脚本的最前面加上这个代码local _ENV = table.deep_copy(_ENV)-- 下面就是脚本的主体内容-- 最后您可能还需要返回一些导出函数或者常量
并且保证当一个模块被
方式引用的时候,全局变量 been_require 会无条件置为 true
您可以通过这个全局变量的状态来判断自己是不是正在被
-- 在脚本的最前面加上这个代码if been_require then
return -- 如果被 require 就直接退出end-- 下面就是脚本的主体内容
基本控制函数
结束脚本 (os.exit)
是 lua 自带的结束进程的函数,在 XXTouch 是结束逻辑上的脚本进程
在任意线程中调用都可以结束当前脚本进程,所有的线程、监听都会立即终止
重启脚本 (os.restart)
操作成败, 错误信息 = os.restart([ 脚本文件路径 ])
参数及返回值
脚本文件路径 *1.1.2-2 新增
文本型,可选参数,当这里传入一个有效的脚本文件路径将会重启到目标脚本文件,默认为 ""
布尔型,操作失败返回 false,只有传递了脚本文件路径的情况下才可能操作失败,操作成功则这个函数不会返回
文本型,操作失败的情况下,会返回具体的错误信息
在没有 脚本文件路径 参数的情况下这个函数调用会直接重启 当前脚本 进程,当前脚本会立即结束
传入了有效的 脚本文件路径 参数的时脚本会结束并重新启动到 目标脚本文件
操作失败的情况下,该函数会返回 false 并附带错误信息,操作失败通常是传入了非法参数
当前脚本 的定义是启动的那份脚本,脚本文件被更改后使用 os.restart() 不会 启动更改之后的脚本文件
如果可能,请 不要 在多线程环境使用该函数
无延迟重启会导致的其它逻辑问题也需要作者规避
当前函数暂 不支持 重启、启动 xpp 脚本包 脚本
os.restart() -- 重启到 “当前脚本”(不是 “当前脚本文件”)
os.restart(utils.launch_args().path) -- 重启到 “当前脚本文件”
注:上述代码中使用了非本章函数
脚本被终止时执行一些代码的方法
这不是一个函数
而是利用 Lua 的垃圾回收机制实现的,用于在脚本结束(或被结束)时执行一些代码的方法
定义一个全局对象(表型值),将其 析构函数 设为一个函数
当 Lua 虚拟机结束之时,所有 Lua 对象(也包括你定义的这个)的 析构函数 会被调用
Lua 中的 析构函数 是指对象的
-- 关键词 脚本终止回调 脚本结束回调随便取个变量名 = {}setmetatable(随便取个变量名, {
__gc = function(...)
sys.toast('被终止了!')
sys.msleep(500)
end})while (true) do
sys.toast("现在可尝试手动结束脚本\n\n"..os.date("%Y-%m-%d %H:%M:%S"))
sys.msleep(1000)end
注:上述代码中使用了非本章函数 、、
完整封装示例
function atexit(callback) -- 参数为一个函数,使用 atexit(一个函数) 注册一个函数在脚本结束时执行,建议不要耗时太长
____atexit_guard____ = ____atexit_guard____ or {}
if type(____atexit_guard____) == 'table' then
if not getmetatable(____atexit_guard____) then
setmetatable(____atexit_guard____, {
__gc = function(self)
if type(self.callback) == 'function' then
pcall(self.callback)
____atexit_guard____.callback = callback
error('别用 `____atexit_guard____` 命名你的变量。')
endend-- 以上代码可拷贝到你的脚本的开头,以下为使用示例-- 使用 atexit 注册一个终止回调函数atexit(function()
sys.toast('被终止了!')
sys.msleep(500)end)while (true) do
sys.toast("现在可尝试手动结束脚本\n\n"..os.date("%Y-%m-%d %H:%M:%S"))
sys.msleep(1000)end
注:上述代码中使用了非本章函数 、、
开发辅助函数
打印内容到缓冲区 (print)
print([ 参数1, 参数2, ... ])
参数及返回值
参数1, 参数2, ...
任意类型,可选参数,可变参数,将会转换成文本输出到缓冲区,参数之间用 "\t" 隔开
是 lua 自带的打印输入函数,在 XXTouch 是将内容打印到缓冲区
print("hello world")
将打印缓冲区的内容提出来 (print.out)
缓冲区内容 = print.out()
将 print 函数打印的缓冲区清空并返回缓冲区内容
-- 使用一个弹窗显示 print 缓冲区内容sys.alert(print.out())
注:上述代码中使用了非本章函数
网络日志 (nLog)
nLog(日志内容)
参数及返回值
文本型,日志内容
这个函数是协议函数(空函数),默认执行不会产生任何效果,实现细节由配套开发环境决定
当使用配套开发环境进行调试的时候这个函数将会将日志发回开发环境的日志框
-- 将 print 缓冲区内容发回开发开发工具的日志窗nLog(print.out())
屏幕模块(screen)
初始化旋转坐标系 (screen.init)
原坐标系 = screen.init(坐标系)
参数及返回值
整数型,取值范围
0 - 竖屏 home 在下
1 - 横屏 home 在右
2 - 横屏 home 在左
3 - 竖屏 home 在上
整数型,返回这个函数调用之前使用的坐标系
初始化取色或点击的坐标系
使用以下别名调用也可以实现相同效果
screen.init_home_on_bottom()
-- home 在下screen.init_home_on_right()
-- home 在右screen.init_home_on_left()
-- home 在左screen.init_home_on_top()
-- home 在上
screen.init(0)
-- home 在下screen.init(1)
-- home 在右screen.init(2)
-- home 在左screen.init(3)
-- home 在上
坐标旋转转换 (screen.rotate_xy)
旋转后的横坐标, 旋转后的纵坐标 = screen.rotate_xy(横坐标, 纵坐标, 旋转方向)
参数及返回值
横坐标, 纵坐标
整数型,需要旋转的坐标
整数型,旋转选项
0 - 不旋转
1 - 往左 90 度旋转
2 - 往右 90 度旋转
3 - 180 度旋转
旋转后的横坐标, 旋转后的纵坐标
整数型,返回使用 旋转方向 作为选项旋转后的坐标
坐标旋转转换,通常用于将竖屏坐标转换成横屏坐标
这个函数在 1.1.1-1 版以上方可使用
rx, ry = screen.rotate_xy(100, 200, 1)
获取屏幕尺寸 (screen.size)
屏宽, 屏高 = screen.size()
参数及返回值
屏宽 整数型
屏高 整数型
这个函数的返回值不受当前设备的桌面或者应用的的横竖屏状态影响,也不受放大模式影响
这个函数可以在 XUI 中使用
-- 根据分辨率判断设备类型width, height = screen.size()if width == 640 and height == 1136 then
-- iPhone 5, 5S, iPod touch 5elseif width == 640 and height == 960 then
-- iPhone 4, 4S, iPod touch 4elseif width == 750 and height == 1334 then
-- iPhone 6, 6S, 7, 8elseif width == 1242 and height == 2208 then
-- iPhone 6+, 6S+, 7+, 8+elseif width == 768 and height == 1024 then
-- iPad 1, 2, mini 1elseif width == 1536 and height == 2048 then
-- iPad 3, 4, 5, mini 2elseif width == 320 and height == 480 then
-- 这个应该不可能end
保持屏幕 (screen.keep)
screen.keep()
在脚本中保持当前屏幕内容不变,多次调用取色、找色、截图、找图等函数时,直接调用保持的内容。
该函数为优化类函数,能够为大量的静态图像处理函数提供性能优化。
调用仅会影响 XXTouch 取色逻辑,不会 导致屏幕画面卡住不动!!!
-- 遍历屏幕区块screen.keep()for k = 1, 640, 10 do
for j = 1, 960, 10 do
--格式化为十六进制文本
color = string.format("%X", screen.get_color(k, j));
--输出到系统日志
sys.log("("..k..", "..j..") Color: "..color..".");
endendscreen.unkeep()
注:上述代码中使用了非本章函数
针对同一位置两行连续单独的 screen.get_color 调用可能取到不同的值
screen.keep 的情况下 screen.get_color 单独调用耗时会超过一次 screen.keep 的耗时
调用 screen.keep 之后,再连续调用 50 次 screen.get_color 耗时可以等同于调用一次 screen.keep
取消保持屏幕 (screen.unkeep)
screen.unkeep()
函数的效果,释放内存中的屏幕图像
获取屏幕上某点颜色 (screen.get_color)
颜色值 = screen.get_color(横坐标, 纵坐标)
参数及返回值
横坐标, 纵坐标
整数型,代表目标点的坐标
整数型,返回目标点颜色的 RGB 值
获取屏幕上某个坐标点的颜色
local c = screen.get_color(512, 133)if c==0xffffff then
sys.alert("512, 133 这个点是纯白色")end
注:上述代码中使用了非本章函数
获取屏幕上某点颜色 RGB (screen.get_color_rgb)
红, 绿, 蓝 = screen.get_color_rgb(横坐标, 纵坐标)
参数及返回值
横坐标, 纵坐标
整数型,代表目标点的坐标
红, 绿, 蓝
整数型,返回目标点颜色的 红、绿、蓝 值,取值范围 0~255
获取屏幕上某个坐标点的颜色并拆分成 红(R) 绿(G) 蓝(B) 形式
local r, g, b = screen.get_color_rgb(512, 133)if r==0xff and g==0xff and b==0xff then
sys.alert("512, 133 这个点是纯白色")end
注:上述代码中使用了非本章函数
屏幕多点颜色匹配 (screen.is_colors)
是否完全匹配 = screen.is_colors({
{横坐标*, 纵坐标*, 颜色*},
{横坐标*, 纵坐标*, 颜色*},
...}[, 颜色相似度])
参数及返回值
横坐标*, 纵坐标*
整数型,代表其中某点坐标
整数型,代表其中某点需要匹配的颜色值
颜色相似度
整数型,可选参数,代表需要的颜色的相似度,取值范围 1~100,默认 100
是否完全匹配
布尔型,所有点的颜色都匹配则返回 true,否则返回 false
匹配屏幕上若干点的颜色
if screen.is_colors({
{ 509, 488, 0xec1c23}, -- 如果坐标 (509, 488) 的颜色与 0xec1c23 相似度在 90% 以上
{ 514, 470, 0x00adee}, -- 同时坐标 (514, 470) 的颜色与 0x00adee 相似度在 90% 以上
{ 508, 478, 0xffc823}, -- 同时坐标 (508, 478) 的颜色与 0xffc823 相似度在 90% 以上
{ 511, 454, 0xa78217}, -- 同时坐标 (511, 454) 的颜色与 0xa78217 相似度在 90% 以上
{ 521, 433, 0xd0d2d2}, -- 同时坐标 (521, 433) 的颜色与 0xd0d2d2 相似度在 90% 以上}, 90) then
sys.alert("匹配!")else
sys.alert("不匹配!")end
注:上述代码中使用了非本章函数
多点相似度模式找色 (screen.find_color)
横坐标, 纵坐标 = screen.find_color({
[find_all = 是否搜索多个结果],
[max_results = 最大结果数],
[max_miss = 允许最多未命中数],
{起始点横坐标, 起始点纵坐标, 起始点颜色[, 起始点相似度]},
{偏移点横坐标*, 偏移点纵坐标*, 偏移点颜色*[, 偏移点相似度*]},
{偏移点横坐标*, 偏移点纵坐标*, 偏移点颜色*[, 偏移点相似度*]},
...} [, 全局相似度, 左, 上, 右, 下 ])
参数及返回值
是否搜索多个结果
布尔型,可选参数,这个标签设置为 true 会返回范围内所有匹配位置的一个表,格式为 {{x1, y1}, {x2, y2}, ...},默认 false
最大结果数
整数型,可选参数,当 find_all(是否搜索多个结果) 标签设置为 true 的时候,这个表示最多返回结果数,最多可以设为 1000,默认 100
允许最多未命中数 *1.2-3 新增
整数型,可选参数,可以允许最多的不匹配的点的数量,默认为 0,也就是全命中才算找到
起始点横坐标, 起始点纵坐标
整数型,代表起始坐标,它并不是限制找色的范围为固定这一点,而仅仅是给偏移位置一个相对坐标,不理解就填 0, 0
起始点颜色
整数型,代表需要搜索的那一点的颜色
起始点相似度
整数型,可选参数,需要搜索的那一点颜色的相似度,取值范围 1~100,默认 100
偏移点横坐标*, 偏移点纵坐标*
整数型,代表一个偏移位置坐标
偏移点颜色*
整数型,代表偏移位置需要匹配的颜色
偏移点相似度*
整数型,可选参数,偏移位置的颜色的相似度,取值范围 -100~100,默认 100,负相似度意味着匹配小于该绝对值的相似度
全局相似度
整数型,可选参数,如果没有给单个点设置相似度,那么每一点都会用这个相似度,取值范围 1~100,默认 100
左, 上, 右, 下
整数型,可选参数,代表搜索区域,默认 全屏
横坐标, 纵坐标
整数型,返回匹配色的第一个色的坐标,搜索失败返回 -1, -1
使用相似度模式查找,获取区域中第一个完全匹配的多点颜色结构的位置
x, y = screen.find_color({
0, 0xec1c23},
-3, 0xffffff, 85},
5, -18, 0x00adee},
{ -1, -10, 0xffc823},
2, -34, 0xa78217},
{ 12, -55, 0xd0d2d2},}, 90, 0, 0, 100, 100)--[[
在左上为 0, 0 右下为 100, 100 的区域找到第一点与 0xec1c23 相似度大于 90
且它的相对坐标 (12, -3) 的位置的颜色与 0xffffff 相似度大于 85
且它的相对坐标 (5, -18) 的位置的颜色与 0x00adee 相似度大于 90
且……(后面的同理)都能匹配的那个点--]]-- 等效代码如下:x, y = screen.find_color({
{ 509, 488, 0xec1c23},
{ 521, 485, 0xffffff, 85},
{ 514, 470, 0x00adee},
{ 508, 478, 0xffc823},
{ 511, 454, 0xa78217},
{ 521, 433, 0xd0d2d2},}, 90, 0, 0, 100, 100)--[[
在左上为 0, 0 右下为 100, 100 的区域找到第一点与 0xec1c23 相似度大于 90
且它的相对坐标 (521-509, 485-488) 的位置的颜色与 0xffffff 相似度大于 85
且它的相对坐标 (514-509, 470-488) 的位置的颜色与 0x00adee 相似度大于 90
且……(后面的同理)都能匹配的那个点--]]-- 不换行无缩进就是这个效果:x, y = screen.find_color({{0,0,0xec1c23},{12,-3,0xffffff,85},{5,-18,0x00adee},{-1,-10,0xffc823},{2,-34,0xa78217},{12,-55,0xd0d2d2},},90,0,0,100,100)x, y = screen.find_color({ -- 反匹配演示,在 5C 主屏幕运行可获得结果
288, 0xffffff },
286, 0xffffff },
289, 0xffffff },
296, 0xffffff },
297, 0xffffff },
295, 0xffffff, -10 }, -- 这一点颜色与 0xffffff 相似度小于 10 才匹配,下同
291, 0xffffff, -10 },
284, 0xffffff, -10 },
298, 0xffffff, -10 },
298, 0xffffff, -10 },
296, 0xffffff, -10 },}, 90) -- 不写区域参数表示全屏找results = screen.find_color({ -- 范围匹配全输出演示
278, 0xde1d26 },
285, 0x007aff },
292, 0xe4ddc9 },
314, 0xffde02 },
291, 0xffde02 },
283, 0xe4ddc9 },
find_all = true, -- 带这个标签将返回范围所有匹配的位置的一个表,格式为 {{x1, y1}, {x2, y2}, ...}}, 90) -- 不写区域参数表示全屏找
多点色偏模式找色 (screen.find_color)
横坐标, 纵坐标 = screen.find_color({
[find_all = 是否搜索多个结果],
[max_results = 最大结果数],
[max_miss = 允许最多未命中数],
{起始点横坐标, 起始点纵坐标, {起始点颜色[, 起始点色偏]}},
{偏移点横坐标*, 偏移点纵坐标*, {偏移点颜色*, 偏移点色偏*}},
{偏移点横坐标*, 偏移点纵坐标*, {偏移点颜色*, 偏移点色偏*}},
...} [, 左, 上, 右, 下 ])
参数及返回值
是否搜索多个结果
布尔型,可选参数,这个标签设置为 true 会返回范围内所有匹配位置的一个表,格式为 {{x1, y1}, {x2, y2}, ...},默认 false
最大结果数
整数型,可选参数,当 find_all(是否搜索多个结果) 标签设置为 true 的时候,这个表示最多返回结果数,最多可以设为 1000,默认 100
允许最多未命中数 *1.2-3 新增
整数型,可选参数,可以允许最多的不匹配的点的数量,默认为 0,也就是全命中才算找到
起始点横坐标, 起始点纵坐标
整数型,代表起始坐标,它并不是限制找色的范围为固定这一点,而仅仅是给偏移位置一个相对坐标,不理解就填 0, 0
起始点颜色
整数型,代表需要搜索的那一点的颜色
起始点色偏
整数型,需要搜索的颜色的最大色偏(或偏色),大于 0xff000000 则为反匹配模式
偏移点横坐标*, 偏移点纵坐标*
整数型,代表一个偏移位置坐标
偏移点颜色*
整数型,代表偏移位置需要匹配的颜色
偏移点色偏*
整数型,偏移位置的颜色的色偏(或偏色),大于 0xff000000 则为反匹配模式
左, 上, 右, 下
整数型,可选参数,代表搜索区域,默认 全屏
横坐标, 纵坐标
整数型,返回匹配色的第一个色的坐标,搜索失败返回 -1, -1
使用色偏(或偏色)模式查找,获取区域中第一个完全匹配的多点颜色结构的位置
色偏(或偏色)用于表示颜色偏差范围,一个颜色附带色偏(或偏色)是指该颜色的红、绿、蓝偏移范围内的所有颜色
当 0x456789 色偏为 0x123456 的时候表示 0x456789 的红正负范围 0x12、绿正负范围 0x34、蓝正负范围 0x56
也就是其红色范围为 0x45 ± 0x12、绿色范围为 0x67 ± 0x34、蓝色的范围为 0x89 ± 0x56,如下表所示
0x45 - 0x12 = 0x33
0x45 + 0x12 = 0x57
0x67 - 0x34 = 0x33
0x45 + 0x12 = 0x9B
0x89 - 0x56 = 0x33
0x45 + 0x12 = 0xDF
上表所述 {0xx123456} 实际上就是表示从 0x333333 到 0x579BDF 之间所有的颜色
使用 0x 开头的数字为 16 进制数 (
x, y = screen.find_color({
0, {0xec1c23, 0x000000}},
-3, {0xffffff, 0x101010}},
5, -18, {0x00adee, 0x123456}},
{ -1, -10, {0xffc823, 0x101001}},
2, -34, {0xa78217, 0x101001}},
{ 12, -55, {0xd0d2d2, 0x101001}},}, 0, 0, 100, 100)--[[
在左上为 0, 0 右下为 100, 100 的区域找到第一点与 0xec1c23 完全相似 (色偏为 0)
且它的相对坐标 (12, -3) 的位置的颜色与 0xffffff 的色偏小于 0x101010
且它的相对坐标 (5, -18) 的位置的颜色与 0x00adee 色偏小于 0x123456
且……(后面的同理)都能匹配的那个点--]]-- 等效代码如下:x, y = screen.find_color({
{ 509, 488, {0xec1c23, 0x000000}},
{ 521, 485, {0xffffff, 0x101010}},
{ 514, 470, {0x00adee, 0x123456}},
{ 508, 478, {0xffc823, 0x101001}},
{ 511, 454, {0xa78217, 0x101001}},
{ 521, 433, {0xd0d2d2, 0x101001}},}, 0, 0, 100, 100)--[[
在左上为 0, 0 右下为 100, 100 的区域找到第一点与 0xec1c23 完全相似 (色偏为 0)
且它的相对坐标 (521-509, 485-488) 的位置的颜色与 0xffffff 的色偏小于 0x101010
且它的相对坐标 (514-509, 470-488) 的位置的颜色与 0x00adee 色偏小于 0x123456
且……(后面的同理)都能匹配的那个点--]]-- 不换行无缩进就是这个效果:x, y = screen.find_color({{0,0,{0xec1c23,0x000000}},{12,-3,{0xffffff,0x101010}},{5,-18,{0x00adee,0x123456}},{-1,-10,{0xffc823,0x101001}},{2,-34,{0xa78217,0x101001}},{12,-55,{0xd0d2d2,0x101001}},},0,0,100,100)x, y = screen.find_color({ -- 反匹配演示,在 5C 主屏幕运行可获得结果
288, {0xffffff, 0x101010} },
286, {0xffffff, 0x101010} },
289, {0xffffff, 0x101010} },
296, {0xffffff, 0x101010} },
297, {0xffffff, 0x101010} },
295, {0xffffff, 0xff101010} }, -- 这一点颜色与 0xffffff 色差大于 0x101010 才匹配,下同
291, {0xffffff, 0xff101010} },
284, {0xffffff, 0xff101010} },
298, {0xffffff, 0xff101010} },
298, {0xffffff, 0xff101010} },
296, {0xffffff, 0xff101010} },}) -- 不写区域参数表示全屏找results = screen.find_color({ -- 范围匹配全输出演示
278, {0xde1d26, 0x101010} },
285, {0x007aff, 0x101010} },
292, {0xe4ddc9, 0x101010} },
314, {0xffde02, 0x101010} },
291, {0xffde02, 0x101010} },
283, {0xe4ddc9, 0x101010} },
find_all = true, -- 带这个标签将返回范围所有匹配的位置的一个表,格式为 {{x1, y1}, {x2, y2}, ...}}) -- 不写区域参数表示全屏找
获取屏幕图像 (screen.image)
图像 = screen.image([ 左, 上, 右, 下 ])
参数及返回值
左, 上, 右, 下
整数型,可选参数,代表图像区域,默认 全屏
图片对象,返回一个图片对象,用法参考
获取屏幕上区域或全部图像
该方法会产出一个新的图片对象,如需保证高效频繁使用请搭配
-- screen.image 的示例代码screen.image():save_to_album() -- 全屏截图并保存到相册screen.image():save_to_png_file("/User/1.png") -- 全屏截图并保存到文件 /User/1.pngscreen.image(100, 100, 200, 200):save_to_album() -- 截取左上坐标为 100, 100 右下坐标为 200, 200 的区域图像保存到相册pasteboard.write(screen.image(100, 100, 200, 200):png_data(), "public.png")-- 截取左上坐标为 100, 100 右下坐标为 200, 200 的区域图像写入到剪贴板
注:上述代码中使用了非本章函数 、、、
屏幕区域文字识别 (screen.ocr_text)
识别结果, 结果详情 = screen.ocr_text(左, 上, 右, 下 [, 结果范围, 二值化选项 ])
参数及返回值
左, 上, 右, 下
整数型,代表识别区域
可以是 文本型 或 表型 参数
详情可参考
二值化选项 *1.1.0-1 新增
可以是 实数型 或 文本型 或 表型 参数,分别代表
实数型,二值化阈值,可参考
表型,自定义二值化色偏,参考
文本型,自定义二值化色偏,参考
文本型,识别返回的文字
结果详情 *1.1.3-1 新增
表型,识别结果的每个可见字符的位置描述
识别屏幕区域上的文字,该函数会引用 image.tess_ocr 模块
内置 OCR 识别库引擎为 tesseract 3.02 版,版本不对或者字库文件损坏会导致 XXTouch 脚本服务崩溃
这里提供适用于 XXTouch 的 tesseract 引擎版本为 3.05 版的 OCR 识别库
XXTouch 已内置 eng 识别库 [A-Za-z0-9] 能识别常规英文和数字
如果需要做简体中文或是其它语言文字识别
需要手动导入相关的字库文件到设备的 /var/mobile/Media/1ferver/tessdata/ 目录
二值化选项 手动二值化在 1.1.0-1 版以上方可使用
结果详情 在 1.1.3-1 版以上方可使用
如果想自己进行 tesseract 字库训练可以
-- 示例 1:local txt = screen.ocr_text(187, 882, 298, 914) -- 默认配置是使用英文数字模式识别文字sys.toast("识别结果:"..txt:atrim())-- 示例 2(1.1.0-1 新增):local txt = screen.ocr_text(465, 241, 505, 269, "eng", "9D5D39-0F1F26,D3D3D2-2C2C2D") -- 使用色偏二值化识别sys.toast("识别结果:"..txt:atrim())-- 示例 3(1.1.0-1 新增):local txt = screen.ocr_text(465, 241, 505, 269, "eng", {{0x9D5D39, 0x0F1F26},{0xD3D3D2, 0x2C2C2D}}) -- 使用色偏二值化识别,同上sys.toast("识别结果:"..txt:atrim())-- 示例 4:local txt = screen.ocr_text(187, 882, 298, 914, {
lang = "chi_sim",
-- 使用简体中文库识别(注意,简体中文库不是内置的)
white_list = "你我他",
-- 白名单设为 "你我他"})sys.toast("识别结果:"..txt:atrim())-- 示例 5(1.1.0-1 新增):local txt = screen.ocr_text(187, 882, 298, 914, {
lang = "eng",
white_list = "",
-- 自定义使用白名单限制仅识别为数字}, "9D5D39-0F1F26,D3D3D2-2C2C2D") -- 使用色偏二值化识别sys.toast("识别结果:"..txt:atrim())
注:上述代码中使用了非本章函数 、
屏幕找图 (screen.find_image)
横坐标, 纵坐标 = screen.find_image(图片 [, 相似度, 左, 上, 右, 下 ])
参数及返回值
需要找的图片,可以是 png 或是 jpeg 格式的图片数据
或是一个图片对象(可参考 )
文本型 *1.1.2-1 新增
需要找的图片文件路径,如果不是合法路径则会以数据方式解析
整数型,可选参数,需要找的图片的相似度,范围 1~100,默认为 95
左, 上, 右, 下
整数型,可选参数,搜索区域,默认 全屏
横坐标, 纵坐标
整数型,返回找到的图片的左上角坐标,搜索失败返回 -1, -1
在屏幕上寻找一个图像的位置,该函数会引用 image.cv 模块
注意: 如果需要做多分辨率兼容,那么建议是于分辨率最小的设备上截图;大分辨率上的截图会无法在小分辨率设备上找到
-- 示例 1(使用 XXT 取色器 Shift + 鼠标左键框选图像上的区域 可直接生成这样的代码):x, y = screen.find_image( -- 原图位置 左上: 354, 274 | 右下: 358, 284"\x89\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x00\x04\x00\x00\x00\x0a\x08\x02\x00\x00\x00\x1c\x99\x68\x59\x00\x00\x00\x61\x49\x44\x41\x54\x78\xda\x63\x78\xfd\xf4\xda\xff\xff\xff\xff\xfd\xfb\xf7\xed\xcb\x5b\x86\xf7\xaf\x1f\xfc\x87\x01\x86\x2f\x1f\x5f\x02\xa9\xef\xa7\xce\x7c\xdd\xb1\x9b\xe1\xe7\xf7\xcf\x40\xce\xeb\xb2\xea\x7b\xb2\x6a\x0c\x7f\xff\xfe\x01\x72\x9e\x78\x06\x82\x38\x20\xdd\xbf\x7e\xdd\x57\xd4\x82\x72\x7e\xdd\xba\x0d\x64\x41\x39\x08\xd3\x80\x38\x6b\xe3\x7f\x86\x2a\x30\x02\x72\x8c\xa6\x40\x39\x00\xd5\x7b\x5f\x2e\xfd\xba\xd5\x32\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82", 95, 0, 0, 639, 1135)-- 示例 2:img = image.load_file("/User/1.png")x, y = screen.find_image(img)x, y = screen.find_image(img, 95)-- 示例 4(1.1.2-1 新增):x, y = screen.find_image("/User/1.png", 95, 0, 0, 639, 1135)
说明:在 Lua 源码中,字符串中 \x 开头,后面跟两位 16 进制数表示以该数字编码的单个字节。例如:\x58 表示 X 这个字符,可打印字符部分参考
-- 从网上下载个小图片(一部分 XXTouch 图标)然后从屏幕上找到它并点击local c, h, r = http.get("https://www.xxtouch.com/img/find_image_test.png", 10)if (c == 200) then
local img = image.load_data(r)
if img then
x, y = screen.find_image(img, 95)
if x~=-1 then
touch.tap(x, y)
sys.alert("没有在屏幕上找到 XXTouch 图标")
sys.alert("可能下载到了一个假图片")
sys.alert("下载失败")end
注:上述代码中使用了非本章函数 、、、
模拟触摸模块(touch)
! 模拟手指轻触一次屏幕 (touch.tap)
touch.tap(横坐标, 纵坐标 [, 延迟毫秒, 操作后等待毫秒 ])
参数及返回值
横坐标, 纵坐标
整数型,需要轻触的点于当前旋转坐标系的坐标
整数型,可选参数,接触屏幕到离开屏幕之间的间隔时间,单位毫秒,默认 30
操作后等待毫秒
整数型,可选参数,轻触完成之后的等待时间,单位毫秒,默认 0
模拟手指轻触一次屏幕指定位置
这个方法可能会让出,在这个方法返回之前,其它的
可能会得到运行机会
注: 该方法在调用完成之前会占用一个手指 id,手指 id 的数量是有限的(大约 30 个),超出限制再调用
会抛出 finger pool overflow 错误,注意不要同时占用过多手指 id,及时调用 :off 方法释放手指
touch.tap(100, 100) -- 点一下屏幕上 100, 100 这个位置touch.tap(100, 100, 300) -- 在屏幕上的 100, 100 这个位置按下,等待 0.3 秒再抬起touch.tap(100, 100, 300, 1000) -- 在屏幕上的 100, 100 这个位置按下,等待 0.3 秒再抬起,再等待 1 秒
模拟手指接触屏幕 (touch.on)
触摸事件 = touch.on(横坐标, 纵坐标)
参数及返回值
横坐标, 纵坐标
整数型,需要接触的点于当前旋转坐标系的坐标
触摸事件对象,通过调用
函数可以并获得一个用于操控当前触摸的事件对象
模拟手指接触屏幕指定位置,并返回一个用于操纵本次触摸过程的触摸事件对象
注: 该函数会占用一个手指 id,手指 id 的数量是有限的(大约 30 个),超出限制再调用
会抛出 finger pool overflow 错误,注意不要同时占用过多手指 id,及时调用 :off 方法释放手指
touch.on(100, 100):move(200,200):off() -- 模拟一个手指于点 100, 100 的位置接触屏幕,然后匀速滑动到点 200, 200 的位置,然后松开
! 模拟手指在屏幕上移动 (:move)
触摸事件 = 触摸事件:move(横坐标, 纵坐标)
参数及返回值
横坐标, 纵坐标
整数型,需要移动至的点于当前旋转坐标系的坐标
触摸事件对象,通过调用
函数可以获得一个用于操控当前触摸的事件对象
模拟手指从当前位置移动到其它的位置
这个方法可能会让出,在这个方法返回之前,其它的
可能会得到运行机会
touch.on(100, 100):move(200,200):off() -- 模拟一个手指于点 100, 100 的位置接触屏幕,然后匀速滑动到点 200, 200 的位置,然后松开
! 模拟手指在屏幕上施加压力 (:press)
触摸事件 = 触摸事件:press([ 压力, 速度 ])
参数及返回值
整数型,可选参数,压力,范围 1~10000,默认 1000
整数型,可选参数,施加压力的速度,范围 1~100,默认 最快速
触摸事件对象,通过调用
函数可以获得一个用于操控当前触摸的事件对象
模拟手指在当前位置施加压力,该方法仅能用于支持 3D Touch 的设备
这个方法可能会让出,在这个方法返回之前,其它的
可能会得到运行机会
touch.on(100, 100):press():off() -- 模拟一个手指于点 100, 100 的位置接触屏幕,然后用力按下去,然后松手touch.on(100, 100):press(2000):off() -- 上面例子改一点压力touch.on(100, 100):press(2000, 50):off() -- 上面例子改一点压力,按压速度放慢
模拟手指离开屏幕 (:off)
触摸事件:off([ 横坐标, 纵坐标 ])
参数及返回值
横坐标, 纵坐标
整数型,可选参数,手指离开屏幕的点于当前旋转坐标系的坐标,默认 当前 te 事件记录的坐标
触摸事件对象,通过调用
函数可以获得一个用于操控当前触摸的事件对象
模拟手指从当前位置或指定位置离开屏幕,该方法调用会释放当前触摸事件对象
该方法会释放掉
返回的触摸事件对象所占用的手指 id
touch.on(100, 100):off() -- 模拟一个手指于点 100, 100 的位置接触屏幕,然后于当前位置离开屏幕touch.on(100, 100):off(105, 95) -- 模拟一个手指于点 100, 100 的位置接触屏幕,然后于 105, 95 这个位置离开屏幕
设置触摸事件对象移动步长 (:step_len)
触摸事件 = 触摸事件:step_len(步长)
参数及返回值
整数型,可选参数,默认为 2
触摸事件对象,通过调用
函数可以获得一个用于操控当前触摸的事件对象
设置当前触摸事件对象使用 move 方法滑动的步长
touch.on(100, 100):step_len(3):step_delay(0.2):move(200,200):off() -- 模拟一个手指于点 100, 100 的位置接触屏幕,以步长为 3 、每步延迟为 0.2 毫秒的速度滑动到点 200, 200 的位置离开屏幕
设置触摸事件对象移动每步延迟 (:step_delay)
触摸事件 = 触摸事件:step_delay(每步延迟)
参数及返回值
每步延迟毫秒
实数型,可选参数,每步延迟时间,单位毫秒,默认 0.1
触摸事件对象,通过调用
函数可以获得一个用于操控当前触摸的事件对象
设置当前触摸事件对象使用 move 方法滑动的每步延迟
touch.on(100, 100):step_len(3):step_delay(0.2):move(200,200):off() -- 模拟一个手指于点 100, 100 的位置接触屏幕,以步长为 3 、每步延迟为 0.2 毫秒的速度滑动到点 200, 200 的位置离开屏幕
! 毫秒级延迟 (:msleep)
触摸事件 = 触摸事件:msleep(毫秒数)
参数及返回值
实数型,可选参数,延迟时间,单位毫秒,默认 0.1
触摸事件对象,通过调用
函数可以获得一个用于操控当前触摸的事件对象
延迟函数,这个函数不会对对象有影响,仅仅起个阻塞当前线程的作用,该方法有个别名 :delay
这个方法可能会让出,在这个方法返回之前,其它的
可能会得到运行机会
touch.on(100, 100):msleep(300):off() -- 模拟一个手指于点 100, 100 的位置接触屏幕,等待 300 毫秒,离开屏幕
设置触摸圆点显示 (touch.show_pose)
touch.show_pose(是否显示)
参数及返回值
布尔型,true 为显示;false 为不显示
设置 touch 模块函数调用时是否显示圆点在屏幕上
打开圆点显示会极大降低 touch 模块函数的效率,并且长时间使用会影响系统稳定性,建议仅用于调试环境
touch.show_pose(true)touch.tap(100, 100)
touch 示例代码
-- 可以这样:touch.on(306, 300):step_len(2):step_delay(0):move(350, 800):msleep(1000):off()-- 上面那个例子也能写成这样:touch.on(306, 300)
-- 模拟手指在 306,300 这个坐标点接触屏幕
:step_len(2)
-- 设置移动步长为 2
:step_delay(0) -- 设置移动每步延迟为 0
:move(350, 800) -- 以上面两个参数所设置移动到 350,800 这个坐标
:msleep(1000)
-- 等 1000 毫秒(也就是 1 秒):off()
-- 手指离开屏幕-- 或是这样:local te = touch.on(306,300)te:step_len(2)te:step_delay(0)te:move(350, 800)te:msleep(1000)te:off()-- 通常情况下,滑动代码可以写成这样touch.on(306, 300)
:move(350, 800)
:msleep(1000):off()-- 等效于touch.on(306, 300):move(350, 800):msleep(1000):off()-- 也可以这样用于模拟轻触屏幕一次touch.on(306, 300):msleep(30):off()
精确滑动的实现示例
-- 快速精确滑动可能需要一些技巧,看下面的例子以及注释touch.on(125, 2000) -- 在起始坐标按下
:step_len(10)
-- 步长设长以便加速滑动
:move(125, 555) -- 快速移动到接近目标位置
:step_len(1)
-- 步长设短缓冲防止惯性
:move(125, 505) -- 慢速移动目标位置
:delay(100)
-- 抬起前等待一段时间:off()
-- 抬起手指
模拟按键模块(key)
模拟按一下物理按键 (key.press)
key.press(按键码)
参数及返回值
文本型,物理按键的按键码,键码在
模拟按下物理按键然后松开它
与此函数已知的冲突插件:Background Manager
模拟按下物理按键 (key.down)
key.down(按键码)
参数及返回值
文本型,物理按键的按键码,键码在
模拟按下物理按键
注意 这个函数应当有对应的
调用,否则在脚本终止之后,会发生按键一直不释放的问题。
与此函数已知的冲突插件:Background Manager
松开按下的物理按键 (key.up)
key.up(按键码)
参数及返回值
文本型,物理按键的按键码,键码在
模拟松开按下物理按键
与此函数已知的冲突插件:Background Manager
模拟键入文本 (key.send_text)
key.send_text(文本 [, 每键延迟 ])
参数及返回值
文本型,待输入的文字,只能是英文数字和半角字符还有 "\b" "\r" "\t"
整数型,输入每次按键延迟,默认没有延迟以设备性能极限输入
该函数可用于所有的 input_text 函数都无效的情况下,强行模拟键盘键入
亲测可以输入支付宝的支付密码
与此函数已知的冲突插件:Background Manager
key.send_text("AbC12#") -- 尽可能快的键入文本key.send_text("AbC12#", 300) -- 每键入一次延迟 0.3 秒
示例及支持的键码列表
模拟按 HOME 键
key.press("HOMEBUTTON")
模拟长按 HOME 键
key.down("HOMEBUTTON") -- 按下 HOME 键sys.msleep(1000) -- 等待 1 秒key.up("HOMEBUTTON") -- 松开 HOME 键
模拟双击 HOME 键
key.press("HOMEBUTTON")key.press("HOMEBUTTON")
模拟按锁屏键(电源键)
key.press("LOCK")
模拟按回车键
key.press("RETURN")
-- 下面这个例子是模拟组合键 [command + v] 粘贴剪贴板的文本(不是 windows 上的 control + v )key.down("LEFTCOMMAND") -- 按下 command 键sys.msleep(20) -- 等待 20 毫秒key.press("V") -- 按一下 v 键sys.msleep(20) -- 等待 20 毫秒key.up("LEFTCOMMAND") -- 松开 command 键key.press("VOLUMEUP") -- 按一下音量 + 键key.press("VOLUMEDOWN") -- 按一下音量 - 键key.down("VOLUMEUP") -- 按下音量 + 键sys.msleep(1000) -- 等待 1 秒key.up("VOLUMEUP") -- 松开音量 + 键key.down("LOCK") -- 按下锁屏键(电源键)sys.msleep(3000) -- 等待 3 秒key.up("LOCK") -- 松开锁屏键(电源键)key.press("SHOW_HIDE_KEYBOARD") -- 按一下[隐藏/显示键盘键]隐藏虚拟键盘key.press("SHOW_HIDE_KEYBOARD") -- 再按一下[隐藏/显示键盘键]显示虚拟键盘-- 下面这个例子是模拟组合键 [锁屏键 + HOME键] 实现截屏到相册key.down("LOCK") -- 按下锁屏键(电源键)sys.msleep(100) -- 等待 100 毫秒key.press("HOMEBUTTON") -- 按一下 HOME 键sys.msleep(100) -- 等待 100 毫秒key.up("LOCK") -- 松开锁屏键(电源键)-- iOS7、iOS8 切换输入法的组合键key.down("LEFTCOMMAND")sys.msleep(50)key.press(" ")sys.msleep(50)key.up("LEFTCOMMAND")-- iOS9 切换输入法的组合键key.down("LEFTCONTROL")sys.msleep(50)key.press("SPACE")sys.msleep(50)key.up("LEFTCONTROL")
注:上述代码中使用了非本章函数
支持的键码列表
-- 字母键:"A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"-- 数字键:"1" "2" "3" "4" "5" "6" "7" "8" "9" "0"-- 功能键:"F1" "F2" "F3" "F4" "F5" "F6" "F7" "F8" "F9" "F10" "F11" "F12"-- 其它键:"RETURN"
--& 回车键"ESCAPE"
--& ESC键"BACKSPACE"
--& 退格键"TAB"
--& 制表符键"SPACE"
--& 空格键"HYPHEN"
--& "-" 或 "_" 键"EQUAL"
--& "=" 或 "+" 键"BRACKETOPEN"
--& "[" 或 "{" 键"BRACKETCLOSE"
--& "]" 或 "}" 键"BACKSLASH"
--& "\" 或 "|" 键"SEMICOLON"
--& ";" 或 ":" 键"QUOTATION"
--& 单引号或双引号键"ACCENT"
--& "`" 或 "~" 键"COMMA"
--& "," 或 "&" 键"DOT"
--& "." 或 "&" 键"SLASH"
--& "/" 或 "?" 键"CAPSLOCK"
--& 大小写锁定键"PAUSE""INSERT""HOME"
--& 这个不完全等于 iOS 设备的 HOME 键"PAGEUP""DELETE""END""PAGEDOWN""RIGHTARROW"
--& 向右箭头键"LEFTARROW"
--& 向左箭头键"DOWNARROW"
--& 向下箭头键"UPARROW"
--& 向上箭头键"LEFTCONTROL"
--& 左侧 Ctrl 键"LEFTSHIFT"
--& 左侧 Shift 键"LEFTALT"
--& 左侧 Alt 键"LEFTCOMMAND"
--& 左侧 Command 键"RIGHTCONTROL"
--& 右侧 Ctrl 键"RIGHTSHIFT"
--& 右侧 Shift 键"RIGHTALT"
--& 右侧 Alt 键"RIGHTCOMMAND"
--& 右侧 Command 键"LOCK"
--& 锁屏键,或电源键"HOMEBUTTON"
--& 这个才等于 iOS 设备的 HOME 键"FORWARD"
--& 多媒体下一首"REWIND"
--& 多媒体上一首"FORWARD2"
--& 多媒体下一首2"REWIND2"
--& 多媒体上一首2"EJECT""PLAYPAUSE"
--& 多媒体暂停键"MUTE"
--& 静音键"VOLUMEUP"
--& 音量 + 键"VOLUMEDOWN"
--& 音量 - 键"SPOTLIGHT"
--& Spotlight 键"BRIGHTUP"
--& 屏幕亮度 + 键"BRIGHTDOWN"
--& 屏幕亮度 - 键"SHOW_HIDE_KEYBOARD" --& 隐藏/显示键盘键
模拟重力加速计模块(accelerometer)
模拟加速计数据 (accelerometer.simulate)
accelerometer.simulate(横坐标, 纵坐标, 垂直坐标, 附加选项)
参数及返回值
实数型, x 轴加速度
实数型, y 轴加速度
实数型, z 轴加速度
模拟加速器数据
这个函数不支持 iOS 10 及以上版本操作系统
for i = 1, 100 do
accelerometer.simulate(i, i, i, 0)end
模拟摇一摇 (accelerometer.shake)
accelerometer.shake()
对 accelerometer.simulate 的封装,模拟摇一摇手机
这个函数不支持 iOS 10 及以上版本操作系统
for i = 1, 10 do -- 摇十下
accelerometer.shake()
sys.msleep(1000)end
注:上述代码中使用了非本章函数
改变当前重力方向为 home 在左 (accelerometer.rotate_home_on_left)
accelerometer.rotate_home_on_left()
对 accelerometer.simulate 的封装
如果前台 App 并不支持横屏,那这个调用无效果
这个函数不支持 iOS 10 及以上版本操作系统
改变当前重力方向为 home 在右 (accelerometer.rotate_home_on_right)
accelerometer.rotate_home_on_right()
对 accelerometer.simulate 的封装
如果前台 App 并不支持横屏,那这个调用无效果
这个函数不支持 iOS 10 及以上版本操作系统
改变当前重力方向为 home 在上 (accelerometer.rotate_home_on_top)
accelerometer.rotate_home_on_top()
对 accelerometer.simulate 的封装
如果前台 App 并不支持竖屏,那这个调用无效果
这个函数不支持 iOS 10 及以上版本操作系统
改变当前重力方向为 home 在下 (accelerometer.rotate_home_on_bottom)
accelerometer.rotate_home_on_bottom()
对 accelerometer.simulate 的封装
如果前台 App 并不支持竖屏,那这个调用无效果
这个函数不支持 iOS 10 及以上版本操作系统
系统模块(sys)
显示提示文字 (sys.toast)
sys.toast(文字内容 [, 旋转方向 ])
参数及返回值
文本型, 代表需要显示的文字
整数型,屏幕旋转方向,可选参数,默认为最后一次调用
所设的那个方向
有效取值范围:
0 - 竖屏 home 在下
1 - 横屏 home 在右
2 - 横屏 home 在左
3 - 竖屏 home 在上
-1 - 立刻隐藏 toast
在当前旋转坐标系的屏幕下方显示提示文字
该函数是异步进行的,提示文字总计显示时间为 2.8 秒,会影响取色,不会拦截点击
-- 显示一个 toastsys.toast("果断 hello world")
-- 实时显示当前日期时间while (true) do
sys.toast("默认长按音量键可停止脚本\n\n"..os.date("%Y年%m月%d日%H点%M分%S秒"), device.front_orien())
sys.msleep(1000)end
注:上述代码中使用了非本章函数 、
弹出系统提示 (sys.alert)
选择 = sys.alert(文字内容 [, 自动消失秒数, 标题, 按钮0标题, 按钮1标题, 按钮2标题 ])
参数及返回值
文本型, 代表弹出提示内容
自动消失秒数
实数型, 可选参数,代表弹窗自动消失时间,单位秒,设置 0 不自动消失,默认 0
文本型, 可选参数,代表弹出提示的标题,默认 "XXT"
* 1.2-1 版以上默认标题为 "脚本提示"
按钮0(取消按钮)标题
文本型, 可选参数,代表弹出提示窗的默认按钮的标题,默认为 "好"
文本型, 可选参数,代表弹出提示窗的额外的第 1 个按钮标题,默认不显示这个按钮
文本型, 可选参数,代表弹出提示窗的额外的第 2 个按钮标题,默认不显示这个按钮
返回 0 代表选择了 按钮0(取消按钮)
返回 1 代表选择了 按钮1
返回 2 代表选择了 按钮2
返回 3 代表超时自动消失
返回 71 代表春板(SpringBoard)挂了
弹出一个系统提示对话框,最多可以有 3 个按钮,阻塞所有线程等待返回
local choice = sys.alert('你现在将要干啥?', 10, '你的选择', '取消', '吃饭', '睡觉')if choice==0 then
sys.alert('你选择‘取消’')elseif choice==1 then
sys.alert('你选择‘吃饭’')elseif choice==2 then
sys.alert('你选择‘睡觉’')elseif choice==3 then
sys.alert('你没有选择,超时了')else
sys.alert('春板挂了')end
弹出输入提示 (sys.input_box)
弹出一个系统输入对话框,最多可以有 3 个按钮,2 个文本框,阻塞所有线程等待返回
标题默认为 "XXT"
* 1.2-1 版以上默认标题为 "脚本提示"
输入的内容 = sys.input_box("描述内容")输入的内容 = sys.input_box("标题", "这是描述内容")输入的内容 = sys.input_box("标题", "这是描述内容", 0)输入的内容 = sys.input_box("标题", "描述内容", "文本框阴影提示", 0)输入的内容 = sys.input_box("标题", "描述内容", "文本框阴影提示", "文本框里面的内容", 0)输入的内容 = sys.input_box("标题", "描述内容", "文本框阴影提示", "文本框里面的内容", "默认按钮标题", 0)输入的内容, 做出的选择 = sys.input_box("标题", "描述内容", "文本框阴影提示", "文本框里面的内容", "默认按钮标题", "按钮1标题", 0)输入的内容, 做出的选择 = sys.input_box("标题", "描述内容", "文本框阴影提示", "文本框里面的内容", "默认按钮标题", "按钮1标题", "按钮2标题", 0)输入的内容1, 输入的内容2 = sys.input_box("标题", "描述内容", {"文本框1阴影提示", "文本框2阴影提示"}, 0)输入的内容1, 输入的内容2 = sys.input_box("标题", "描述内容", {"文本框1阴影提示", "文本框2阴影提示"}, {"文本框1里面的内容", "文本框2里面的内容"}, 0)输入的内容1, 输入的内容2, 做出的选择 = sys.input_box("标题", "描述内容", {"文本框1阴影提示", "文本框2阴影提示"}, {"文本框1里面的内容", "文本框2里面的内容"}, "默认按钮标题", "按钮1标题", "按钮2标题", 0)
输入文字 (sys.input_text)
sys.input_text(文字内容 [, 输入完成按回车 ])
参数及返回值
文本型,需要输入的文字,不支持 "\b" (退格键)
输入完成按回车
布尔型,是否在输入完毕后按下键盘上的回车键(发送、搜索等),默认 false
在前台程序的可以输入文本的地方输入文字
该函数原理为先将文本写入剪贴板,然后调用粘贴快捷键(command + v)粘贴文本
该函数的调用会影响公共剪贴板,请注意在调用之前备份好剪贴板中的重要数据
在系统公共剪贴板损坏的情况下,该函数的文字输入会失效。也就是不能复制粘贴文字,就不能用
与此函数已知的冲突插件:Background Manager
如果遇到无法作用的情况可以参考
或许能解决
sys.input_text("我爱你") -- 在当前光标所在文本框输入“我爱你”sys.input_text("我爱你", true) -- 在QQ聊天界面输入“我爱你”然后按下回车发送出去
! 毫秒级延迟 (sys.msleep)
sys.msleep(毫秒数)
参数及返回值
实数型, 需要延迟等待的时间,单位毫秒
让当前线程阻塞等待一定时间
这个方法可能会让出,在这个方法返回之前,其它的
可能会得到运行机会
sys.msleep(1000) -- 等待 1 秒
时间戳 = sys.mtime()
参数及返回值
整数型, 返回毫秒级 UNIX 时间戳
local ms = sys.mtime()screen.keep()sys.alert('一次 screen.keep 耗时:'..sys.mtime()-ms..'毫秒')
注:上述代码中使用了非本章函数
秒级时间戳 = sys.net_time([ 超时时间 ])
参数及返回值
实数型,可选参数,用于设置获取网络时间联网的最大等待时间(单位:秒),默认 2
秒级时间戳
整数型, 成功则返回当前网络时间的秒级 UNIX 时间戳,连接超时或未能成功获取网络时间返回 0
这个方法可能会让出,在这个方法返回之前,其它的
可能会得到运行机会
local nt = sys.net_time() -- 获取网络时间,默认 2 秒超时,超时返回 0local nt = sys.net_time(5) -- 获取网络时间,5 秒超时,超时返回 0if nt==0 then
sys.alert('获取网络时间失败')else
sys.alert(os.date('当前网络时间\n%Y-%m-%d %H:%M:%S', nt))end
注:上述代码中使用了
产生一个随机数 (sys.rnd)
随机数字 = sys.rnd()
参数及返回值
整数型,返回一个随机数字,范围 0~
产生一个真随机数
math.randomseed(sys.rnd()) -- 初始化随机因子为一个真随机数local r = math.random(1, 100) -- 产生一个 1~100 范围的随机数
内存状态 = sys.memory_info()
参数及返回值
表型,返回的内存状态信息,里面的 key - value 对应自己理解吧
sys.alert(table.deep_print(sys.memory_info()))
注:上述代码中使用了非本章函数
获取设备当前可用内存值 (sys.available_memory)
可用内存 = sys.available_memory()
参数及返回值
实数型,返回当前设备的空闲内存值(单位:MB)
sys.alert('当前可用内存为:'..sys.available_memory()..'MB')
获取设备当前未使用的存储空间值 (sys.free_disk_space)
剩余空间 = sys.free_disk_space([挂载点])
参数及返回值
文本型,默认有效取值范围为 "/var" 或是 "/",分别代表用户空间和系统空间。有外部存储比如内存卡的时候可以有其它值
实数型,返回设备当前未使用的存储空间值(单位:MB)
sys.alert(
'当前系统空间剩余\n'..sys.free_disk_space('/')..'MB\n\n'..
'当前用户空间剩余\n'..sys.free_disk_space('/var')..'MB')
输出标准系统日志 (sys.log)
sys.log(日志内容)
参数及返回值
文本型,代表需要输出的日志内容
输出标准系统日志
日志可以使用电脑浏览器打开远程接口 http://&设备IP地址&:46952/log.html 实时查看
日志会同时存储到设备上的 /var/mobile/Meida/1ferver/log/sys.log 文件中
/var/mobile/Meida/1ferver/log/sys.log 记录的日志最多不会超过 4000 行,超过则删前面的
sys.log("当然是 Hello World 啦")
问系统一个问题 (sys.mgcopyanswer)
答案 = sys.mgcopyanswer(问题)
参数及返回值
文本型,问题名字,一些 问题名字 参考
字符串型 或 表型 或 实数型 或 整数型 或 布尔型 或 nil,系统的回复,如果问题不被支持,则返回 nil
这个函数在 1.1.2-1 版以上方可使用
获取一些系统信息,底层使用
获取系统信息 读取系统信息 获取设备信息 读取设备信息 设备标识 获取手机号 读取手机号
sys.alert("设备的序列号是:"..sys.mgcopyanswer("SerialNumber"))sys.alert("设备的 IMEI 是:"..sys.mgcopyanswer("InternationalMobileEquipmentIdentity"))sys.alert("设备的 MEID 是:"..sys.mgcopyanswer("MobileEquipmentIdentifier"))local infos = sys.mgcopyanswer('CarrierBundleInfoArray')if type(infos) == 'table' then
local info = infos[1]
if #infos & 0 and
if type(info.InternationalMobileSubscriberIdentity) == 'string' andthen
type(info.IntegratedCircuitCardIdentity) == 'string' then
sys.alert( sys.alert("运营商 IMSI 是:"..info.InternationalMobileSubscriberIdentity)
sys.alert("无法读取运营商 IMSI,或许你应该插入一张 SIM 卡")
"IMSI:"..if type(info.InternationalMobileSubscriberIdentity.."\n"..
"ICCID:"..info.IntegratedCircuitCardIdentity
) == 'string' then
sys.alert("运营商 IMSI 是:"..info.InternationalMobileSubscriberIdentity)
sys.alert("无法读取运营商 IMSI、ICCID,或许你应该给设备插入一张正常的 SIM 卡")
sys.alert("无法读取运营商信息,或许你应该给设备插入一张正常的 SIM 卡")endlocal phone_number = sys.mgcopyanswer('PhoneNumber')if sys.mgcopyanswer('SIMTrayStatus') == 'kCTSIMSupportSIMTrayInsertedWithSIM' and type(phone_number) == 'string' then
sys.alert("手机号是:"..phone_number)else
sys.alert("无法读取手机号,或许你应该给设备插入一张正常的 SIM 卡")end
获取系统版本 (sys.version)
系统版本 = sys.version()
参数及返回值
文本型,返回系统版本号
这个函数可以在 XUI 中使用
sys.alert('当前系统版本:'..sys.version())
获取 XXTouch 版本 (sys.xtversion)
版本号 = sys.xtversion()
参数及返回值
文本型,返回 XXTouch 版本号
这个函数可以在 XUI 中使用
sys.alert('当前 XXTouch 版本:'..sys.xtversion())
剪贴板模块(pasteboard)
写内容进剪贴板 (pasteboard.write)
pasteboard.write(数据 [, 通用类型标识 ])
参数及返回值
字符串型,需要写入到剪贴板的内容
通用类型标识
文本型,可选参数,,默认 "public.utf8-plain-text"
写内容进系统剪贴板
(关键字:粘贴板 复制板 写入剪贴板 写入剪切板 更改剪切板 写入粘贴板 更改粘贴板 写入黏贴板 更改黏贴板)
pasteboard.write("演示啊") -- 将“演示啊”(不含引号)写入到剪贴板中pasteboard.write(screen.image():png_data(), 'public.png') -- 将当前屏幕截图写入到剪贴板
注:上述代码中使用了非本章函数
获取剪贴板中的数据 (pasteboard.read)
数据 = pasteboard.read([ 通用类型标识 ])
参数及返回值
通用类型标识
文本型,可选参数,,默认 自动判断格式
存在 通用类型标识 参数的情况下,会强制以该 通用类型标识 格式读取剪贴板中数据,若是剪贴板中数据无法以该 通用类型标识 读取,则返回空字符串
字符串型,返回剪贴板中的数据,可能是文本,也可能是二进制数据,如果不能以该方式读取,则返回 ""(空文本)
从系统剪贴板中读取内容
(关键字:粘贴板 复制板 读取剪贴板 读取剪切板 获取剪切板 读取黏贴板 获取黏贴板)
sys.alert("剪贴板中的内容:"..pasteboard.read())sys.alert("剪贴板中的内容:"..pasteboard.read('public.text')) -- 富文本也强行以文本方式读取剪贴板
注:上述代码中使用了非本章函数
对话框模块(dialog)
! 建立一个对话框对象 (dialog)
对话框对象 = dialog()
参数及返回值
对话框对象
对话框,返回一个对话框对象
建立一个对话框对象
注意 这个函数没有参数,请不要 给任何参数,带参数调用是弹出一个弹窗,声明如下
dialog(弹窗内容:文本型, 超时秒:实数型)
dialog('Hello, XXTouch!', 10)
dialog():show()
配置对话框配置保存文件名 (:config)
对话框对象 = 对话框对象:config(配置名)
参数及返回值
文本型,配置对话框对象的选项配置保存名
对话框对象
对话框,返回对话框本身
对话框显示出来,并且用户按下 提交 后会保存配置选项,再次显示出来的时候默认选上保存好的配置
配置将以文件形式保存在 /private/var/mobile/Media/1ferver/uicfg/&配置名&.xcfg
dialog():config('配置名'):show()
配置对话框配置保存文件名 (:set_config)
对话框对象 = 对话框对象:set_config(配置名)
参数及返回值
文本型,配置对话框对象的选项配置保存名
对话框对象
对话框,返回对话框本身
这个方法在 1.2-1 版以上方可使用
对话框显示出来,并且用户按下 提交 后会保存配置选项,再次显示出来的时候默认选上保存好的配置
配置将以文件形式保存在 /private/var/mobile/Media/1ferver/uicfg/&配置名&.xcfg
与旧版 :config 方法等效
dialog():set_config('配置名'):show()
对话框对象 = 对话框对象:timeout(超时秒[, 是否提交])
参数及返回值
实数型,对话框对象自动消失时间,单位秒
是否提交 * 1.2-1 新增
布尔型,可选参数,对话框自动消失是否算提交,true 为是,false 为否,默认 false 超时算不提交
对话框对象
对话框,返回对话框本身
配置对话框自动消失时间
dialog():timeout(3):show()
对话框对象 = 对话框对象:set_timeout(超时秒[, 是否提交])
参数及返回值
实数型,对话框对象自动消失时间,单位秒
布尔型,可选参数,对话框自动消失是否算提交,true 为是,false 为否,默认 false 超时算不提交
对话框对象
对话框,返回对话框本身
这个方法在 1.2-1 版以上方可使用
配置对话框自动消失时间,与旧版 :timeout 方法等效
dialog():set_timeout(3):show() -- 3 秒超时取消提交--dialog():set_timeout(3, true):show() -- 3 秒超时并提交
配置对话框的标题 (:title)
对话框对象 = 对话框对象:title(标题文本)
参数及返回值
文本型,对话框的标题
对话框对象
对话框,返回对话框本身
配置对话框的标题
dialog():title('标题'):show()
配置对话框的标题 (:set_title)
对话框对象 = 对话框对象:set_title(标题文本)
参数及返回值
文本型,对话框的标题
对话框对象
对话框,返回对话框本身
这个方法在 1.2-1 版以上方可使用
配置对话框的标题,与旧版 :title 方法等效
配置对话框的尺寸 (:set_size)
对话框对象 = 对话框对象:set_size(宽度, 高度)
参数及返回值
宽度, 高度
整数型,对话框对象宽高,如果不设置默认是全屏宽高
对话框对象
对话框,返回对话框本身
这个方法在 1.2-1 版以上方可使用
设置对话框的尺寸,如果对话框不是全屏,则会居中于屏幕,并使用半径为 10 的圆角
local dlg = dialog()dlg:set_size(600, 800)dlg:show()
配置对话框的位置及尺寸 (:set_frame)
对话框对象 = 对话框对象:set_frame(横坐标, 纵坐标, 宽度, 高度)
参数及返回值
横坐标, 纵坐标
整数型,对话框对象左上角位置的横坐标及纵坐标
宽度, 高度
整数型,对话框对象宽高,如果不设置默认是全屏宽高
对话框对象
对话框,返回对话框本身
这个方法在 1.2-1 版以上方可使用
配置对话框的位置及尺寸,使用方角
local dlg = dialog()dlg:set_frame(0, 0, 600, 800)dlg:show()
配置对话框的圆角半径 (:set_corner_radius)
对话框对象 = 对话框对象:set_corner_radius(圆角半径)
参数及返回值
整数型,圆角半径,0 为方角
对话框对象
对话框,返回对话框本身
这个方法在 1.2-1 版以上方可使用
配置对话框的圆角半径,需要使用圆角对话框的时候可以派上用场
local dlg = dialog()dlg:set_frame(0, 0, 600, 800)dlg:set_corner_radius(50)dlg:show()
给对话框加上一个文本标签 (:add_label)
对话框对象 = 对话框对象:add_label(标签内容)
参数及返回值
文本型,标签显示的文本
对话框对象
对话框,返回对话框本身
给对话框加上一个文本标签
dialog():add_label('一个文本标签'):show()
给对话框加上一个文本输入框 (:add_input)
对话框对象 = 对话框对象:add_input(输入框标签 [, 输入框默认内容 ])
参数及返回值
输入框标签
文本型,文本框左侧标签显示的文本
输入框默认内容
文本型 或 实数型,文本框中的默认值
对话框对象
对话框,返回对话框本身
使用 :show() 返回类型
文本型,返回输入的内容
给对话框加上一个文本输入框
local c, s = dialog():add_input('一个输入框', '默认内容'):show()sys.alert('输入的内容是:'..s['一个输入框'])
注:上述代码中使用了非本章函数
给对话框加上一个图片 (:add_image)
对话框对象 = 对话框对象:add_image(图片)
参数及返回值
图片对象,需要添加到对话框的图片
对话框对象
对话框,返回对话框本身
这个方法在 1.1.0-1 版以上方可使用
给对话框加上一个图片
给对话框加上一个开关 (:add_switch)
对话框对象 = 对话框对象:add_switch(开关标签 [, 开关默认状态 ])
参数及返回值
文本型,开关左侧标签显示的文本
开关默认状态
布尔型,可选参数,开关的开启状态,默认 false (关)
对话框对象
对话框,返回对话框本身
使用 :show() 返回类型
布尔型,返回这个开关被开启的状态
给对话框加上一个开关
给对话框加上一个选择器 (:add_picker)
对话框对象 = 对话框对象:add_picker(选择器标签, 选择器的选项们 [, 默认选择 ])
参数及返回值
选择器标签
文本型,选择器左侧标签显示的文本
选择器的选项们
表型,选择器中的顺序选项名列表,不能有一样的
文本型,可选参数,选择器的默认选项名,默认为第一个
对话框对象
对话框,返回对话框本身
使用 :show() 返回类型
文本型,返回被选择的选项名
给对话框加上一个选择器
给对话框加上一个单选组 (:add_radio)
对话框对象 = 对话框对象:add_radio(单选组标签, 单选组选项们 [, 默认选择 ])
参数及返回值
单选组标签
文本型,单选组标题标签显示的文本
单选组选项们
表型,单选组中的顺序选项名列表,不能有一样的
文本型,可选参数,被选中的选项名,默认为 单选组选项们 中第一项
对话框对象
对话框,返回对话框本身
使用 :show() 返回类型
文本型,返回被选中的选项名
这个方法在 1.1.1-1 版以上方可使用
给对话框加上一个单选组
给对话框加上一个多选组 (:add_checkbox)
对话框对象 = 对话框对象:add_checkbox(多选组标签, 多选组选项们 [, 默认选择们 ])
参数及返回值
多选组标签
文本型,多选组标题标签显示的文本
多选组选项们
表型,多选组中的顺序选项名列表,不能有一样的
默认选择们
表型,可选参数,多选组的默认选项名列表,默认为 空表
对话框对象
对话框,返回对话框本身
使用 :show() 返回类型
表型,返回所有包含所有被选择的选项的一个顺序表
给对话框加上一个多选组
给对话框加上一个数值选择器 (:add_range)
对话框对象 = 对话框对象:add_range(范围选择器标签, 范围选择器参数 [, 默认位置 ])
参数及返回值
范围选择器标签
文本型,数值选择器标题标签显示的文本
范围选择器参数
表型,用于描述范围以及步进的一个表,格式为 {最小值, 最大值, 步进值}
实数型,为数值选择条最左边的位置
实数型,为数值选择条最右边的位置
实数型,可选参数,为选择条拖动的最小单位,默认为 1
实数型,可选参数,默认值,默认为最小值
对话框对象
对话框,返回对话框本身
使用 :show() 返回类型
实数型,返回所选择的数字
这个方法在 1.1.1-1 版以上方可使用
给对话框加上一个数值选择器
! 将对话框弹出来并返回用户的选择 (:show)
是否提交, 选项关联表 = 对话框对象:show()
参数及返回值
对话框对象
对话框,需要弹出的对话框
布尔型,返回是否按下了提交按钮,超时或点右上角叉返回 false
选项关联表
表型,返回一个以选项标签映射的键值表
这个方法在 1.1.1-1 版以上方可使用
将对话框弹出来并返回用户的选择
当对话框设置了配置保存(:config(配置名))的情况下,按下 提交 会保存配置,按下右上的 × 或超时则不会保存
local c, s = dialog():add_switch('一个开关', false):show()sys.alert(s["一个开关"])
local dlg = dialog() -- 创建一个 dialog 对象-- 以下为此 dialog 对象配置dlg:config('test') -- 配置保存IDdlg:timeout(30)dlg:add_label('简易的效果展示')dlg:add_range('血量', {0, 1000, 1}, 300)dlg:add_input('账号', 'ccc')dlg:add_input('密码', 'aaaa')dlg:add_picker('性别', {'男', '女', '未知'}, '男')dlg:add_switch('你是变态?', false)dlg:add_checkbox('喜欢的游戏', {'守望先锋', '魔兽世界', '炉石传说'}, {'守望先锋', '魔兽世界'})dlg:add_radio('最喜欢的游戏', {'守望先锋', '魔兽世界', '炉石传说'}, '魔兽世界')local confirm, selects = dlg:show() -- 显示 dialog 对象到前台并获得其返回值if (confirm) then
print("你按下了提交")else
print("你没有按下提交")endprint("账号", selects["账号"])print("密码", selects["密码"])print("性别", selects["性别"])print("血量", selects["血量"])if (selects['你是变态?']) then
print("你承认了自己是变态")else
print("你不承认自己是变态")endprint("你喜欢游戏列表")for _,gamename in ipairs(selects['喜欢的游戏']) do
print(gamename)endprint("你最喜欢游戏:"..selects["最喜欢的游戏"])sys.alert(print.out())
注:上述代码中使用了非本章函数
! 在不弹出对话框的情况下获得对话框配置 (:load)
是否提交, 选项关联表 = 对话框对象:load()
参数及返回值
对话框对象
对话框,需要获取返回值的对话框
布尔型,返回是否按下了提交按钮,这里将会无限返回 false
选项关联表
表型,返回一个以选项标签映射的键值表
这个方法在 1.1.1-1 版以上方可使用
在不弹出对话框的情况下获得对话框配置,如果对话框当前没有保存配置,则加载默认值
local dlg = dialog()dlg:config('test') -- 配置保存IDdlg:timeout(30)dlg:add_label('简易的效果展示')dlg:add_range('血量', {0, 1000, 1}, 300)dlg:add_input('账号', 'ccc')dlg:add_input('密码', 'aaaa')dlg:add_picker('性别', {'男', '女', '未知'}, '男')dlg:add_switch('你是变态?', false)dlg:add_checkbox('喜欢的游戏', {'守望先锋', '魔兽世界', '炉石传说'}, {'守望先锋', '魔兽世界'})dlg:add_radio('最喜欢的游戏', {'守望先锋', '魔兽世界', '炉石传说'}, '魔兽世界')local _, selectsif (utils.is_launch_via_app()) then -- 判断当前是否从 app 启动
_, selects = dlg:show()
-- 从 app 启动的脚本则弹出配置窗else
_, selects = dlg:load()
-- 音量键或其它方式启动的脚本则不再弹出endprint("账号", selects["账号"])print("密码", selects["密码"])print("性别", selects["性别"])print("血量", selects["血量"])if (selects['你是变态?']) then
print("你承认了自己是变态")else
print("你不承认自己是变态")endprint("你喜欢游戏列表")for _,gamename in ipairs(selects['喜欢的游戏']) do
print(gamename)endprint("你最喜欢游戏:"..selects["最喜欢的游戏"])sys.alert(print.out())
注:上述代码中使用了非本章函数 、
清理模块(clear)
清理某个或某组钥匙串信息 (clear.keychain)
clear.keychain(信息关联名)
参数及返回值
信息关联名
文本型,一般传入公司反域名,例如 "com.tencent",切不可乱传参数
清理某个应用程序或分组的钥匙串信息,若不懂请直接用
警告:这个函数调用产生的效果不可逆转
警告:切不可乱传参数!!!
警告:该函数在给不正确的参数的情况下可能产生极其严重的后果!!!
clear.keychain("com.tencent") -- 清理掉与 com.tencent 相关的 keychain 信息
清理所有应用程序钥匙串信息 (clear.all_keychain)
clear.all_keychain()
清理所有应用程序钥匙串信息
该函数可能在 iOS 10 及以上系统中导致重启需要重新激活的问题
警告:这个函数调用产生的效果不可逆转
clear.all_keychain()
清理剪贴板 (clear.pasteboard)
clear.pasteboard()
清理剪贴板信息,一些信息会存在剪贴板中,比如 OpenUDID
该函数在 iOS 10 及以上版本的操作系统中使用会导致剪贴板服务失去连接,表现为前台程序不能使用剪贴板,需要重启前台程序方能恢复
警告:这个函数调用产生的效果不可逆转
clear.pasteboard()
清理浏览器Cookies (clear.cookies)
clear.cookies()
清理浏览器Cookies
警告:这个函数调用产生的效果不可逆转
警告:暂不确定是否兼容 iOS 11
clear.cookies()
清理系统缓存 (clear.caches)
clear.caches()
清理系统缓存,这个函数执行会卡顿一段时间,而且卡顿期间所有线程都阻塞
该函数耗时可能会非常长,并且该函数执行的过程中使用强行停止脚本会导致停止缓慢(被强杀)
clear.caches()clear.caches{no_uicache = true} -- 1.2-2 以上版本支持不使用 uicache 清理,uicache 耗时很长,可使用 os.execute('su mobile -c uicache') 来代替
清除相册中所有本地照片 (clear.all_photos)
clear.all_photos()
清除相册中所有本地照片,不会影响 iCloud 照片流
该函数耗时可能会非常长,并且该函数执行的过程中使用强行停止脚本会导致停止缓慢(被强杀)
警告:这个函数调用产生的效果不可逆转
clear.all_photos()
清理某个应用的存档数据 (clear.app_data)
是否成功 = clear.app_data(应用程序包名)
参数及返回值
应用程序包名
文本型,应用程序包名
布尔型,清理成功返回 true;否则返回 false
清理应用存档,清理期间所有线程都阻塞
该函数耗时可能会非常长,并且该函数执行的过程中使用强行停止脚本会导致停止缓慢(被强杀)
警告:这个函数调用产生的效果不可逆转
clear.app_data("com.tencent.xin")
清理 IDFA/V (clear.idfav)
旧IDFAV信息 = clear.idfav([ 新IDFAV信息 ])
参数及返回值
新IDFAV信息
文本型,可选参数,表示指定使用这些信息作为设备的新的 idfav 信息,不传入参数表示清理后让系统自动生成。1.2-10 版新增可传入 "read" 表示不清理仅读取设备的 IDFAV 信息
旧IDFAV信息
文本型 或 nil,返回设备原来的 idfav 信息,如果操作失败,则返回 nil
重置设备 IDFA 和 IDFV 等标识信息
传入了不正确的 idfav 信息的情况下,会操作失败返回 nil
不传入参数的情况下,会清除掉设备原来的 idfav 信息,iOS系统会在之后重新随机分配 idfav
返回的 idfav 信息文本可以自行保存在文件中,等到需要恢复的时候,再当作参数传回即可
不兼容 iOS 10 及以上版本操作系统
-- 备份 idfav 信息app.quit('*') -- 关闭所有应用local old_idfavs = clear.idfav()local f = io.open("/var/mobile/Media/1ferver/res/old_idfavs.txt", "wb")if f then
f:write(old_idfavs)
clear.caches() -- 清理一下系统缓存
sys.alert("备份成功")else
clear.idfav(old_idfavs) -- 无法备份的情况下立马恢复
clear.caches() -- 清理一下系统缓存
sys.alert("备份失败")end-- 从文件中恢复 idfav 信息local f = io.open("/var/mobile/Media/1ferver/res/old_idfavs.txt", "rb")if f then
local old_idfavs = f:read("*a")
close_all_app() -- 关闭所有应用
local current_idfavs = clear.idfav(old_idfavs)
if current_idfavs then
f = io.open("/var/mobile/Media/1ferver/res/current_idfavs.txt", "wb")
f:write(current_idfavs) -- 将现有的 idfav 信息保存到另一个文件
clear.caches() -- 清理一下系统缓存
sys.alert("恢复 idfav 信息成功")
sys.alert("恢复 idfav 信息失败")
sys.alert("文件打开失败")end
注:上述代码中使用了非本章函数 、
应用程序模块(app)
获取 App 的应用程序包路径 (app.bundle_path)
包路径 = app.bundle_path(应用程序包名)
参数及返回值
应用程序包名
文本型,需要定位的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
文本型 或 nil,返回的应用程序包路径,如果应用不存在则返回 nil
获取 App 的应用程序包路径
path = app.bundle_path("com.tencent.mqq") -- 获得 QQ 的应用包路径
获取 App 的应用存档路径 (app.data_path)
存档路径 = app.data_path(应用程序包名)
参数及返回值
应用程序包名
文本型,需要定位的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
文本型 或 nil,返回应用程序的存档路径,如果应用不存在则返回 nil
获取 App 的应用存档路径
path = app.data_path("com.tencent.mqq") -- 获得 QQ 的应用存档路径
应用分组信息 = app.group_info(应用程序包名)
参数及返回值
应用程序包名
文本型,需要定位的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
应用分组信息
表型,返回应用程序的分组信息,如果不存在返回空表
软件版本在 1.1.3-1 或以上方可使用
注意:应用程序分组信息 是 iOS 8 开始才有的概念,iOS 7 没有这个概念
local function sh_escape(path) -- XXTouch 原创函数,未经 XXTouch 许可,可以用于商业用途
path = string.gsub(path, "([ \\()&&'\"`#&*;?~$])", "\\%1")
return pathendlocal info = app.group_info("com.tencent.mqq") -- 获得 QQ 的分组信息-- 循环删除所有分组目录中的内容for _,v in pairs(info) do
os.execute('rm -rf '..sh_escape(v)..'/Library/*')
os.execute('rm -rf '..sh_escape(v)..'/Documents/*')
os.execute('rm -rf '..sh_escape(v)..'/tmp/*')
os.execute('rm -rf '..sh_escape(v)..'/share/*')end
弹出一个应用通知 (app.pop_banner)
app.pop_banner(应用程序包名, 标题, 内容)
应用程序包名
文本型,应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
文本型,通知的标题
文本型,通知的内容
软件版本在 1.1.3-1 或以上方可使用
该函数不支持 iOS 8.4.x 及 iOS 11
app.pop_banner('com.tencent.mqq', 'QQ', '[QQ红包]您收到一个假红包')
运行应用程序 (app.run)
状态 = app.run(应用程序包名)
参数及返回值
应用程序包名
文本型,需要定位的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
整数型,返回运行状态
返回 0 表示启动成功
返回 其它值 表示启动失败
如果该函数在您的脚本中表现不佳,可尝试使用 runApp 函数替代它
-- 打开内置天气应用,然后退出local r = app.run("com.apple.weather") -- 启动应用 包名可在 XXT 应用程序--更多--应用列表 中查看sys.msleep(10 * 1000) -- 等 10 秒if r == 0 then
app.close("com.apple.weather") -- 退出应用else
sys.alert("启动失败", 3)end
注:上述代码中使用了非本章函数 、
关闭应用程序 (app.close)
app.close(应用程序包名 或 进程号)
参数及返回值
应用程序包名
文本型,需要关闭的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
整数型,需要关闭的应用的 process identifier(进程标识符)
关闭应用程序,参数可以是 应用程序包名 也可以是 进程号,如果应用不在运行则什么都不发生,该操作不会失败
这个关闭应用是不可拒绝的强杀,目标应用在被关闭的时候不会收到任何通知
iOS 8 及以上系统版本推荐使用
代替本函数
模拟使用上划退出应用程序 (app.quit)
app.quit(应用程序包名)
参数及返回值
应用程序包名
文本型,需要退出的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
传入 "*" 表示退出所有
这个当然也是强杀,但是与
不同的是,应用在退出前会收到通知,应用在完全关闭之前有至多 10 秒的时间保存存档,并且它会清除掉多任务切换界面的标签
请不要在锁屏状态使用,该函数可能不能良好退出 root 权限的 App,使用该函数退出 root 权限程序可能会导致屏幕卡住点图标无响应等现象,root 权限的 App 推荐使用
-- 退出所有的 Appapp.quit("*")-- 退出QQ,如果QQ正在运行的话app.quit("com.tencent.mqq")
检测应用程序是否正在运行 (app.is_running)
状态 = app.is_running(应用程序包名)
参数及返回值
应用程序包名
文本型,需要定位的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
布尔型,是否正在运行
本函数用于检查一个应用程序是否正在运行,它不区分前后台
如果要判断一个应用是否在前台运行,可以使用
获取前台应用 bid 进行对比,如下
if "com.tencent.mqq" == app.front_bid() then
sys.alert('QQ 正在前台运行')end
注:上述代码中使用了非本章函数
if app.is_running("com.tencent.mqq") then
sys.alert('QQ 正在运行')end
注:上述代码中使用了非本章函数
输入文字 (app.input_text)
app.input_text(文本内容)
参数及返回值
文本型,需要输入的文字,支持 "\b"(退格键)
在 App 中弹出键盘的情况下输入文字
已知的无法输入的位置有 AppStore 的评论
如果遇到无法作用的情况可以参考
或许能解决
-- 示例 1:app.input_text("嘿嘿嘿") -- 弹出键盘后可以输入文字-- 示例 2:app.input_text("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b") -- 删除文本框原来的内容
通过应用程序 bid 获取应用的本地化名字 (app.localized_name)
本地化名字 = app.localized_name(应用程序包名)
参数及返回值
应用程序包名
文本型,应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
本地化名字
文本型 或 nil,返回应用的本地化名字,如果应用不存在则返回 nil
local name = app.localized_name("com.tencent.xin")sys.alert(name) -- 弹出显示 “微信”
注:上述代码中使用了非本章函数
通过应用程序 bid 获取应用的图标数据 (app.png_data_for_bid)
PNG图片数据 = app.png_data_for_bid(应用程序包名)
参数及返回值
应用程序包名
文本型,应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
PNG图片数据
字符串型 或 nil,应用的图标的 png 数据(二进制数据),如果应用不存在则返回 nil
-- 将微信的图标保存到相册image.load_data(app.png_data_for_bid("com.tencent.xin")):save_to_album()
注:上述代码中使用了非本章函数 、
通过应用程序 bid 获取其 pid (app.pid_for_bid)
进程号 = app.pid_for_bid(应用程序包名)
参数及返回值
应用程序包名
文本型,需要检测的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
整数型,如果应用程序正在运行,则返回其 pid,否则返回 0
local qqpid = app.pid_for_bid("com.tencent.mqq")if qqpid~=0 then
sys.alert("当前QQ正在运行,进程号是:"..qqpid)else
sys.alert("当前QQ没有在运行")end
注:上述代码中使用了非本章函数
获取应用程序当前内存消耗 (app.used_memory)
内存占用 = app.used_memory(应用程序包名 或 进程号)
参数及返回值
应用程序包名
文本型,需要检测的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
整数型,需要检测的应用的 process identifier(进程标识符)
实数型 或 nil,如果应用正在运行则返回其所占用的内存(单位 MB),否则返回 nil
local qqmem = app.used_memory("com.tencent.mqq")sys.alert("当前QQ进程所占用的内存是:"..qqmem.."MB")
注:上述代码中使用了非本章函数
获取前台应用的 Bundle Identifier (app.front_bid)
应用程序包名 = app.front_bid()
参数及返回值
应用程序包名
文本型,返回前台应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
没有应用处于前台但桌面服务已加载返回 "com.apple.springboard"
没有应用处于前台且桌面服务尚未启动返回 "com.apple.backboardd"
获取前台应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
local bid = app.front_bid()sys.alert("前台应用的应用包名是:"..bid)
注:上述代码中使用了非本章函数
获取前台应用的 Process Identifier (app.front_pid)
进程号 = app.front_pid()
参数及返回值
整数型,返回前台应用的 process identifier(进程标识符),前台没有应用返回 0
获取前台应用的 process identifier(进程标识符)
前台没有应用返回 0 而不是桌面服务的进程号
要获取桌面进程 pid 请用
local desktop_pid = app.pid_for_bid('com.apple.springboard')sys.alert("桌面服务的进程号是:"..desktop_pid)
local pid = app.front_pid()sys.alert("前台应用的进程号是:"..pid)
注:上述代码中使用了非本章函数
前台打开一个 URL (app.open_url)
app.open_url(URL)
参数及返回值
文本型,需要打开的 URL ,可以打开 ()
前台打开一个 URL,可以打开 ()
部分 URL 用该 API 跳转可能不是想要的效果,可试试
local function sh_escape(path) -- XXTouch 原创函数,未经 XXTouch 许可,可以用于商业用途
path = string.gsub(path, "([ \\()&&'\"`#&*;?~$])", "\\%1")
return pathendos.execute('uiopen '..sh_escape('http://www.google.com'))os.execute('uiopen '..sh_escape('prefs:root=General&path=ACCESSIBILITY'))
app.open_url("http://www.google.com") -- 用 Safari 打开 Google 的主页,当然,不一定打得开app.open_url("prefs:root=General&path=ACCESSIBILITY") -- 跳转到 设置--通用--辅助功能
获取设备所有的应用的 Bundle Identifier 列表 (app.bundles)
应用程序包名数组 = app.bundles()
参数及返回值
应用程序包名数组
顺序表型,返回很多 bid 的一个表,也包括系统自带的
获取设备所有的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)列表
-- 遍历关闭所有的 appfor _,bid in ipairs(app.bundles()) do
app.close(bid)end
获取当前设备的进程列表 (app.all_procs)
进程信息数组 = app.all_procs()
参数及返回值
进程信息数组
顺序表型,返回进程列表,结构是这样 {{pid = pid1, name = name1}, {pid = pid2, name = name2}, ...}
proc_list = app.all_procs()
设置前台应用程序加速齿轮 (app.set_speed_add)
app.set_speed_add(需要加的速度 [, 强力模式 ])
参数及返回值
需要加的速度
实数型,代表加速齿轮倍数,负数为减速,正数为加速,0为不加速也不减速。前台应用重新开启后,加速效果消失
布尔型,可选参数,是否需要支持 unity 引擎加速,默认 false
强力模式 参数需要软件版本在 1.1.2-2 或以上方可使用
设置前台应用程序加速齿轮
加速并不是对所有的应用都有效果,确切的说,只对小部分游戏有效
使用该函数可能导致严重后果(包括但不限于应用卡死崩溃、系统崩溃、脚本停止、账号被封、被请喝茶)
不得将此函数用于非法用途,使用则代表同意
app.set_speed_add(3) -- 给前台 cocos2d 的游戏加速 3 倍app.set_speed_add(3, true) -- 给前台 unity3d 的游戏加速 3 倍
安装IPA安装包 (app.install)
安装成败 = app.install(文件路径 [, 强行安装 ])
参数及返回值
文本型,需要安装的 App 安装包(ipa 格式)绝对路径
强行安装 *1.1.3-1 新增
布尔型,可选参数,是否强行安装,true 为强行安装,false 为大于当前 ipa 版本不覆盖安装,默认为 false
布尔型,安装成功返回 true,安装失败返回 false
后台安装一个 ipa 格式的安装包
安装的完成之前脚本不能被自然终止并会一直阻塞
调用此函数前需确保在目标设备中已安装过 AppSync 插件
可用最新版 X.X.T. 扫描下面二维码下载并安装 AppSync 插件
app.install("/User/1.ipa", true) -- 强行覆盖安装,用于降级安装 Appif app.install("/User/1.ipa") then
-- 安装成功else
-- 安装失败end
卸载一个应用 (app.uninstall)
卸载成败 = app.uninstall(应用程序包名)
参数及返回值
应用程序包名
文本型,需要卸载的应用的 bundle identifier(应用包名,可在 XXT 应用程序--更多--应用列表 中查看)
布尔型,卸载成功返回 true,卸载失败返回 false
后台卸载一个应用程序
卸载的过程脚本不能被自然终止并会一直阻塞
if app.uninstall("com.tencent.mqq") then
-- 卸载成功else
-- 卸载失败end
app 模块 额外说明Process Identifier(进程标识符)为应用运行期的进程号,是个整数,每次运行都不一样
设备相关模块(device)
重置自动锁屏倒计时 (device.reset_idle)
device.reset_idle()
重置自动锁屏倒计时(使屏幕常亮)
不推荐太高频率使用该函数,太高频率(每秒超过 10 次)使用该函数可能导致服务崩溃或系统崩溃
-- 派发一个每 29 秒重置 IDLE 倒计时的任务thread.dispatch(function()
while 1 do
device.reset_idle()
sys.msleep(29 * 1000)
注:上述代码中使用了非本章函数及方法 、
锁定屏幕 (device.lock_screen)
device.lock_screen()
device.lock_screen()
解锁屏幕 (device.unlock_screen)
device.unlock_screen([ 锁屏密码 ])
参数及返回值
文本型,可选参数,锁屏密码,如果有锁屏密码也可以使用这个参数,如果没有则不填即可,不推荐

我要回帖

更多关于 直接跳转中心 的文章

 

随机推荐