@miniknife
2020-03-17T11:47:04.000000Z
字数 36202
阅读 99195
已不更新,最新版请查看:http://helpdoc.touchsprite.com/
开发手册
Windows 平台按 Ctrl + F 打开快捷搜索
Mac 平台按 command + F 打开快捷搜索
※右侧文本列表可以找到全部手册
更新日期: 2018-07-31
更新日志:
- 修复二值化函数导致手机内存增加的问题
更新日期: 2019-03-26
更新日志:
- 支持 iOS12 系统
更新日期: 2018-07-17
更新日志:
- 新增 ts.ftp.setFTPTimeOut 超时时间函数
- 新增查询数据库返回 table 的功能
- 修复 http 请求无法上传包含字符串格式参数的 table 的问题
- 修复 httpsGet 返回值格式不正确的问题
- 修复请求参数不支持数组的问题
- 修复 ts.httpPost 在模拟器上 post 会失败的问题
- 修复 ftp 获取列表为空的问题
- 修复 ts.qrDecode 识别二维码识别微信收款码会导致服务崩溃的问题
请在脚本开头插入 local ts = require("ts") 即可调用扩展库中所有函数。
iOS 版 ts.so 需要放到如下路径:/var/mobile/Media/TouchSprite/plugin
iOS 11 系统的设备,原 TouchSprite 文件夹下新增 plugin_ios11 快捷方式,连接到 usr/bin/tsplugin
如果系统是 iOS 11 则 tsp 自带 so 文件释放到该路径但 lua 文件释放路径保持不变
如果开发者想要手动导入 so 文件,也需要放到 usr/bin/tsplugin 目录
安卓版和模拟器版 ts.so > 需要放到如下路径:data/data/com.touchsprite.android/files/plugin
安卓设备找不到该目录时需要使用第三方文件管理器,推荐 RE文件管理器
- 模拟器版部分功能不支持,请自行尝试
- 安卓和 iOS 部分函数调用方法不同,请仔细参考
- 下载新的扩展库后需要重启触动服务才能生效
平台 | 版本 | 备注 | 更新日期 | 下载 |
---|---|---|---|---|
iOS | v1.3.5 | 历史版本 | 2018-06-27 | iOS-v1.3.5 |
iOS | v1.3.6 | 正式版本(支持 iOS 11 及其以下系统) | 2018-07-31 | iOS-v1.3.6 |
iOS | v1.3.9 | 正式版本(支持 iOS 12 及其以上系统) | 2019-03-26 | iOS-v1.3.9 |
安卓真机 | v1.1.1 | 适用于触动安卓 v2.2.x 及更低版本 | 2018-07-17 | 安卓真机-v1.1.1 |
安卓模拟器 | v1.1.1 | 适用于触动安卓 v2.2.x 及更低版本 | 2018-07-17 | 安卓模拟器-v1.1.1 |
安卓真机 | v1.1.1 | 适用于触动安卓 v2.3.0 及以上版本 | 2018-07-17 | 安卓真机-v1.1.1 |
安卓模拟器 | v1.1.1 | 适用于触动安卓 v2.3.0 及以上版本 | 2018-07-17 | 安卓模拟器-v1.1.1 |
函数名称:获取扩展库版本号
函数功能:获取 ts.so 扩展库版本号
脚本实例:
local ts = require("ts")
dialog(ts.version())
FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。
参数 | 类型 | 说明 |
---|---|---|
ftppath | string | 服务器地址,示例:"192.168.0.1" |
username | string | 用户名,服务器登录用户名 |
password | string | 密码,服务器登录密码 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 成功返回 true,失败返回 false |
参数 | 类型 | 说明 |
---|---|---|
sec | number | 超时时间,单位为秒 |
参数 | 类型 | 说明 |
---|---|---|
filePath | string | 文件夹路径及文件夹名 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 成功返回 true失败,返回 false |
脚本示例
--脚本仅供参考不可直接使用
local ts = require("ts")--使用官方库前一定要在开头插入这一句
status = ts.ftp.connect("111.111.11.111","username","password") --此处应填入真实的地址及账号密码
--FTP 操作第一步,连接 FT P服务器,连接成功后才可进行FTP相关操作
if status then
dialog("连接成功", 0)
else
dialog("连接失败", 0)
end
mkStatus = ts.ftp.mkdir("firstFile/childFile") --在 FTP 上的 firstFile 文件夹内创建一个 childFile 文件夹,如果没有 firstFile 文件夹则先创建 firstFile 文件夹
ts.ftp.close() --操作完成后,断开 FTP 服务器连接
参数 | 类型 | 说明 |
---|---|---|
filepath | string | 删除指定目录下的文件夹 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 成功返回 true 失败,返回 false |
脚本示例
--脚本仅供参考不可直接使用
local ts = require("ts")--使用官方库前一定要在开头插入这一句
status = ts.ftp.connect("111.111.11.111","username","password")
--FTP 操作第一步,连 接FTP 服务器,连接成功后才可进行 FTP 相关操作
if status then
dialog("连接成功", 0)
else
dialog("连接失败", 0)
end
ts.ftp.rmdir("firstfile/ChildFile")--删除目录下的文件夹
ts.ftp.close() --操作完成后,断开 FTP 服务器连接
参数 | 类型 | 说明 |
---|---|---|
filepath | table | 文件目录下的所有文件列表 |
脚本示例
--脚本仅供参考不可直接使用
local ts = require("ts")--使用官方库前一定要在开头插入这一句
status = ts.ftp.connect("111.111.11.111","username","password")
--FTP 操作第一步,连接 FTP 服务器,连接成功后才可进行 FTP 相关操作
if status then
dialog("连接成功", 0)
else
dialog("连接失败", 0)
end
mkStatus = ts.ftp.mkdir("/hehe123/test") --创建文件夹
allFile = ts.ftp.list("/hehe123/test") --列出文件夹里所有文件
if allFile then
allFilestr=""
for i,v in pairs(allFile) do
allFilestr=v.."\n"..allFilestr;
end
dialog(allFilestr, time)--打印文件夹内所有文件列表
else
dialog("error",0)
end
ts.ftp.close() --操作完成后,断开 FTP 服务器连接
参数 | 类型 | 说明 |
---|---|---|
oldfilepath | string | 待重命名文件名 |
filePath | string | 新文件名 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 成功返回 true 失败,返回 false |
脚本示例
--脚本仅供参考不可直接使用
local ts = require("ts")--使用官方库前一定要在开头插入这一句
status = ts.ftp.connect("111.111.11.151","username","password")
if status then
dialog("连接成功", 0)
else
dialog("连接失败", 0)
end
ts.ftp.rename("/haha/test1","/haha/test2")
ts.ftp.close() --操作完成后,断开FTP服务器连接
注意事项:
- 新、旧文件路径层级数必须相同
- 新、旧文件夹路径必须是同一目录
参数 | 类型 | 说明 |
---|---|---|
fileName | string | 文件路径下的文件,具体文件需要加上扩展名 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 成功返回 true 失败,返回 false |
脚本示例
--脚本仅供参考不可直接使用
local ts = require("ts")--使用官方库前一定要在开头插入这一句
status = ts.ftp.connect("111.111.11.151","username","password")
if status then
dialog("连接成功", 0)
else
dialog("连接失败", 0)
end
xstatus = ts.ftp.delete("C38K7L77DTWF.txt") --删除某个文件
ts.ftp.close() --操作完成后,断开 FTP 服务器连接
参数 | 类型 | 说明 |
---|---|---|
localfilepath | string | 本地文件路径 |
severfilepath | string | FTP 文件路径 |
type | number | 选填,默认值 1 表示文本类型,0 表示非文本类型 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 成功返回 true 失败,返回 false |
脚本示例
--脚本仅供参考不可直接使用
local ts = require("ts")--使用官方库前一定要在开头插入这一句
status = ts.ftp.connect("111.111.11.151","username","password")
if status then
dialog("连接成功", 0)
else
dialog("连接失败", 0)
end
path = userPath()
upStatus = ts.ftp.upload(path.."/lua/main.txt","/haha/main.txt")
--上传本地 lua 文件夹下的 main.lua 文件到服务器的 haha 文件夹里
if upStatus then
toast("上传完成", 1)
else
toast("上传失败", 1)
end
ts.ftp.close() --操作完成后,断开 FTP 服务器连接
参数 | 类型 | 说明 |
---|---|---|
localfilepath | string | 本地文件路径 |
severfilepath | string | FTP 文件路径 |
type | number | 选填,默认值非 0 表示文本类型,0 表示非文本类型 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 成功返回 true 失败,返回 false |
脚本示例
--脚本仅供参考不可直接使用
local ts = require("ts")--使用官方库前一定要在开头插入这一句
status = ts.ftp.connect("111.111.11.151","username","password")
if status then
dialog("连接成功", 0)
else
dialog("连接失败", 0)
end
path = userPath()
dwStatus = ts.ftp.download(path.."/res/me.png","/love.png",0)
--下载服务器上的 love.png 文件到本地 res 文件夹
if dwStatus then
toast("下载完成", 1)
else
toast("下载失败", 1)
end
ts.ftp.close() --操作完成后,断开 FTP 服务器连接
完整示例
local ts = require("ts")--使用官方库前一定要在开头插入这一句
status = ts.ftp.connect("111.111.11.151","username","password")
--FTP 操作第一步,连接 FTP 服务器,连接成功后才可进行 FTP 相关操作
if status then
dialog("连接成功", 0)
else
dialog("连接失败", 0)
end
mkStatus = ts.ftp.mkdir("tsnewfolder") --创建文件夹
rmStatus=ts.ftp.rmdir("/haha") --删除文件夹
allFile = ts.ftp.list("/tsnewfolder") --列出文件夹里所有文件
if allFile then
allFilestr=""
for i,v in pairs(allFile) do
--dialog(string.format("%s = %s",i,v),1)
--mSleep(3000)
allFilestr=v.."\n"..allFilestr;
end
dialog(allFilestr, time)
else
dialog("error",0)
end
renameStatus = ts.ftp.rename("/haha","/hehe123") --重命名文件夹或文件,第一个参数为旧名,第二个参数为新名
xstatus = ts.ftp.delete("C38K7L77DTWF.txt") --删除某个文件
path = userPath()
upStatus = ts.ftp.upload(path.."/lua/main.txt","/haha/main.txt")
--上传本地 lua 文件夹下的 main.lua 文件到服务器的 haha 文件夹里
dwStatus = ts.ftp.download(path.."/res/me.png","/love.png",0)
--下载服务器上的 love.png 文件到本地 res 文件夹
ts.ftp.close() --操作完成后,断开FTP服务器连接
注意事项:
- 使用本模块时填写的文件路径中,文件名不能使用中文字符
- 文件路径必须填写完整路径
参数 | 类型 | 说明 |
---|---|---|
url | string | 请求URL,必填 |
header_send | table | 请求头部内容,选填,本参数必须与请求体一起填写 |
body_send | table | 请求内容,选填,本参数必须与头部一起填写 |
返回值 | 类型 | 说明 |
---|---|---|
status_resp | number | HTTP 状态码 |
header_resp | string | 返回头部 |
body_resp | string | 返回内容 |
脚本实例:
local ts = require("ts")
header_send = {typeget = "ios"}
ts.setHttpsTimeOut(60)--安卓不支持设置超时时间
status_resp, header_resp,body_resp = ts.httpGet("http://baidu.com", header_send, body_send)
dialog(status_resp,0)
dialog(header_resp,0)
dialog(body_resp,0)
参数 | 类型 | 说明 |
---|---|---|
url | string | 请求URL (必须填写) |
header_send | table | 请求头部内容,选填,本参数必须与请求体一起填写 |
body_send | table | 请求内容,选填,本参数必须与头部一起填写 |
返回值 | 类型 | 说明 |
---|---|---|
status_resp | number | HTTP 状态码 |
header_resp | string | 返回头部 |
body_resp | string | 返回内容 |
脚本实例:
local ts = require("ts")
header_send = {typeget = "ios"}
body_send = {msg = "hello"}
ts.setHttpsTimeOut(60)--安卓不支持设置超时时间
status_resp,header_resp,body_resp = ts.httpPost("http://dev.touchsprite.com/site/login",header_send, body_send)
dialog(status_resp,0)
dialog(header_resp,0)
dialog(body_resp,0)
参数 | 类型 | 说明 |
---|---|---|
sec | number | 超时时间,单位为秒 |
- 此函数方法HTTP请求通用
参数 | 类型 | 说明 |
---|---|---|
url | string | 请求URL (必须填写) |
header_send | table | 请求头部内容,选填,本参数必须与请求体一起填写 |
body_send | table | 请求内容,选填,本参数必须与头部一起填写 |
返回值 | 类型 | 说明 |
---|---|---|
code | number | 返回状态码 |
header_resp | string | 头部返回内容 |
body_resp | string | 返回内容 |
参数 | 类型 | 说明 |
---|---|---|
url | string | 请求URL (必须填写) |
header_send | table | 请求头部内容,选填,本参数必须与请求体一起填写 |
body_send | table | 请求内容,选填,本参数必须与头部一起填写 |
返回值 | 类型 | 说明 |
---|---|---|
code | number | 返回状态码 |
header_resp | string | 头部返回内容 |
body_resp | string | 返回内容 |
脚本实例:
local ts = require("ts")
header_send = {
["Content-Type"] = "application/x-www-form-urlencoded",
["Accept-Encoding"] = "gzip",
["typeget"] = "ios"
}
body_send = {["msg"] = "hello"}
ts.setHttpsTimeOut(60)--安卓不支持设置超时时间
code,header_resp, body_resp = ts.httpsGet("https://www.baidu.com", header_send,body_send)
dialog(code,0)
dialog(header_resp,0)
dialog(body_resp,0)
local ts = require("ts")
header_send = {typeget = "ios"}
body_send = {
["username"] = "aa",
["password"] = "1234"
}
-- body : username=aa&password=1234
ts.setHttpsTimeOut(60) --安卓不支持设置超时时间
code,status_resp, body_resp = ts.httpsPost("https://www.baidu.com", header_send, body_send)
dialog(code,0)
dialog(header_resp,0)
dialog(body_resp,0)
函数功能:发送tcp/udp请求
脚本实例:
local ts = require("ts")
local socket = require("socket")
local host = "www.baidu.com"
local file = "/"
local sock = assert(socket.connect(host, 80)) -- 创建一个 TCP 连接,连接到 HTTP 连接的标准 80 端口上
sock:send("GET " .. file .. " HTTP/1.0\r\n\r\n")
repeat
local chunk, status, partial = sock:receive(1024) -- 以 1K 的字节块来接收数据,并把接收到字节块输出来
dialog(chunk or partial, 0)
until status ~= "closed"
sock:close() -- 关闭 TCP 连接
local ts = require("ts")
local socket = require("socket")
local host = host or "127.0.0.1"
local port = port or 8080
print("Binding to host '" ..host.. "' and port " ..port.. "...")
--创建udp对象
udp = assert(socket.udp())
--绑定到指定的端口
assert(udp:setsockname(host, port))
--设置超时时间
assert(udp:settimeout(5))
--获取绑定IP和端口
ip, port = udp:getsockname()
assert(ip, port)
print("Waiting packets on " .. ip .. ":" .. port .. "...")
local recvmaxbyte =20
--单线程无限循环
while 1 do
--接收udp packet
dgram, ip, port = udp:receivefrom(recvmaxbyte)
if(dgram=="终止")then
nlog("终止")
break
end
if dgram then
nlog("Echoing '" .. dgram .. "' to " .. ip .. ":" .. port)
--发送数据
udp:sendto(dgram, ip, port)
else
nlog(ip)
end
end
udp=nil
collectgarbage("collect")
参数 | 类型 | 说明 |
---|---|---|
IP/Domain Name | number/string | IP 地址或域名 |
time | number | ping 的次数 |
返回值 | 类型 | 说明 |
---|---|---|
status | table | 网络连接情况 |
脚本实例:
local ts = require("ts")
status = ts.ping("www.baidu.com",3) --也可以是 ip 地址
if status then
for i,v in pairs(status) do
dialog(string.format("%s = %s",i,v))
mSleep(3000)
end
else
dialog(status, 0)
end
注意事项
- 1.2.1 以上版本新增了超时时间,时间为 3 秒
- ping 的次数只支持大于 0 的整数,次数超过 16 次返回值只显示 16 次的内容
参数 | 类型 | 说明 |
---|---|---|
IP | string | 代理服务器 IP 地址 |
status | string | 状态,填写 port 为开启,填写 80 为关闭 |
脚本实例:
local ts = require("ts")
IP = "123.43.123.1"
ts.setHttpProxy(IP,"port") --—开启
ts.setHttpProxy("127.0.0.1","80") --— 关闭
注意事项:
此函数只针对 ts.so 中 httpget 和 httppost 函数生效,并不是设置手机设置中的代理。
脚本实例:
local ts = require("ts")
--smtp 服务器,QQ 邮箱为 smtp.qq.com,163 邮箱为 smtp.163.com,其他邮箱请自行百度
status = ts.smtp("10879433@qq.com","紧急通知","今天不上班","smtp.163.com","test@163.com","testpassword")
if (status) then
dialog("Success", 0) --发送成功
else
dialog("False", 0) --发送失败
end
注意事项:
参数 | 类型 | 说明 |
---|---|---|
path | string | 保存路径 |
string | string | 二维码信息内容 |
size | number | 二维码图片尺寸 |
返回值 | 类型 | 说明 |
---|---|---|
status | string | 返回状态 |
脚本实例:
local ts = require("ts")
status = ts.qrEncode("/var/1.png","我只是比别人帅了一点而已","288")
--"1.jpg"(如只填文件名,默认为图片在触动res目录下)
dialog(status,0)
※仅支持 iOS 8 及以上系统及触动精灵 Android v2.3.5.4 及其以上版本支持
参数 | 类型 | 说明 |
---|---|---|
path | string | 解析二维码图片的路径,支持 jpg,png 等格式 |
返回值 | 类型 | 说明 |
---|---|---|
str | string | 解析二维码得到的字符串 |
脚本实例:
local ts = require("ts")
str = ts.qrDecode(userPath().."/res/1.png")
--"1.jpg"(如只填文件名,默认为图片在触动 res 目录下)
dialog(str,0)
- 此函数为系统方法,可能因为机型原因导致解析失败,如果出现解析失败或服务重启等问题,请尝试使用第三方扩展库→ tsqr.so
- 暂不支持iPhone5s设备
- 不支持微信面对面红包的二维码解析
参数 | 类型 | 说明 |
---|---|---|
x1 | number | 左上角顶点屏幕横坐标 |
y1 | number | 左上角顶点屏幕纵坐标 |
x2 | number | 右下角顶点屏幕横坐标 |
y2 | number | 右下角顶点屏幕纵坐标 |
value | number | 二值化阈值,范围 0 - 255,作为图像二值化的参照值 |
脚本实例:
local ts = require("ts")
degree = 150
ts.binaryzation(0,0,100,100,degree)
注意事项
- 调用本函数将会从当前屏幕截取一部分保存,保存路径为触动的 res 目录下 tmp.jpg 文件
※此功能为测试版功能,正式版将做调整
参数 | 类型 | 说明 |
---|---|---|
path | string | 待找色的图片路径 |
color | number | 欲寻找的参照点颜色,0 - 黑色,255 - 白色 |
posandcolor | string | 周边点颜色参数 |
x1 | number | 找色区域相对图片左上角顶点横坐标 |
y1 | number | 找色区域相对图片左上角顶点纵坐标 |
x2 | number | 找色区域相对图片右下角顶点横坐标 |
y2 | number | 找色区域相对图片右下角顶点纵坐标 |
返回值 | 类型 | 说明 |
---|---|---|
point | table | 以 table 形式返回符合条件的参照点的坐标,如未找到则返回的 table 为空 |
返回的 table 为以下形式:
table = {
{x = 100,y = 110},
}
脚本实例:
local ts = require("ts")
point = ts.imgFindColor(userPath().."/res/tmp.jpg",255,"0|1|0,0|2|255",60, 239, 127, 501)
if #point ~=0 then
dialog(point[1].x)
end
参数 | 类型 | 说明 |
---|---|---|
imgPath | number | 图片路径 |
posandcolor | number | 偏色值 |
脚本示例
local ts = require("ts")
snapshot("test_3.jpg", 101, 101, 200, 200)
ts.img.binaryzationImg(userPath().."/res/test_3.jpg",100)--不支持相对路径
dialog("输出图片保存在"..userPath().."/res/tmp.jpg")
参数 | 类型 | 说明 |
---|---|---|
x1,y1 | number | 图片左上角坐标 |
x2,y2 | number | 图片右下角坐标 |
posandcolor | number | 偏色值 |
脚本示例
local ts = require("ts")
ts.img.binaryzation(101,101,200,200,100)
dialog("输出图片保存在"..userPath().."/res/tmp.jpg")
参数 | 类型 | 说明 |
---|---|---|
imgPath | string | 图片路径 |
返回值 | 类型 | 说明 |
---|---|---|
color | table | 颜色表 |
脚本示例
local ts = require("ts")
snapshot("test_1.jpg", 101, 101, 200, 200)
ss = ts.img.loadFile(userPath().."/res/test_1.jpg")--不支持相对路径
dialog(ss[1][7].color)
参数 | 类型 | 说明 |
---|---|---|
x1,y1 | number | 图片左上角坐标 |
x2,y2 | number | 图片右下角坐标 |
返回值 | 类型 | 说明 |
---|---|---|
color | table | 颜色表 |
脚本示例
local ts = require("ts")
ss = ts.img.screen(101, 101, 200, 200)--不支持相对路径
dialog(ss[1][8].color)
参数 | 类型 | 说明 |
---|---|---|
table | table | 颜色表 |
imgPath | string | 保存路径 |
脚本示例
local ts = require("ts")
ss = ts.img.screen(101, 101, 200, 200)
ts.img.save(ss,userPath().."/res/test_2.jpg")--不支持相对路径
参数 | 类型 | 说明 |
---|---|---|
path1 | string | 指定缩放的图片路径 |
path2 | string | 生成的图片路径 |
w | number | 图片缩放后宽度 |
h | number | 图片缩放后高度 |
脚本实例:
local ts = require("ts")
path = userPath()
ts.imgSize(path.."/res/1.png",path.."/res/2.png",400,400)
--图片后缀可写jpg或png
注意事项:
缩放函数可能导致图片变模糊
参数 | 类型 | 说明 |
---|---|---|
tb | table | table 表 |
脚本实例:
local ts = require("ts")--使用扩展库前必须插入这一句
local json = ts.json--使用 JSON 模块前必须插入这一句
local tb = {
["我"] = "五毛",
["爱"] = "六块",
meme = {
isArray = true,
1,0,0,4,6,9,5,1,0,0,
},
nullvalue = null,
}
local jsonstring = json.encode(tb);--把 table 转换成 json 字符串
dialog(jsonstring, 0);
参数 | 类型 | 说明 |
---|---|---|
tb | string | json 字符串 |
脚本实例:
local ts = require("ts")--使用扩展库前必须插入这一句
local json = ts.json--使用 JSON 模块前必须插入这一句
local tb = {
["我"] = "五毛",
["爱"] = "六块",
meme = {
isArray = true,
1,0,0,4,6,9,5,1,0,0,
},
nullvalue = null,
}
local jsonstring = json.encode(tb);--把 table 转换成 json 字符串
dialog(jsonstring, 0);
local tmp = json.decode(jsonstring);--把 json 字符串转换为 table 对象
dialog(tmp.meme[5], 0);
dialog(tostring(tmp.nullvalue), 0);
参数 | 类型 | 说明 |
---|---|---|
string | string | 字符串内容 |
返回值 | 类型 | 说明 |
:----: | :----: | :----: |
tb | string | 十六进制内容 |
脚本实例:
local ts = require("ts")
local str = "触动精灵"
dialog('"'..str..'" 的 16 进制编码为: <'..str:tohex()..'>', 0) --“触动精灵”的 16 进制编码
参数 | 类型 | 说明 |
---|---|---|
tb | string | 十六进制内容 |
返回值 | 类型 | 说明 |
---|---|---|
string | string/nil | 字符串内容,非十六进制返回为空 |
脚本实例:
local ts = require("ts")
local str = "触动精灵"
dialog('"'..str..'" 的 16 进制编码为: <'..str:tohex()..'>', 0) --“触动精灵”的 16 进制编码
dialog('<'..str:tohex()..'> 转换成明文为: "'..str:tohex():fromhex()..'"', 0)--将上一行的 16 进制编码转换为明文字符
函数名称:计算 MD5
函数功能:字符串 MD5 计算
脚本实例:
local ts = require("ts")
local str = "触动精灵"
local binstr = "\0\1\2\3\4\5"
dialog('"'..str..'" 的 MD5 值是: '..str:md5(), 0)--计算"触动精灵"的 MD5 值
dialog('<'..binstr:tohex()..'> 的 MD5 值是: '..binstr:md5(), 0)--计算“000102030405”的 MD5 值
函数名称:计算 SHA1
函数功能:字符串 SHA1 计算
脚本实例:
local ts = require("ts")
local str = "触动精灵的征程"
local binstr = "\0\1\2\3\4\5"
dialog('"'..str..'" 的 SHA1 值是: '..str:sha1(), 0)--计算"触动精灵"的 SHA1 值
dialog('<'..binstr:tohex()..'> 的 SHA1 值是: '..binstr:sha1(), 0)计算“000102030405”的 SHA1 值
参数 | 类型 | 说明 |
---|---|---|
msg | string | 需要编码的内容 |
key | string | 密匙 |
返回值 | 类型 | 说明 |
---|---|---|
tb | string | 编码后的内容 |
脚本实例:
local ts = require("ts")
local msg = "\5\4\3\2\1\0"
local key = "触动精灵"
local emsg = msg:aes128_encrypt(key)
local emsgb64 = emsg:base64_encode()
dialog('二进制数据<'..msg:tohex()..'> \n AES128 编码为<'..emsg:tohex()..'>', 0)
参数 | 类型 | 说明 |
---|---|---|
tb | string | 需要解码的内容 |
返回值 | 类型 | 说明 |
---|---|---|
tb | string | 需要解码的内容 |
脚本实例:
local ts = require("ts")
local msg = "\5\4\3\2\1\0"
local key = "触动精灵"
local emsg = msg:aes128_encrypt(key)
local emsgb64 = emsg:base64_encode()
local tmp = emsgb64:base64_decode()
msg = tmp:aes128_decrypt(key)
dialog('"'..emsgb64..'" \n使用 AES128 算法 密钥 "'..key..'" 解码值是 <'..msg:tohex()..'>', 0)
函数名称:BASE64 编码
函数功能:字符串 BASE64 编码
脚本实例:
local ts = require("ts")
local msg = "\5\4\3\2\1\0"
local key = "触动精灵"
local emsg = msg:aes128_encrypt(key)
local emsgb64 = emsg:base64_encode()
dialog('二进制数据<'..msg:tohex()..'> \n BASE64 编码为<'..emsgb64..'>',0)
函数名称:BASE64 解码
函数功能:字符串 BASE64 解码
脚本实例:
local ts = require("ts")
local msg = "\5\4\3\2\1\0"
local key = "触动精灵"
local emsg = msg:aes128_encrypt(key)
local emsgb64 = emsg:base64_encode()
local tmp = emsgb64:base64_decode()
msg = tmp:aes128_decrypt(key)
dialog('"'..emsgb64..'" base64 解码后的数据为 '..tmp:tohex()..'"',0)
函数名称:字符串分割过滤
函数功能:对字符串分割、过滤
脚本实例:
字符串分割及空白字符过滤
local ts = require("ts")
str = " 哈哈,he he,1,3,6 "
new = str:split(",") --将字符串str按照 `,` 分割并返回一个TABLE
dialog(new[2], 0)
dialog(str:rtrim(), 0) -- 结果 " 哈哈,he he,1,3,6" ,删除字符串尾部的空白字符
dialog(str:ltrim(), 0) -- 结果 "哈哈,he he,1,3,6 " ,删除字符串首部的空白字符
dialog(str:trim(), 0) -- 结果 "哈哈,he he,1,3,6" ,删除字符串首尾的空白字符
dialog(str:atrim(), 0) -- 结果 "哈哈,hehe,1,3,6" ,删除字符串所有的空白字符
名词解析:
空白字符包括:空格、制表符
\t
、换行符\n
、\r
。
函数名称:GBK 转 UTF8
函数功能:转码,GBK 转 UTF8
脚本实例:
将字符串从 GBK 编码转换到 UTF8 编码(需引擎版本 iOS v2.2.6 以上版本)
require "ts"
f = io.open("/var/mobile/Media/TouchSprite/lua/a.txt", "r")
s = f:read("*a")
f:close()
dialog(s:fromgbk())
函数名称:unicode 转 utf8
函数功能:转码,unicode 转 UTF8
脚本实例:
--unicode 转 utf8
local ts = require "ts"
local tmp = ts.json.totable([[{"toUTF8":"\u6211\u7231\u5a1c\u5a1c"}]])
dialog(tmp["toUTF8"],0)
※仅支持 iOS 8 及以上系统
脚本实例:
local ts = require("ts")
ts.system.resetNetWork()- 本函数仅支持 iOS 8 及以上系统,调用后会自动重启设备,请勿频繁调用
注意事项
- 本函数仅支持 iOS8 及以上系统
- 本函数调用后会自动重启设备,请勿频繁调用
返回值 | 类型 | 说明 |
---|---|---|
udid | string | 设备 UDID |
脚本实例:
local ts = require("ts")
udid = ts.system.udid() --获取设备的 UDID
dialog(udid, 0)
返回值 | 类型 | 说明 |
---|---|---|
serialnumber | string | 设备序列号 |
脚本实例:
local ts = require("ts")
serialnumber = ts.system.serialnumber()--获取设备的序列号,安卓不同的手机可能返回空值
dialog(serialnumber, 0)
注意事项:
安卓不同的手机可能返回空值
返回值 | 类型 | 说明 |
---|---|---|
string | string | 剩余容量*G/总容量*G |
脚本实例:
local ts = require("ts")
string = ts.system.space()
dialog(string, 0)
返回值 | 类型 | 说明 |
---|---|---|
wifimac | 文本型 | 设备 WiFi MAC 地址 |
脚本实例:
local ts = require("ts")
wifimac = ts.system.wifimac() --获取设备的 WiFi MAC 地址,安卓不同的手机可能返回空值
dialog(wifimac, 0)
注意事项:
安卓不同的手机可能返回空值
返回值 | 类型 | 说明 |
---|---|---|
btmac | string | 蓝牙 MAC 地址 |
脚本实例:
local ts = require("ts")
btmac = ts.system.btmac() --获取设备的蓝牙 MAC 地址,安卓不同的手机可能返回空值
dialog(btmac, 0)
注意事项:
安卓不同的手机可能返回空值
返回值 | 类型 | 说明 |
---|---|---|
osversion | string | 设备系统版本号 |
脚本实例:
local ts = require("ts")
osversion = ts.system.osversion() --获取设备的系统版本号,安卓不同的手机可能返回空值
dialog(osversion, 0)
注意事项:
安卓不同的手机可能返回空值
返回值 | 类型 | 说明 |
---|---|---|
producttype | string | 设备详细型号 |
脚本实例:
local ts = require("ts")
producttype = ts.system.devicetype()--获取设备详细型号,安卓不同的手机可能返回空值
dialog(producttype,0)
--安卓返回的是手机型号
--iOS 机型见附录对照表
注意事项:
安卓不同的手机可能返回空值
返回值 | 类型 | 说明 |
---|---|---|
imei | string | 设备 IMEI |
脚本实例:
local ts = require("ts")
imei = ts.system.imei() --获取设备 IMEI,安卓不同的手机可能返回空值
dialog(imei,0)
注意事项:
安卓不同的手机可能返回空值
返回值 | 类型 | 说明 |
---|---|---|
tab | table | 本地网络地址,包含本地内部环回地址、蜂窝地址、本地 WiFi 地址 |
脚本实例:
local ts = require("ts")
local ret = ""
for i,v in ipairs(ts.system.localwifiaddr()) do --获取本地网络地址
ret = ret..(v[1]).."="..(v[2]).."\n"
end
dialog(ret,0)
注意事项:
ts.system.localwifiaddr() 将返回一个 TABLE,TABLE 中包含本地内部环回地址、蜂窝地址、本地 WiFi 地址。
脚本实例:
local ts = require("ts")
nettype = ts.getNetType()
dialog(nettype, 0)
返回值 | 类型 | 说明 |
---|---|---|
type | string | 2G/3G/4G/WiFi/NO NETWORK |
脚本实例:
local ts = require("ts")
time =ts.ms()
dialog(time, 0) --Unix时间戳
--如需转换为标准时间格式
print(os.date("%c",time))
参数 | 类型 | 说明 |
---|---|---|
filePath | string | 文件路径 |
返回值 | 类型 | 说明 |
---|---|---|
form | string | 文件格式 |
脚本示例
local ts = require("ts")
dialog(ts.hlfs.getFileEncoding(userPath().."/res/test3.txt"))--不支持相对路径
参数 | 类型 | 说明 |
---|---|---|
srcPath | string | 原文件路径 |
dstPath | string | 保存后文件路径 |
mode | string | 文件格式:mode = 1,GB18030;mode = 2,GB2312;mode = 3,UTF-16 |
脚本示例
local ts = require("ts")
ts.hlfs.codeConvert(userPath().."/res/test.txt",userPath().."/res/test3.txt",1)--不支持相对路径
参数 | 类型 | 说明 |
---|---|---|
path | string | 压缩前文件路径,仅支持文件不支持目录 |
bakpath | string | 压缩包内文件路径,支持新建子目录 |
zipPath | string | 压缩包生成路径 |
fileList | table | 文件路径列表,仅支持文件不支持目录 |
返回值 | 类型 | 说明 |
---|---|---|
flag | boolean | 成功返回 true,失败返回 false |
脚本实例:
local ts = require("ts")
local root = userPath()
io.open(root .. "/res/1.txt","w"):write("测试"):close()
io.open(root .. "/res/2.txt","w"):write("测试"):close()
io.open(root .. "/res/3.txt","w"):write("还是测试"):close()
local fileList = {
{root .. "/res/1.txt","1.txt"},
{root .. "/res/2.txt","/file/2.txt"},
{root .. "/res/3.txt","3.txt"}
}
flag = ts.zip(root .. "/res/测试.zip",fileList)
if flag then
dialog("压缩成功", time)
else
dialog("压缩失败", time)
end
注意事项:
- 添加到压缩包的文件名是中文的情况下会导致文件名乱码,请使用英文文件名
参数 | 类型 | 说明 |
---|---|---|
zipPath | string | 压缩包路径 |
filePath | string | 解压路径 |
返回值 | 类型 | 说明 |
---|---|---|
flag | boolean | 成功返回 true,失败返回 false |
脚本实例:
local ts = require("ts")
ocal root = userPath()
io.open(root .. "/res/1.txt","w"):write("测试"):close()
io.open(root .. "/res/2.txt","w"):write("测试"):close()
io.open(root .. "/res/3.txt","w"):write("还是测试"):close()
local fileList = {
{root .. "/res/1.txt","1.txt"},
{root .. "/res/2.txt","/file/2.txt"},
{root .. "/res/3.txt","3.txt"}
}
ts.zip(root .. "/res/测试.zip",fileList)
zipPath = root .. "/res/测试.zip"
filePath = root .. "/res/解压"
flag = ts.unzip(zipPath,filePath)
if flag then
dialog("解压成功", time)
else
dialog("解压失败", time)
end
注意事项:
- 添加到压缩包的文件名是中文的情况下会导致文件名乱码,请使用英文文件名
参数 | 类型 | 说明 |
---|---|---|
path | string | 保存路径 |
url | string | 下载 URL |
返回值 | 类型 | 说明 |
---|---|---|
code | number | 状态码,200 为下载成功 |
msg | string | 下载状态 |
脚本实例:
local ts = require("ts")
code,msg = ts.tsDownload(userPath().."/res/1.jpg","http://p0.so.qhmsg.com/sdr/720_1080_/t01f0c2107148464d50.jpg")
--同样支持ftp地址
--"1.jpg"(如只填文件名,默认保存到触动 res 目录下)
dialog(code,0)
dialog(msg,0)
参数 | 类型 | 说明 |
---|---|---|
path | string | 目标目录的路径 |
返回值 | 类型 | 说明 |
---|---|---|
tableGet | table | 目录下所有文件列表 |
脚本实例:
local ts = require("ts")
creatflag= ts.hlfs.makeDir("/var/mobile/hello") --新建文件夹
io.open("/var/mobile/hello/test.txt","w"):write("测试"):close()--在 /var/mobile/hello 目录下创建一个 test.txt 的文件夹并写入“测试”这个字符串
io.open("/var/mobile/hello/test2.txt","w"):write("测试2"):close()
tableGet = ts.hlfs.getFileList("/var/mobile/hello") --列出 hello 文件夹下所有文件
if tableGet then
for i,v in pairs(tableGet) do
dialog(string.format("%s = %s",i,v),1)
mSleep(3000)
end
else
dialog("没有此文件夹")
end
参数 | 类型 | 说明 |
---|---|---|
path | string | 文件夹路径 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 是否删除成功 |
脚本实例:
local ts = require("ts")
creatflag= ts.hlfs.makeDir("/var/mobile/hello") --新建文件夹
status = ts.hlfs.removeEntryDir("/var/mobile/hello")--删除 hello 文件夹
if status then
dialog("删除成功")
else
dialog("删除失败或没有此文件夹")
end
参数 | 类型 | 说明 |
---|---|---|
path | string | 路径 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 返回文件夹是否删除成功 |
脚本实例:
local ts = require("ts")
creatflag= ts.hlfs.makeDir("/var/mobile/hello") --新建文件夹
io.open("/var/mobile/hello/test.txt","w"):write("测试"):close()--在 /var/mobile/hello 目录下创建一个 test.txt 的文件夹并写入“测试”这个字符串
status = ts.hlfs.removeDir("/var/mobile/hello")--删除 hello 文件夹及所有文件
if status then
dialog("删除成功")
else
dialog("删除失败或没有此文件夹")
end
参数 | 类型 | 说明 |
---|---|---|
path | stirng | 路径 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 返回判断结果 |
脚本实例:
local ts = require("ts")
creatflag= ts.hlfs.makeDir("/var/mobile/hello") --新建文件夹
status = ts.hlfs.isDir("/var/mobile/hello")--判断 hello 是否是文件夹
if status then
dialog("这是一个文件夹")
else
dialog("这不是一个文件夹或没有此文件夹")
end
参数 | 类型 | 说明 |
---|---|---|
path | stirng | 路径 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 是否创建成功 |
脚本实例:
local ts = require("ts")
status = ts.hlfs.makeDir("/var/mobile/hello") --新建文件夹
if status then
dialog("创建成功")
else
dialog("创建失败")
end
参数 | 类型 | 说明 |
---|---|---|
oldpath | stirng | 要拷贝的文件路径 |
newpath | stirng | 新的文件路径 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 复制是否成功 |
脚本实例:
local ts = require("ts")
creatflag= ts.hlfs.makeDir("/var/mobile/hello") --新建文件夹
io.open("/var/mobile/hello/test.txt","w"):write("测试"):close()--在 /var/mobile/hello 目录下创建一个 test.tx t的文件夹并写入“测试”这个字符串
status = ts.hlfs.copyDir("/var/mobile/hello","/var/hello") --复制文件夹及里面所有文件
if status then
dialog("复制成功")
else
dialog("复制失败")
end
参数 | 类型 | 说明 |
---|---|---|
oldpath | stirng | 要拷贝的文件路径 |
newpath | stirng | 新的文件路径 |
返回值 | 类型 | 说明 |
---|---|---|
status | boolean | 复制是否成功 |
脚本实例:
local ts = require("ts")
io.open("/var/mobile/hello/test.txt","w"):write("测试"):close()--在 /var/mobile/hello 目录下创建一个 test.txt 的文件夹并写入“测试”这个字符串
creatflag= ts.hlfs.makeDir("/var/mobile/hello") --新建文件夹
status = ts.hlfs.copyFile("/var/mobile/hello/test.txt","/1.txt") --复制文件
if status then
dialog("复制成功")
else
dialog("复制失败")
end
脚本实例:
--读取键值
local ts = require("ts")
local plist = ts.plist
local plfilename = "/var/mobile/Library/Caches/com.apple.mobile.installation.plist" --设置plist路径
local tmp2 = plist.read(plfilename) --读取 PLIST 文件内容并返回一个 TABLE
dialog(tmp2.Metadata.ProductBuildVersion, 0) --显示 ProductBuildVersion 的键值
--写入键值
local ts = require("ts")
local plist = ts.plist
local plfilename = "/var/mobile/Library/Caches/com.apple.mobile.installation.plist" --设置plist路径
local tmp2 = plist.read(plfilename) --读取 PLIST 文件内容并返回一个 TABLE
tmp2["Metadata"]["ProductBuildVersion"] = "havonz" --将表中ProductBuildVersion键值改为havonz
plist.write(plfilename, tmp2) --将修改后的表写入 PLIST 文件
注意事项:
- 实例代码仅做为参考,实际调试中请将文件路径替换为实际存在的文件路径。
- 对于个别重要的 PLIST 文件,请谨慎使用写入功能或在运行脚本前进行备份。
- 需要注意的是,nib 文件作为一种特殊的 PLIST 文件格式,不能被正确的读取。
注意事项:
1.数据操作 config 类,所有的数据操作,必须以 open 开始,以 close 结束。
参数 | 类型 | 说明 |
---|---|---|
path | string | 创建并初始化的文件路径 |
参数 | 类型 | 说明 |
---|---|---|
flag | boolean | true 表示提交之前操作,false 表示不提交之前操作,一般填 true |
参数 | 类型 | 说明 |
---|---|---|
key | string | 索引 |
value | string/number/boolean/table | 索引对应的数据 |
脚本实例:
local ts = require("ts")
ts.config.open("/var/coc.plist")
--打开一个plist文件,如果文件不存在,将自动创建该文件,同时只允许打开一个
--此函数为初始化函数,所有 config 操作第一步必须以 open 开始并且以 close 结尾
ts.config.save("金币数",999)
--存储lua中的number string nil boolean table类型(不允许嵌套 table)
--ps:键值对(key-value)是一种存储格式,一个 key 对应一个 value
--此处代表“金币数”是 key,999 是 value,将存入此键值对
ts.config.close(true)
--必要函数,参数为true,操作结束后必须以此函数结尾,
dialog(coin,0)
--结尾后,此处才可输出 coin 值或删除“金币数”对应的值
参数 | 类型 | 说明 |
---|---|---|
key | string | 键 |
返回值 | 类型 | 说明 |
---|---|---|
string | string | 通过索引获取之前存储的数据 |
脚本实例:
local ts = require("ts")
ts.config.open("/var/coc.plist")
--打开一个plist文件,如果文件不存在,将自动创建该文件,同时只允许打开一个
--此函数为初始化函数,所有 config 操作第一步必须以 open 开始并且以 close 结尾
ts.config.save("金币数",999)
--存储lua中的number string nil boolean table类型(不允许嵌套 table)
--ps:键值对(key-value)是一种存储格式,一个 key 对应一 个value
--此处代表“金币数”是 key,999 是 value,将存入此键值对
coin = ts.config.get("金币数")
--获取键对应的值, 此处代表获取“金币数”所对应的值 coin = 999
--但是此处暂时获取不到 coin 值,因为操作还没结束,请继续往下阅读
ts.config.close(true)
--必要函数,参数为 true,操作结束后必须以此函数结尾,
dialog(coin,0)
--结尾后,此处才可输出 coin 值或删除“金币数”对应的值
参数 | 类型 | 说明 |
---|---|---|
key | string | 键 |
脚本实例:
local ts = require("ts")
ts.config.open("/var/coc.plist")
--打开一个 PLIST 文件,如果文件不存在,将自动创建该文件,同时只允许打开一个
--此函数为初始化函数,所有 config 操作第一步必须以 open 开始并且以 close 结尾
ts.config.save("金币数",999)
--存储lua中的number string nil boolean table类型(不允许嵌套 table)
--ps:键值对(key-value)是一种存储格式,一个 key 对应一个 value
--此处代表“金币数”是 key,999 是value,将存入此键值对
coin = ts.config.get("金币数")
--获取键对应的值, 此处代表获取“金币数”所对应的值 coin = 999
--但是此处暂时获取不到 coin 值,因为操作还没结束,请继续往下阅读
ts.config.delete("金币数")
--删除这个键值对应的 value 值,此处代表把 999 变成 nil
--但是此处暂时删除不掉 value 值,因为操作还没结束,请继续往下阅读
ts.config.close(true)
--必要函数,参数为 true,操作结束后必须以此函数结尾,
dialog(coin,0)
--结尾后,此处才可输出 coin 值或删除“金币数”对应的值
iOS 参数和返回值
参数 | 类型 | 说明 |
---|---|---|
path | 文本型 | 数据库文件路径 |
order | string | sql 语句命令 |
Binary Parameters | table | 二进制参数 |
返回值 | 类型 | 说明 |
---|---|---|
status | string | 数据操作结果 |
result | table | 查询结果 |
iOS 脚本实例:
local ts = require("ts")
--没有二进制参数的命令,无需第三个参数
status = ts.dborder("/var/1.db","insert into stu_msg(ID, name, time) values(0, '华罗庚', 2)")
--含有二进制参数的命令,第三个参数为table格式
--注意:order命令里,涉及到二进制的参数,统一用英文问号(?)代替,然后在第三个参数里填二进制参数,一个问号仅对应一个二进制参数
--iOS 和安卓使用有所差异
status = ts.dborder("/var/1.db","insert into stu_msg(ID, name, picture) values(0, '华罗庚', ? ,?)",{a,b})
--查询表中内容
local result,msg = ts.dborder(userPath().."/res/LuaData.db","select * from ACCOUNT_INFO")
Android 参数和返回值
参数 | 类型 | 说明 |
---|---|---|
path | string | 数据库文件路径 |
order | string | sql 语句命令 |
返回值 | 类型 | 说明 |
---|---|---|
status | string | 数据操作结果,仅支持 v1.1.1 以上版本的 ts.so |
result | table | 查询结果 |
Android 脚本实例:
local ts = require("ts")
status = ts.dborder("/data/data/com.android.providers.contacts/databases/contacts2.db","insert into data(package_id, mimetype_id, raw_contact_id,is_read_only,is_primary,is_super_primary,data_version,data1,data2,data3,data4) values(1,1,1,1,1,1,1, '华罗庚','华罗庚','','110')")--增加
local ts = require("ts")
status,table = ts.dborder("/data/data/com.android.providers.telephony/databases/mmssms.db","select * from sms where thread_id=6")--查询,仅支持 v1.1.1 以上版本的 ts.so
平台 | 版本 | 备注 | 更新日期 | 下载 |
---|---|---|---|---|
iOS | v1.2.3 | 历史版本 | 2017-10-13 | iOS-v1.2.3 |
iOS | v1.2.4.1 | 历史版本 | 2017-11-14 | iOS-v1.2.4.1 |
iOS | v1.3.0 | 历史版本 | 2018-01-30 | iOS-v1.3.0 |
iOS | v1.3.1 | 历史版本 | 2018-03-20 | iOS-v1.3.1 |
iOS | v1.3.4 | 历史版本 | 2018-04-20 | iOS-v1.3.4 |
安卓真机 | v1.1.0 | 适用于触动安卓 v2.3.0 及以上版本 | 2017-12-01 | 安卓真机-v1.1.0 |
安卓模拟器 | v1.1.0 | 适用于触动安卓 v2.3.0 及以上版本 | 2017-12-29 | 安卓模拟器-v1.1.0 |
iOS 版本:
[2018-07-31]v1.3.6
[2018-06-27]v1.3.5
-----------iPhone-----------
iPhone 2,1 (iPhone 3GS 产品型号:国行 - A1325 ;国际版 - A1303)
iPhone 3,1 (iPhone 4 GSM 产品型号:A1332 )
iPhone 3,2 (iPhone 4 8G 新制程版,目前新出的国行 8G 版均为此型号,型号同为: A1332)
iPhone 3,3 (iPhone 4 CDMA 产品型号:A1349 )
iPhone 4,1 (iPhone 4S 产品型号:A1387(电信版&国际版);A1431(联通专用型号) )
iPhone 5,1 (iPhone 5 产品型号: A1428 - 3G+4G+GSM )
iPhone 5,2 (iPhone 5 产品型号: A1429;中国电信定制版- A1442 - 3G+4G+GSM+CDMA )
iPhone 5,3 (iPhone 5C 产品型号: A1532 A1456 CDMA)
iPhone 5,4 (iPhone 5C 产品型号: A1526 A1529 A1507 GSM)
iPhone 6,1 (iPhone 5S 产品型号: A1533 A1453 CDMA)
iPhone 6,2 (iPhone 5S 产品型号: A1528 A1530 A1457 GSM)
iPhone 7,1 (iPhone 6 Plus)
iPhone 7,2 (iPhone 6)
iPhone 8,1 (iPhone 6S)
iPhone 8,2 (iPhone 6S Plus)
iPhone 8,3 (iPhone SE)
iPhone 8,4 (iPhone SE)
iPhone 9,1 (iPhone7)
iPhone 9,2 (iPhone7 Plus)
--------iPod Touch--------
iPod4,1 (iPod touch4 产品型号:A1367 )
iPod5,1 (iPod touch5 产品型号:A1421 )
iPod7,1 (iPod Touch6G)
--------iPad--------
iPad 2,1 (产品型号:A1395 - iPad2 Wi-Fi )
iPad 2,2 (产品型号:A1396 - iPad2 Wi-Fi+3G+GSM )
iPad 2,3 (产品型号:A1397 - iPad2 Wi-Fi+3G+GSM+CDMA )
iPad 2,4 (产品型号:iPad 2 Wi-Fi rev_a 新制程版 )
iPad 3,1 (产品型号:A1416 NewPad - iPad3 Wi-Fi )
iPad 3,2 (产品型号:A1403 NewPad - iPad3 Wi-Fi+3G+GSM+CDMA )
iPad 3,3 (产品型号:A1430 NewPad - iPad3 Wi-Fi+3G+GSM )
iPad 2,5 (产品型号:A1432 - iPad Mini Wi-Fi )
iPad 2,6 (产品型号:A1454 - iPad Mini Wi-Fi+3G+4G+GSM )
iPad 2,7 (产品型号:A1455 - iPad Mini Wi-Fi+3G+4G+GSM+CDMA )
iPad 3,4 (产品型号:A1458 - iPad4 Wi-Fi )
iPad 3,5 (产品型号:A1459 - iPad4 Wi-Fi+3G+4G+GSM)
iPad 3,6 (产品型号:A1460 - iPad4 Wi-Fi+3G+4G+GSM+CDMA )
iPad 4,1 (iPad Air)
iPad 4,2 (iPad Air)
iPad 4,3 (iPad Air)
iPad 5,3 (iPad Air2)
iPad 5,4 (iPad Air2)
iPad 4,4 (iPad Mini2)
iPad 4,5 (iPad Mini2)
iPad 4,6 (iPad Mini2)
iPad 4,7 (iPad Mini3)
iPad 4,8 (iPad Mini3)
iPad 4,9 (iPad Mini3)
iPad 5,1 (iPad Mini4)
iPad 5,2 (iPad Mini4)