From 546233aad74d28ed485113fecb2563c778fb574e Mon Sep 17 00:00:00 2001 From: zhaoye Date: Fri, 27 Nov 2020 11:56:22 +0800 Subject: [PATCH] v0.3.5 Bugfix/support ideviceinstaller (#44) * rm ideviceinstaller * v0.3.5 * rm libdeviecmobile info checker --- README.md | 121 +++++++++++++----------- lyrebird_ios/bin/1.2.0/ideviceinstaller | Bin 38292 -> 0 bytes lyrebird_ios/bin/1.3.0/ideviceinstaller | Bin 45384 -> 0 bytes lyrebird_ios/ios_helper.py | 22 +---- setup.py | 2 +- 5 files changed, 69 insertions(+), 76 deletions(-) delete mode 100755 lyrebird_ios/bin/1.2.0/ideviceinstaller delete mode 100755 lyrebird_ios/bin/1.3.0/ideviceinstaller diff --git a/README.md b/README.md index 36479d8..290a7e3 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,29 @@ # Lyrebird iOS Plugin + [![Build Status](https://travis-ci.org/Meituan-Dianping/lyrebird-ios.svg?branch=master)](https://travis-ci.org/Meituan-Dianping/lyrebird-ios) [![PyPI](https://img.shields.io/pypi/v/lyrebird-ios.svg)](https://pypi.python.org/pypi/lyrebird-ios) ![PyPI](https://img.shields.io/pypi/pyversions/lyrebird-ios.svg) ![GitHub](https://img.shields.io/github/license/meituan/lyrebird-ios.svg) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/25eaa2cd08a34cad966a271cf0c2f910)](https://www.codacy.com/manual/Lyrebird/lyrebird-ios?utm_source=github.com&utm_medium=referral&utm_content=Meituan-Dianping/lyrebird-ios&utm_campaign=Badge_Grade) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/25eaa2cd08a34cad966a271cf0c2f910)](https://www.codacy.com/manual/Lyrebird/lyrebird-ios?utm_source=github.com&utm_medium=referral&utm_content=Meituan-Dianping/lyrebird-ios&utm_campaign=Badge_Grade) --- + **[Lyrebird](https://github.com/Meituan-Dianping/lyrebird)** -是一个基于拦截以及模拟 HTTP/HTTPs网络请求的面向移动应用的插件化测试平台。 +是一个基于拦截以及模拟 HTTP/HTTPs 网络请求的面向移动应用的插件化测试平台。 -**iOS plugin是一个Lyrebird的插件,用于从iOS设备获取信息,如详细的设备信息、屏幕快照和应用信息。** +**iOS plugin 是一个 Lyrebird 的插件,用于从 iOS 设备获取信息,如详细的设备信息、屏幕快照和应用信息。** ## 快速开始 ### 环境要求 -* macOS +- macOS -* [Python >= 3.6](https://www.python.org/downloads/release/python-360/) +- [Python >= 3.6](https://www.python.org/downloads/release/python-360/) -* [libimobiledevice](https://github.com/libimobiledevice/libimobiledevice) +- [libimobiledevice](https://github.com/libimobiledevice/libimobiledevice) -* [Command Line Tools for Xcode](https://developer.apple.com/download/more/) +- [Command Line Tools for Xcode](https://developer.apple.com/download/more/) ### 环境准备 @@ -31,18 +33,20 @@ 1. 通过 Homebrew 安装 [libimobiledevice](https://github.com/libimobiledevice/libimobiledevice) - ```bash - brew install --HEAD libimobiledevice - brew link --overwrite libimobiledevice - sudo chmod -R 777 /var/db/lockdown/ - ``` + ```bash + brew install --HEAD libimobiledevice + brew install ideviceinstaller + brew link --overwrite libimobiledevice + sudo chmod -R 777 /var/db/lockdown/ + ``` 1. 最终,测试第三方依赖是否正常工作 - ```bash - ideviceinfo - idevicescreenshot - ``` + ```bash + ideviceinfo + idevicescreenshot + idevicesinstaller -l + ``` ### 安装 @@ -58,34 +62,33 @@ lyrebird ### 使用 - 使用时,通过USB线链接手机和电脑即可。 +使用时,通过 USB 线链接手机和电脑即可。 ![Home Page](./image/iOS.png) -* 查看已连接设备的详细信息 - -* 截取 iOS 设备屏幕快照 +- 查看已连接设备的详细信息 -* 查看已连接设备的应用信息 +- 截取 iOS 设备屏幕快照 +- 查看已连接设备的应用信息 ----- +--- ## 开发者指南 ### 开发者环境 -* macOS +- macOS -* Python3.6及以上 +- Python3.6 及以上 -* NodeJS +- NodeJS -* vscode(推荐) +- vscode(推荐) -* Chrome(推荐) +- Chrome(推荐) -### 配置Lyrebird-ios工程 +### 配置 Lyrebird-ios 工程 ```bash # clone 代码 @@ -109,6 +112,7 @@ code . ### 调试代码 #### Vscode debug 配置 + ```JSON { "version": "0.2.0", @@ -142,17 +146,17 @@ code . #### 后端代码 -1. 激活python虚拟环境 +1. 激活 python 虚拟环境 - 通过 ```source venv/bin/activate``` 激活虚拟环境 + 通过 `source venv/bin/activate` 激活虚拟环境 -2. 通过Debug功能启动 +2. 通过 Debug 功能启动 - 按照上面 debug配置中 python:Lyrebrid配置启动即可 + 按照上面 debug 配置中 python:Lyrebrid 配置启动即可 #### 前端代码 -1. 启动node server +1. 启动 node server ```bash # 进入前端目录 @@ -162,13 +166,14 @@ cd frontend npm run serve ``` -2. 通过Debug功能启动浏览器 +2. 通过 Debug 功能启动浏览器 - 按照上面 debug配置中 vuejs: chrome 配置启动即可 + 按照上面 debug 配置中 vuejs: chrome 配置启动即可 - > 注意: vscode 需要安装chrome debug插件 + > 注意: vscode 需要安装 chrome debug 插件 + +3. build 前端项目 -3. build前端项目 ```bash # 进入前端目录 cd frontend @@ -178,36 +183,38 @@ npm run build ``` ## 常见问题 + #### libimobiledevice 无法使用,终端提示 - "Could not connect to lockdownd ...". -按照如下步骤重新安装 libimobiledevice,并留意安装过程中的错误提示。 -1. 卸载libimobiledevice +按照如下步骤重新安装 libimobiledevice,并留意安装过程中的错误提示。 - ``` - brew uninstall --ignore-dependencies libimobiledevice - ``` +1. 卸载 libimobiledevice -1. 安装libimobiledevice + ``` + brew uninstall --ignore-dependencies libimobiledevice + ``` - ``` - brew install --HEAD libimobiledevice - ``` +1. 安装 libimobiledevice -1. 若在安装libimobiledevice时出现了错误提示,如提示usbmuxd的版本不正确,使用如下命令解决依赖的版本问题 + ``` + brew install --HEAD libimobiledevice + ``` - ``` - brew uninstall --ignore-dependencies usbmuxd - brew install --HEAD usbmuxd - brew unlink usbmuxd - brew link usbmuxd - ``` +1. 若在安装 libimobiledevice 时出现了错误提示,如提示 usbmuxd 的版本不正确,使用如下命令解决依赖的版本问题 -1. 再次安装libimobiledevice + ``` + brew uninstall --ignore-dependencies usbmuxd + brew install --HEAD usbmuxd + brew unlink usbmuxd + brew link usbmuxd + ``` - ``` - brew install --HEAD libimobiledevice - ``` +1. 再次安装 libimobiledevice + ``` + brew install --HEAD libimobiledevice + ``` #### 截取屏幕快照功能无法正常工作,提示 Could not start screenshot service! + 在连接设备之前您必须确保开发者选项可用。通过 [stackoverflow](https://stackoverflow.com/questions/30736932/xcode-error-could-not-find-developer-disk-image) 获取更多解决帮助。 diff --git a/lyrebird_ios/bin/1.2.0/ideviceinstaller b/lyrebird_ios/bin/1.2.0/ideviceinstaller deleted file mode 100755 index 6886c7244a0841e01403bb49f90fe99dd6e5ae09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38292 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 Z(Gmg|aX;KEU;ASR2^I1II039<{|`RK-+BN5 diff --git a/lyrebird_ios/ios_helper.py b/lyrebird_ios/ios_helper.py index 0f94fb2..3c02b8e 100644 --- a/lyrebird_ios/ios_helper.py +++ b/lyrebird_ios/ios_helper.py @@ -28,6 +28,7 @@ ios_driver = wda_helper.Helper() + def check_environment(): """ 检查用户环境,第三方依赖是否正确安装。 @@ -35,20 +36,6 @@ def check_environment(): """ global ideviceinstaller, idevice_id, idevicescreenshot, ideviceinfo - # Check libmobiledevice, action when unavailable : block - p = subprocess.run('brew info --json libimobiledevice', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - code, output, err_str = p.returncode, p.stdout.decode(), p.stderr.decode() - if err_str or code or not output: - raise LibmobiledeviceError(f'Get libmobiledevice info error: {err_str}') - - try: - libimobiledevice_info = json.loads(output) - except Exception: - raise LibmobiledeviceError(f'Get unknown libmobiledevice info: {output}') - - if not isinstance(libimobiledevice_info, list) and not len(libimobiledevice_info): - raise LibmobiledeviceError(f'Get unknown libmobiledevice info: {output}') - # Check idevice_id, action when unavailable : block idevice_id_keywords = 'idevice_id' idevice_id = SYSTEM_BIN/idevice_id_keywords @@ -68,11 +55,8 @@ def check_environment(): env_err_msg = [] # Check ideviceinstaller, action when unavailable : warning - lib_version = libimobiledevice_info[0].get('versions', {}).get('stable') - lib_version = '1.2.0' if version.parse(lib_version) < version.parse('1.3.0') else '1.3.0' - ideviceinstaller_keywords = 'ideviceinstaller' - ideviceinstaller = Path(__file__).parent/'bin'/lib_version/ideviceinstaller_keywords + ideviceinstaller = SYSTEM_BIN/ideviceinstaller_keywords err_msg = check_environment_item(ideviceinstaller_keywords, ideviceinstaller) if err_msg: env_err_msg.append(err_msg) @@ -90,6 +74,7 @@ def check_environment(): if env_err_msg: _log.error('iOS Plugin environment warning:\n' + '.\n'.join(env_err_msg)) + def check_environment_item(command, path, sub_command=''): if not Path(path).exists(): return f'Command `{command}` not found, check your libimobiledevice' @@ -98,6 +83,7 @@ def check_environment_item(command, path, sub_command=''): err_str = p.stderr.decode() return f'Execute command `{command}` error: {err_str}' if err_str else '' + def read_plist(plist_path): return plistlib.readPlist(plist_path) diff --git a/setup.py b/setup.py index 4321286..fde9790 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ setup( name='lyrebird-ios', - version='0.3.4', + version='0.3.5', packages=['lyrebird_ios'], url='https://github.com/meituan/lyrebird-ios', author='HBQA',