常见问题答疑 (FAQ)
TouchIOS 是什么?
- 是一款用于越狱 iOS 环境下的自动化模拟操作的软件
- 开发人员可以编写 Lua 脚本让 TouchIOS 运行 来完成一些日常自动化的工作。但它本身没有集成也不会自动编写具有针对性的具体的自动化工作脚本。
- 希望自行编写脚本,可参考
哪些设备可运行 TouchIOS?
设备及系统版本要求
设备型号 |
可以运行 TouchIOS 的系统版本区间 |
iPhone 6 |
iOS 12 及以上所有版本 |
iPhone 6 Plus |
iOS 12 及以上所有版本 |
iPhone 6s |
iOS 12 及以上所有版本 |
iPhone 6s Plus |
iOS 12 及以上所有版本 |
iPhone 7 |
iOS 12 及以上所有版本 |
iPhone 7 Plus |
iOS 12 及以上所有版本 |
iPhone 8 |
iOS 12 及以上所有版本 |
iPhone 8 Plus |
iOS 12 及以上所有版本 |
iPhone SE |
iOS 12 及以上所有版本 |
iPhone SE2 |
iOS 12-16.5.1 |
iPhone SE3 |
iOS 12-16.5.1 |
iPhone X |
iOS 12 及以上所有版本 |
iPhone XR |
iOS 12-16.5.1 |
iPhone XS |
iOS 12-16.5.1 |
iPhone XS MAX |
iOS 12-16.5.1 |
iPhone 11 |
iOS 15-16.5.1 |
iPhone 11 Pro |
iOS 15-16.5.1 |
iPhone 11 Pro Max |
iOS 15-16.5.1 |
iPhone 12 |
iOS 15-16.5.1 |
iPhone 12 mini |
iOS 15-16.5.1 |
iPhone 12 Pro |
iOS 15-16.5.1 |
iPhone 12 Pro Max |
iOS 15-16.5.1 |
iPhone 13 |
iOS 15-16.5.1 |
iPhone 13 mini |
iOS 15-16.5.1 |
iPhone 13 Pro |
iOS 15-16.5.1 |
iPhone 13 Pro Max |
iOS 15-16.5.1 |
iPhone 14 |
iOS 15-16.5.1 |
iPhone 14 Plus |
iOS 15-16.5.1 |
iPhone 14 Pro |
iOS 15-16.5.1 |
iPhone 14 Pro Max |
iOS 15-16.5.1 |
注意!!!
如何安装 TouchIOS 到设备上?
TouchIOS 收费么?哪些部分收费?
- 收费
- 让脚本运行的功能收费
- 以下是参考价格
- 月卡( 31 天)授权码 15 元/设备
- 季度(92 天)授权码 30 元/设备
- 年卡(366 天)授权码 60 元/设备
- 授权码是您的购买于 TouchIOS 唯一的凭据,请一定保管好
- 授权码费用仅为 TouchIOS 应用程序本体的使用费,不包含具体脚本功能开发费及相关任何程序的教学费。请务必于购买授权码之前知晓您购买授权码后的权利以及购买后将解除的限制
如何使用授权码?
我购买了 TouchIOS 授权码后会获得哪些权利?
- 您可以用单个授权码激活任意一台已安装 TouchIOS 并能正常运行的设备上的 TouchIOS
- 每台设备可获得 168 小时的一次性 全功能试用 授权,务必先试用确认后再购买
- 未到期设备无法使用激活码
我电脑上有个脚本,如何使用 USB 连接导入到设备上?
电脑端如何通过 USB 访问到完全文件系统?
- 在cydia或sileo里搜索
Apple File Conduit "2"
安装上
- 拔掉usb数据线重新连接设备即可
TouchIOS 的脚本及相关资源存在设备的哪个位置?
- 脚本存放目录为
/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/
如何在电脑上给 TouchIOS 开发脚本?
取色器/编辑器/局域网控制器 扫描不到设备怎么办?
- 确保电脑端或路由器的防火墙规则没有拦截
- 设备与电脑在同一局域网
- 确保停用了设备上的网络代理及 VPN
- 确保设备是解锁屏幕状态
- 确保电脑能 ping 通设备
- 确保设备打开了 远程开关
如何录制脚本?
- 默认可以使用
长按音量键
弹出选择录制脚本
- 再次使用
长按音量键
可以完成录制
- 可于
更多-->按键设置
编辑更改快捷键设定
- 图:如何录制脚本
如何运行脚本?
- 启动 TouchIOS 的 App 后可以看到 “我的脚本” 界面
- 点一下需要选择的脚本文件名
- 默认可以使用
长按音量键
弹出选择启动选中脚本
- 可于
更多-->按键设置
编辑更改快捷键设定
- 图:如何运行已经选中的脚本
如何选择脚本?
如何在设备上编辑脚本?
- 启动 TouchIOS 的 App 后可以看到 “我的脚本” 界面
- 点一下脚本文件右边的
ⓘ
- 点一下左边出现的
</>
按钮
- 图:如何开始编辑一个脚本
如何加密脚本?
脚本可以做什么?
加密的脚本可以被解密么?
- 不可以
- 从脚本源码到加密脚本这一过程是单向的,不可逆的
- 源码可以加密成加密脚本,反之加密脚本是无法还原成源码的
TouchIOS 可以在电脑上运行么?
TouchIOS 可以在安卓系统上运行么?
TouchIOS 可以在没有越狱的 iOS 设备上运行么?
- 不可以
- TouchIOS 必须要设备已经能够越狱获取完整系统权限方可运行
常用app.eval例子
--app.eval 获取前台应用的 recursiveDescription 示例
local remoteCode = {
lua = [==[
NSString = NSString or objc.class.NSString
UIApp = UIApp or objc.class.UIApplication.sharedApplication()
dispatch_async(dispatch_get_work_queue(), function()
pcall(function()
proc_put("界面信息", UIApp.keyWindow().recursiveDescription().UTF8String()) -- 发送通知回脚本进程
end)
end)
]==]}
proc_put('界面信息', '')
app.eval(remoteCode)
local tm = sys.mtime()
local rd = ''
while sys.mtime()-tm < 1000 do -- 超时时间 1 秒
rd = proc_put('界面信息', '')
if rd~='' then
break
end
sys.msleep(30)
end
nLog(rd)
--app.eval 连接到某个 WiFi 热点
local check_value = functor.argth.check_value
local opt_value = functor.argth.opt_value
function JoinWiFi(...)
local name = check_value(1, 'string', ...)
local pass = opt_value(2, 'string', '', ...)
local wtype = opt_value(3, 'integer', 0, ...)
if #pass == 0 then
wtype = 0
end
app.eval{
bid = 'com.apple.springboard';
lua = [[
function isTruthy(value)
if (type(value) == 'table') then
if (value.target == objc.NULL) then
return false
else
return true
end
else
return value~=false and value~=nil and value~=0 and value~=objc.NULL
end
end
function JoinWiFi(wifiname, wifipass, sectype)
objc.class.NSBundle.bundleWithPath('/System/Library/PreferenceBundles/AirPortSettings.bundle')().load()
local a = objc.class.APOtherNetworkController.alloc()
a.init()
a.loadView()
a.viewDidLoad()
local b = a.valueForKey('_allSpecifiers')()
local namesp, passsp, secsp
for i=0, b.count() - 1 do
local v = b.objectAtIndex(i)()
local vpro = v.properties()
local vid = vpro.objectForKey('id')()
if (isTruthy(vid.isEqualToString('NAME')())) then
namesp = v
elseif (isTruthy(vid.isEqualToString('PASSWORD')())) then
passsp = v
elseif (isTruthy(vid.isEqualToString('SECURITY')())) then
secsp = v
end
end
a.setName(wifiname).specifier(namesp)()
a.setPassword(wifipass).specifier(passsp)()
a.setAuthenticationType({"@", sectype}).specifier(secsp)()
local c = objc.class.APNetworksController.alloc()
c.init()
c.joinOtherNetwork(a.valueForKey('_network')())()
a.release()
c.release()
end
dispatch_sync(dispatch_get_main_queue(), function()
]]..string.format('JoinWiFi(%q, %q, %d)', name, pass, wtype)..[[
end)
]];}
end
JoinWiFi("Tenda_Soze", "iop224354", 1)
--WhatsApp跳转到指定用户聊天界面
--先在"/Library/MobileSubstrate/DynamicLibraries/1feaks.plist"添加目标app的bundleID 添加后重新打开目标应用,如果是roothide越狱,则路径是"jbroot(/Library/MobileSubstrate/DynamicLibraries/1feaks.plist)"
function jumptochat(wid)
local scheme="whatsapp://send?phone="..wid
app.eval{
bid = "net.whatsapp.WhatsApp",
lua = [==[
dispatch_sync(dispatch_get_main_queue(), function()
local u=objc.class.NSURL.URLWithString("]==]..scheme..[==[")()
objc.class.UIApplication.sharedApplication().openURL(u)()
end)
]==]
}
end
jumptochat("11234567890")
app.views_info() --打印当前view结构
--先在"/Library/MobileSubstrate/DynamicLibraries/1feaks.plist"添加目标app的bundleID 添加后重新打开目标应用,如果是roothide越狱,则路径是"jbroot(/Library/MobileSubstrate/DynamicLibraries/1feaks.plist)"
nLog(app.views_info()) --输出格式为json