python代码中通过pymobiledevice3访问iOS沙盒目录获取app日志

【背景】

在进行业务操作过程中,即在app上的一些操作,在日志中会有对应的节点,例如,下面是查看设备实时视频过程对应的一些关键节点:

1、TxDeviceAwakeLogicHelper:wakeStart deviceId = CxD2BA11000xxxx

2、TxDeviceAwakeLogicHelper:awake send success

3、TxDeviceAwakeLogicHelper:awake success onDpUpdate deviceId = CxD2BA11000xxxx key = 1x9 value = 1 tempSuccess = false self = <xxxx.TxDeviceAwakeLogicHelper: 0x287bd81c0>

4、TXLivePlayer:p2pStart deviceId = CxD2BA11000xxxx

5、TXLivePlayer:CxD2BA11000xxxxconnect Succ

6、TXLivePlayer:p2pEnd deviceId = CxD2BA11000xxxx)

7、TXLivePlayer:previewStart deviceId = CxD2BA11000xxxx

8、TXLivePlayer:previewSuccess deviceId = CxD2BA11000xxxx

9、XxxxCameraLogicModel:XxxxCameraLogicModel-Playing = PlayState(rawValue: 1) ID = CxD2BA11000xxxx

10、TxPreviewCenter:stopPreview, deviceId=CxD2BA11000xxxx

11、TxCameraCenter:destroy finish

12、TXLivePlayerViewController:didStopPlay

13、XxxxCameraLogicModel:XxxxCameraLogicModel-!Playing = PlayState(rawValue: 4) ID = CxD2BA11000xxxx

【代码实现】

以实现捕获awake success onDpUpdate deviceId = CxD2BA11000xxxx,为例:

1、

Dart 复制代码
def get_dev_play_state():
    command1 = subprocess.Popen(['pymobiledevice3', 'apps', 'afc', 'com.gxxxxxx.ios'], stdout=subprocess.PIPE, text=True)
    command2 = subprocess.run(['cat', 'Documents/Logs/gxxxxxx_app_ios_20241025.log', '|', 'grep', '-e', '"awake success.*deviceId = CxL2xx11000xxxx"'], stdin=command1.stdout, stdout=subprocess.PIPE, text=True)
    print(command2.stdout)

上面的代码不能进入xonsh-afc并且保留在shell中继续执行后学的cat命令,得到的结果是:No such file or directory

2、

python 复制代码
def get_dev_play_state():
    result = subprocess.run('pymobiledevice3 apps afc com.gxxxxxx.ios && cat Documents/Logs/gxxxxxx_app_ios_20241025.log | grep -e "awake success.*deviceId = CxL2xx11000xxx"', shell=True, stdout=subprocess.PIPE, text=True)
    print(result.stdout)

执行上面代码后,一直没有结果返回,一直在运行状态

3、

使用 expect 模拟交互,在进入 xonsh-afc 环境后,通过 pexpect 来执行 grep 命令,在调试过程中执行:process = pexpect.spawn('/bin/zsh'),报错:

/Users/testmanzhang/PycharmProjects/practiceUICatalog/.venv/bin/python /Users/testmanzhang/PycharmProjects/practiceUICatalog/interact_with_phone.py ls (eval):39: command not found: compdef

查了一下资料,compdef 错误提示通常与 Zsh 的自动补全功能有关,可能是因为在执行 pexpect.spawn('/bin/zsh') 时,加载了某些与自动补全相关的配置文件(如 .zshrc 或 .zprofile),其中包含 compdef 配置,但 pexpect 的执行环境无法正确解析或运行这些命令。

所以添加了'--no-rcs':

python 复制代码
process = pexpect.spawn('/bin/zsh', ['--no-rcs'])

--no-rcs:该选项告诉 Zsh 在启动时不要加载用户的 .zshrc 等配置文件,避免与自动补全和其他不必要的插件产生冲突。

python 复制代码
def get_dev_play_state():
    process = pexpect.spawn('/bin/zsh', ['--no-rcs'])
    process.expect([pexpect.EOF, pexpect.TIMEOUT, 'testmanzxxxx@TestMandeMBP ~ % '])

    process.sendline('pymobiledevice3 apps afc com.gxxxxxx.ios')
    process.expect([pexpect.EOF, pexpect.TIMEOUT, '[com.apple.mobile.house_arrest:/]$'])

    process.sendline(
        f'cat Documents/Logs/gxxxxxx_app_ios_20241025.log | grep -e "awake success.*deviceId = CxL2xx11000xxxx"')
    process.expect([pexpect.EOF, pexpect.TIMEOUT])

    print(process.before.decode('utf-8'))

    process.sendline('exit')
    process.close()

通过上面的代码可以实现程序跟iOS设备的交互,并分析app沙盒中的业务日志,返回想要的信息。

我这边业务得到的结果是这样的:

相关推荐
南 阳17 分钟前
Python从入门到精通day59
开发语言·python·php
JMchen12317 分钟前
Android NDK开发从入门到实战:解锁应用性能的终极武器
android·开发语言·c++·python·c#·android studio·ndk开发
weixin_4577600018 分钟前
深入解析 Beam Search:从原理到实践的高效解码算法
python·算法
ZZH_AI项目交付32 分钟前
为什么很多复杂跳转,最后都得先回首页?
flutter·ios
小羊羔heihei1 小时前
Python列表操作全攻略
经验分享·笔记·python·学习·其他·交友
2501_908329851 小时前
实战:用OpenCV和Python进行人脸识别
jvm·数据库·python
老刘说AI1 小时前
WorkFlow Agent案例:auto_document_agent(文件自动处理)
开发语言·数据库·人工智能·python·神经网络·自然语言处理
ZhengEnCi2 小时前
M1-如何转换为HTML
python·html
科学创新前沿2 小时前
逆向设计新范式:深度学习驱动的声学超材料智能优化!
人工智能·python·深度学习·声学·逆向设计·声学超材料
Sagittarius_A*2 小时前
传统图像分割:阈值 / 区域生长 / 分水岭 / 图割全解析【计算机视觉】
图像处理·人工智能·python·opencv·计算机视觉·图像分割