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沙盒中的业务日志,返回想要的信息。

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

相关推荐
2401_8321319544 分钟前
Python单元测试(unittest)实战指南
jvm·数据库·python
vx_BS813301 小时前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
gzxx2007sddx1 小时前
windows vnpy运行过程及问题记录
python·量化·vnpy
算法_小学生2 小时前
LeetCode 热题 100(分享最简单易懂的Python代码!)
python·算法·leetcode
230万光年的思念2 小时前
【无标题】
python
shengli7222 小时前
机器学习与人工智能
jvm·数据库·python
2301_765703142 小时前
Python迭代器(Iterator)揭秘:for循环背后的故事
jvm·数据库·python
追风少年ii3 小时前
多组学扩展---分子对接pyrosetta
python·数据分析·空间·单细胞
2301_821369613 小时前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python
m0_561359673 小时前
使用Kivy开发跨平台的移动应用
jvm·数据库·python