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

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

相关推荐
小王子10242 小时前
设计模式Python版 组合模式
python·设计模式·组合模式
Mason Lin3 小时前
2025年1月22日(网络编程 udp)
网络·python·udp
清弦墨客4 小时前
【蓝桥杯】43697.机器人塔
python·蓝桥杯·程序算法
RZer5 小时前
Hypium+python鸿蒙原生自动化安装配置
python·自动化·harmonyos
CM莫问6 小时前
什么是门控循环单元?
人工智能·pytorch·python·rnn·深度学习·算法·gru
查理零世7 小时前
【算法】回溯算法专题① ——子集型回溯 python
python·算法
圆圆滚滚小企鹅。8 小时前
刷题记录 HOT100回溯算法-6:79. 单词搜索
笔记·python·算法·leetcode
纠结哥_Shrek8 小时前
pytorch实现文本摘要
人工智能·pytorch·python
李建军8 小时前
TensorFlow 示例摄氏度到华氏度的转换(二)
人工智能·python·tensorflow
李建军8 小时前
TensorFlow 示例摄氏度到华氏度的转换(一)
人工智能·python·tensorflow