“依托” iOS 系统封闭且隐私保护的特性,在IOS实现UIAutomation自动化这样的功能并不简单

而越狱方案随着系统漏洞越来越少,目前多巴胺越狱版本仍长时间停留在16.5以下,由Driver Agent驱动的测试框架因为签名等一系列问题,无法适配所有的手机,后面又出现了基于逆向Airplay协议的方案,由于Airplay协议定位问题并不稳定,对网络要求也极高

iClick(https://iosclick.com)作为一款针对苹果iOS设备的免越狱自动化工具,提供了可靠的开发方案,他不仅没有Driver Agent等类似方案签名和兼容问题,也解决了Airplay由于网络波动或手机负载过高频繁掉线问题,合用于真实业务环境中的自动化接入与二次开发

🎉 iClick 免越狱自动化&免签&免开发者
投屏方式 ✅ 高清直播级别投屏,高帧率免杀,不受系统后台机制影响
网络断网也可自动重连恢复
文件传输 ✅ 无需快捷指令
局域网后台文件增删改查,支持超大文件传输
OCR能力 ✅ 基于Apple Intelligence模型,全球18+主流语言精准识别
无需额外部署OCR环境不占用主机资源
识图能力 ✅ 识图算法内置在设备端,不占用主机资源,带图色开发者工具
局域网隔离 ✅ 无需额外组网或隔离,同局域网多服务投屏服务不受影响
集成&部署 ✅ 集成轻量级脚本引擎
无需额外繁琐的工作可对控制台进行集成
专注于功能开发,可OEM
AI模型能力 ✅ 支持调用ONNX,跨平台模型调用,支持YOLO
封装&调用 ✅ 主流语言包SDK已上架官方包管理
例如PIP、NPM、NUGET
Python、C#、NodeJS一行命令即可安装编写
云手机 ✅ 支持私有化部署
以搭建高可用的IOS WEB云投屏系统,支持开源定制

🎉 控制台1.8.4已新增对macOS支持

在这里插入图片描述

在开发上,iClick针对常用编程语言提供了Package仓库支持

比如NodeJS可以直接npm install iclick-auto直接安装调用,无需手动下载包

NodeJS npm install iclick-auto 🔗 NPM
Python pip install iclick-auto 🔗 PIP
C# Install-Package iclick-auto 🔗 NuGet

在iClick控制台中,除了基础的批量控制,设备管理,文件管理功能,还提供了开发工具以便于调试和取色等功能

在这里插入图片描述

API文档地址 https://iosclick.com/zh/api/ 下面写一个小Demo举例

;(async () => {

    const fs = require('fs/promises')
    const path = require('path')
    const iclick = require('iclick-auto')
    const sleep = (_t = 1000) => new Promise(resolve => setTimeout(resolve, _t))

    const client = new iclick()

    client.on('device:online', (_data) => {
        console.log('设备上线:', _data)
    })

    client.on('device:offline', (_data) => {
        console.log('设备下线:', _data)
    })

    await client.connect()

    const _devices = await client.invoke('getDevices')
    console.log('设备列表:', _devices)

    const _deviceId = 'P60904DC8D3F'
    const _device = _devices[ _deviceId ].info

    console.log('当前设备:', _deviceId)

    // 返回桌面
    await client.invoke('sendAction', { deviceId: _deviceId, action: 'home' })

    // 等待返回桌面
    await sleep(1200)

    // 找到桌面safari图标
    const _safariIcon = await client.invoke('findImage', {
        deviceId: _deviceId,
        sprite: 'base64',
        rect: [0, _device.screenHeight - 300, _device.screenWidth, _device.screenHeight]
    })

    if( !_safariIcon ){
        throw new Error('未找到Safari图标')
    }

    // 点击Safari图标
    await client.invoke('click', { deviceId: _deviceId, x: _safariIcon.x, y: _safariIcon.y, delay: 120 })

    // 等待打开Safari
    await sleep(1200)

    // 点击 Safari 底部地址栏
    await client.invoke('click', { deviceId: _deviceId, x: _device.screenWidth / 2, y: _device.screenHeight - 70 })

    // 等待打开地址栏
    await sleep(600)

    // 输入网址
    await client.invoke('sendText', { deviceId: _deviceId, text: 'https://ipinfo.io/ip' })

    // 回车
    await client.invoke('sendKey', { deviceId: _deviceId, key: '', fnkey: 'ENTER' })

    //等待页面加载
    await sleep(3000)

    // 获取截图(base64)并保存到下载目录
    const _image = await client.invoke('getScreenShot', { deviceId: _deviceId })
    await fs.writeFile(path.join(process.env.HOME, 'Downloads', `screenshot_${_deviceId}_${Date.now()}.png`), _image)

    // 滑动示例
    await client.invoke('swipe', { deviceId: _deviceId, start: [200, 600], end: [200, 300], })

    await sleep(1200)

    // OCR 示例(识别一个区域)
    const _texts = await client.invoke('ocr', { deviceId: _deviceId, rect: [20, 120, 420, 240] })
    console.log('OCR结果:', _texts)

    // 多点找色,验证屏幕上的多个绝对坐标点是否匹配
    const _result = await apiInvoke('findColor', {
        deviceId: 'P72578581E07',
        colors: [
            [245, 509, "00B4F9|1"],  
            [284, 745, "A49696|0.95"],
            [290, 911, "9B8C89"]     
        ]
    });
    console.log('多点找色结果:', _result)

    console.log('脚本执行完成')

})().catch(_error => {
    console.error('脚本执行失败:', _error)
})
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐