增加启动校验

This commit is contained in:
2025-09-24 16:32:05 +08:00
parent b2ec94c62c
commit b94434692c
12 changed files with 72 additions and 100 deletions

2
.idea/iOSAI.iml generated
View File

@@ -4,7 +4,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" /> <excludeFolder url="file://$MODULE_DIR$/.venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.12 (iOSAi)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.12" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

2
.idea/misc.xml generated
View File

@@ -3,5 +3,5 @@
<component name="Black"> <component name="Black">
<option name="sdkName" value="Python 3.12" /> <option name="sdkName" value="Python 3.12" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12 (iOSAi)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.12" project-jdk-type="Python SDK" />
</project> </project>

15
.idea/workspace.xml generated
View File

@@ -5,8 +5,15 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="eceeff5e-51c1-459c-a911-d21ec090a423" name="Changes" comment="20250904-初步功能已完成"> <list default="true" id="eceeff5e-51c1-459c-a911-d21ec090a423" name="Changes" comment="20250904-初步功能已完成">
<change beforePath="$PROJECT_DIR$/.idea/iOSAI.iml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/iOSAI.iml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Module/DeviceInfo.py" beforeDir="false" afterPath="$PROJECT_DIR$/Module/DeviceInfo.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Module/FlaskService.py" beforeDir="false" afterPath="$PROJECT_DIR$/Module/FlaskService.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Module/Main.py" beforeDir="false" afterPath="$PROJECT_DIR$/Module/Main.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Module/Main.py" beforeDir="false" afterPath="$PROJECT_DIR$/Module/Main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build-tidevice.bat" beforeDir="false" afterPath="$PROJECT_DIR$/build-tidevice.bat" afterDir="false" />
<change beforePath="$PROJECT_DIR$/build.bat" beforeDir="false" afterPath="$PROJECT_DIR$/build.bat" afterDir="false" />
<change beforePath="$PROJECT_DIR$/resources/iproxy/tidevice.exe" beforeDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -67,23 +74,25 @@
&quot;git-widget-placeholder&quot;: &quot;main&quot;, &quot;git-widget-placeholder&quot;: &quot;main&quot;,
&quot;javascript.nodejs.core.library.configured.version&quot;: &quot;20.17.0&quot;, &quot;javascript.nodejs.core.library.configured.version&quot;: &quot;20.17.0&quot;,
&quot;javascript.nodejs.core.library.typings.version&quot;: &quot;20.17.58&quot;, &quot;javascript.nodejs.core.library.typings.version&quot;: &quot;20.17.58&quot;,
&quot;last_opened_file_path&quot;: &quot;C:/Users/zhangkai/Desktop/last-item/Storage&quot;, &quot;last_opened_file_path&quot;: &quot;E:/code/Python/iOSAi/resources/iproxy&quot;,
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;, &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;, &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;, &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;, &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;, &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
&quot;settings.editor.selected.configurable&quot;: &quot;org.jetbrains.plugins.gitlab.GitLabSettingsConfigurable&quot;, &quot;settings.editor.selected.configurable&quot;: &quot;com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable&quot;,
&quot;two.files.diff.last.used.file&quot;: &quot;E:/share/iOSAI/Module/FlaskService.py&quot;, &quot;two.files.diff.last.used.file&quot;: &quot;E:/share/iOSAI/Module/FlaskService.py&quot;,
&quot;vue.rearranger.settings.migration&quot;: &quot;true&quot; &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
} }
}</component> }</component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="E:\code\Python\iOSAi\resources\iproxy" />
<recent name="C:\Users\zhangkai\Desktop\last-item\iosai\Utils" /> <recent name="C:\Users\zhangkai\Desktop\last-item\iosai\Utils" />
<recent name="C:\Users\zhangkai\Desktop\20250916ios\iOSAI\resources" /> <recent name="C:\Users\zhangkai\Desktop\20250916ios\iOSAI\resources" />
</key> </key>
<key name="MoveFile.RECENT_KEYS"> <key name="MoveFile.RECENT_KEYS">
<recent name="E:\code\Python\iOSAi\Module" />
<recent name="E:\code\Python\iOSAi" /> <recent name="E:\code\Python\iOSAi" />
<recent name="E:\Code\python\iOSAI\resources" /> <recent name="E:\Code\python\iOSAI\resources" />
<recent name="E:\Code\python\iOSAI" /> <recent name="E:\Code\python\iOSAI" />
@@ -172,7 +181,7 @@
<option name="ADD_CONTENT_ROOTS" value="true" /> <option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" /> <option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/Module/Main.py" /> <option name="SCRIPT_NAME" value="E:\code\Python\iOSAi\Module\Main.py" />
<option name="PARAMETERS" value="" /> <option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" /> <option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" /> <option name="EMULATE_TERMINAL" value="false" />

View File

@@ -1,15 +1,16 @@
import os import os
import signal import signal
import subprocess import subprocess
import threading
import time import time
from concurrent.futures import ThreadPoolExecutor, as_completed from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path from pathlib import Path
from typing import Dict, Optional, List from typing import Dict, Optional, List
import tidevice
import wda import wda
from tidevice import Usbmux, ConnectionType from tidevice import Usbmux, ConnectionType
from tidevice._device import BaseDevice from tidevice._device import BaseDevice
from Entity.DeviceModel import DeviceModel from Entity.DeviceModel import DeviceModel
from Entity.Variables import WdaAppBundleId
from Module.FlaskSubprocessManager import FlaskSubprocessManager from Module.FlaskSubprocessManager import FlaskSubprocessManager
from Utils.LogManager import LogManager from Utils.LogManager import LogManager
@@ -46,11 +47,18 @@ class DeviceInfo:
def _add_device(self, udid: str): def _add_device(self, udid: str):
if not self._trusted(udid): if not self._trusted(udid):
return return
r = self.startWda(udid)
if r is False:
LogManager.info("启动wda失败")
return
w, h, s = self._screen_info(udid)
if w == 0 or h == 0 or s == 0:
print("未获取到设备屏幕信息")
return
port = self._alloc_port() port = self._alloc_port()
proc = self._start_iproxy(udid, port) proc = self._start_iproxy(udid, port)
if not proc: if not proc:
return return
w, h, s = self._screen_info(udid)
model = DeviceModel(deviceId=udid, screenPort=port, model = DeviceModel(deviceId=udid, screenPort=port,
width=w, height=h, scale=s, type=1) width=w, height=h, scale=s, type=1)
model.ready = True model.ready = True
@@ -75,14 +83,30 @@ class DeviceInfo:
except Exception: except Exception:
return False return False
def startWda(self, udid):
print("进入启动wda方法")
try:
dev = tidevice.Device(udid)
print("获取tidevice对象成功准备启动wda")
dev.app_start(WdaAppBundleId)
print("启动wda成功")
time.sleep(3)
return True
except Exception as e:
print("启动wda遇到错误:", e)
return False
def _screen_info(self, udid: str): def _screen_info(self, udid: str):
try: try:
c = wda.USBClient(udid, 8100) c = wda.USBClient(udid, 8100)
c.home()
size = c.window_size() size = c.window_size()
scale = c.scale scale = c.scale
return int(size.width), int(size.height), float(scale) return int(size.width), int(size.height), float(scale)
except Exception: return 0, 0, 0
return 828, 1792, 2.0 except Exception as e:
print("获取设备信息遇到错误:",e)
return 0, 0, 0
... ...
# ---------------- 原来代码不变,只替换下面一个函数 ---------------- # ---------------- 原来代码不变,只替换下面一个函数 ----------------

View File

@@ -151,6 +151,12 @@ def deviceList():
LogManager.error("获取设备列表失败:", e) LogManager.error("获取设备列表失败:", e)
return ResultData(data=[]).toJson() return ResultData(data=[]).toJson()
# 传递token
@app.route('/passToken', methods=['POST'])
def passToken():
data = request.get_json()
print(data)
return ResultData(data="").toJson()
# 获取设备应用列表 # 获取设备应用列表
@app.route('/deviceAppList', methods=['POST']) @app.route('/deviceAppList', methods=['POST'])
@@ -400,7 +406,6 @@ def monitorMessages():
manager = ScriptManager() manager = ScriptManager()
event = threading.Event() event = threading.Event()
thread = threading.Thread(target=manager.replyMessages, args=(udid, event)) thread = threading.Thread(target=manager.replyMessages, args=(udid, event))
thread.start()
# 添加到线程管理 # 添加到线程管理
ThreadManager.add(udid, thread, event) ThreadManager.add(udid, thread, event)
return ResultData(data="").toJson() return ResultData(data="").toJson()

View File

@@ -2,9 +2,6 @@ import os
import sys import sys
from pathlib import Path from pathlib import Path
import wda
import tidevice
from Module.DeviceInfo import DeviceInfo from Module.DeviceInfo import DeviceInfo
from Module.FlaskSubprocessManager import FlaskSubprocessManager from Module.FlaskSubprocessManager import FlaskSubprocessManager
from Utils.DevDiskImageDeployer import DevDiskImageDeployer from Utils.DevDiskImageDeployer import DevDiskImageDeployer
@@ -27,32 +24,19 @@ if "--role=flask" in sys.argv:
_run_flask_role() _run_flask_role()
sys.exit(0) sys.exit(0)
def main(arg):
print(arg)
if len(arg) != 2:
sys.exit(0)
else:
if arg[1] != "iosai":
sys.exit(0)
# 项目入口 # 项目入口
if __name__ == "__main__": if __name__ == "__main__":
wda.debug = True # 获取启动时候传递的参数
main(sys.argv)
# 1. 打包环境
if hasattr(sys, '_MEIPASS'):
base_dir = sys._MEIPASS
# 2. 源码调试环境
else:
base_dir = os.path.dirname(
os.path.dirname(os.path.abspath(__file__)) # 向上跳一级
)
# 3. 拼 iproxy 目录
iproxy_dir = os.path.join(base_dir, 'resources', 'iproxy')
# 4. 剩余逻辑不变
if os.path.isdir(iproxy_dir):
sep = os.pathsep
old_path = os.environ.get('PATH', '')
if iproxy_dir not in old_path:
os.environ['PATH'] = old_path + sep + iproxy_dir
else:
print(f'warning: {iproxy_dir} not found', file=sys.stderr)
# 添加iOS开发包到电脑上 # 添加iOS开发包到电脑上
deployer = DevDiskImageDeployer(verbose=True) deployer = DevDiskImageDeployer(verbose=True)
@@ -69,15 +53,13 @@ if __name__ == "__main__":
except Exception as e: except Exception as e:
print("[WARN] Device listener not running:", e) print("[WARN] Device listener not running:", e)
# === 保活:阻塞主线程,直到收到 Ctrl+C/关闭 === # === 保活:阻塞主线程,直到收到 Ctrl+C/关闭 ===
import threading, time, signal import threading, time, signal
stop = threading.Event() stop = threading.Event()
def _handle(_sig, _frm): def _handle(_sig, _frm):
stop.set() stop.set()
# Windows 上 SIGINT/SIGTERM 都可以拦到 # Windows 上 SIGINT/SIGTERM 都可以拦到
try: try:
signal.signal(signal.SIGINT, _handle) signal.signal(signal.SIGINT, _handle)

View File

@@ -1,13 +1,13 @@
pyinstaller -F -n tidevice ^ @REM pyinstaller -F -n tidevice ^
--hidden-import=tidevice._proto ^ @REM --hidden-import=tidevice._proto ^
--hidden-import=tidevice._instruments ^ @REM --hidden-import=tidevice._instruments ^
--hidden-import=tidevice._usbmux ^ @REM --hidden-import=tidevice._usbmux ^
--hidden-import=tidevice._wdaproxy ^ @REM --hidden-import=tidevice._wdaproxy ^
--collect-all tidevice ^
--noconsole ^
--add-data="C:\Users\milk\AppData\Local\Programs\Python\Python312\Lib\site-packages\tidevice;tidevice" ^
tidevice_entry.py
@REM pyinstaller -F -n tidevice -noconsole ^
@REM --collect-all tidevice ^ @REM --collect-all tidevice ^
@REM tidevice_entry.py @REM --noconsole ^
@REM --add-data="C:\Users\milk\AppData\Local\Programs\Python\Python312\Lib\site-packages\tidevice;tidevice" ^
@REM tidevice_entry.py
pyinstaller -F -n tidevice ^
--collect-all tidevice ^
tidevice_entry.py

View File

@@ -1,58 +1,10 @@
@REM python -m nuitka "Module/Main.py" ^
@REM --standalone ^
@REM --msvc=latest ^
@REM --windows-console-mode=disable ^
@REM --output-filename=IOSAI ^
@REM --include-package=Module,Utils,Entity,script ^
@REM --include-module=flask ^
@REM --include-module=flask_cors ^
@REM --include-module=lxml ^
@REM --include-module=lxml.etree ^
@REM --include-module=requests ^
@REM --include-module=urllib3 ^
@REM --include-module=certifi ^
@REM --include-module=idna ^
@REM --include-data-files="E:/code/Python/iOSAI/.venv/Scripts/tidevice.exe=tidevice.exe" ^
@REM --include-data-dir="E:/code/Python/iOSAI/.venv/Scripts=Scripts" ^
@REM --include-data-dir="E:/code/Python/iOSAI/SupportFiles=SupportFiles" ^
@REM --include-data-dir="E:/code/Python/iOSAI/resources=resources" ^
@REM --include-data-files="E:/code/Python/iOSAI/resources/iproxy/*=resources/iproxy/" ^
@REM --windows-icon-from-ico="E:/code/Python/iOSAI/resources/icon.ico"
@REM python -m nuitka "Module/Main.py" ^
@REM --standalone ^
@REM --msvc=latest ^
@REM --windows-console-mode=force ^
@REM --output-filename=IOSAI ^
@REM --include-package=Module,Utils,Entity,script ^
@REM --include-module=flask ^
@REM --include-module=wda ^
@REM --include-module=flask_cors ^
@REM --include-module=lxml ^
@REM --include-module=lxml.etree ^
@REM --include-module=requests ^
@REM --include-module=urllib3 ^
@REM --include-module=certifi ^
@REM --include-module=idna ^
@REM --include-module=setuptools ^
@REM --include-module=tidevice ^
@REM --include-data-dir=resources=resources ^
@REM --include-data-dir=SupportFiles=SupportFiles ^
@REM --include-data-files="E:/code/Python/iOSAi/resources/iproxy/*=resources/iproxy/" ^
@REM --include-data-files=resources/icon.ico=resources/icon.ico ^
@REM --jobs=20 ^
@REM --windows-icon-from-ico=resources/icon.ico
python -m nuitka Module\Main.py ^ python -m nuitka Module\Main.py ^
--standalone ^ --standalone ^
--msvc=latest ^ --msvc=latest ^
--windows-console-mode=force ^ --windows-console-mode=disable ^
--output-filename=IOSAI ^ --output-filename=IOSAI ^
--include-package=Module,Utils,Entity,script ^ --include-package=Module,Utils,Entity,script ^
--include-module=flask,wda,flask_cors,lxml,lxml.etree,requests,urllib3,certifi,idna,setuptools,tidevice ^ --include-module=flask,wda,psutil,portalocker,flask_cors,cv2,lxml.etree,requests,urllib3,certifi,idna,setuptools,tidevice ^
--include-data-dir=resources=resources ^ --include-data-dir=resources=resources ^
--include-data-dir=SupportFiles=SupportFiles ^ --include-data-dir=SupportFiles=SupportFiles ^
--include-data-files="E:/code/Python/iOSAi/resources/iproxy/*=resources/iproxy/" ^ --include-data-files="E:/code/Python/iOSAi/resources/iproxy/*=resources/iproxy/" ^

Binary file not shown.