mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Launch Playgound project on simulator
This commit is contained in:
parent
25ef69ffe1
commit
f87a6c6706
@ -15,3 +15,17 @@ Small app to quickly iterate on components testing without building an entire me
|
||||
```shell
|
||||
./generate_project.py
|
||||
```
|
||||
|
||||
## Run generated project on simulator
|
||||
|
||||
### From root
|
||||
|
||||
```shell
|
||||
./Swiftgram/Playground/launch_on_simulator.py
|
||||
```
|
||||
|
||||
### From current directory
|
||||
|
||||
```shell
|
||||
./launch_on_simulator.py
|
||||
```
|
||||
|
170
Swiftgram/Playground/launch_on_simulator.py
Executable file
170
Swiftgram/Playground/launch_on_simulator.py
Executable file
@ -0,0 +1,170 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import subprocess
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
|
||||
|
||||
def find_app(start_path):
|
||||
for root, dirs, _ in os.walk(start_path):
|
||||
for dir in dirs:
|
||||
if dir.endswith(".app"):
|
||||
return os.path.join(root, dir)
|
||||
return None
|
||||
|
||||
|
||||
def ensure_simulator_booted(device_name) -> str:
|
||||
# List all devices
|
||||
devices_json = subprocess.check_output(
|
||||
["xcrun", "simctl", "list", "devices", "--json"]
|
||||
).decode()
|
||||
devices = json.loads(devices_json)
|
||||
for runtime in devices["devices"]:
|
||||
for device in devices["devices"][runtime]:
|
||||
if device["name"] == device_name:
|
||||
device_udid = device["udid"]
|
||||
if device["state"] == "Booted":
|
||||
print(f"Simulator {device_name} is already booted.")
|
||||
return device_udid
|
||||
break
|
||||
if device_udid:
|
||||
break
|
||||
|
||||
if not device_udid:
|
||||
raise Exception(f"Simulator {device_name} not found")
|
||||
|
||||
# Boot the device
|
||||
print(f"Booting simulator {device_name}...")
|
||||
subprocess.run(["xcrun", "simctl", "boot", device_udid], check=True)
|
||||
|
||||
# Wait for the device to finish booting
|
||||
print("Waiting for simulator to finish booting...")
|
||||
while True:
|
||||
boot_status = subprocess.check_output(
|
||||
["xcrun", "simctl", "list", "devices"]
|
||||
).decode()
|
||||
if f"{device_name} ({device_udid}) (Booted)" in boot_status:
|
||||
break
|
||||
time.sleep(0.5)
|
||||
|
||||
print(f"Simulator {device_name} is now booted.")
|
||||
return device_udid
|
||||
|
||||
|
||||
def build_and_run_xcode_project(project_path, scheme_name, destination):
|
||||
# Change to the directory containing the .xcodeproj file
|
||||
os.chdir(os.path.dirname(project_path))
|
||||
|
||||
# Build the project
|
||||
build_command = [
|
||||
"xcodebuild",
|
||||
"-project",
|
||||
project_path,
|
||||
"-scheme",
|
||||
scheme_name,
|
||||
"-destination",
|
||||
destination,
|
||||
"-sdk",
|
||||
"iphonesimulator",
|
||||
"build",
|
||||
]
|
||||
|
||||
try:
|
||||
subprocess.run(build_command, check=True)
|
||||
print("Build successful!")
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Build failed with error: {e}")
|
||||
return
|
||||
|
||||
# Get the bundle identifier and app path
|
||||
settings_command = [
|
||||
"xcodebuild",
|
||||
"-project",
|
||||
project_path,
|
||||
"-scheme",
|
||||
scheme_name,
|
||||
"-sdk",
|
||||
"iphonesimulator",
|
||||
"-showBuildSettings",
|
||||
]
|
||||
|
||||
try:
|
||||
result = subprocess.run(
|
||||
settings_command, capture_output=True, text=True, check=True
|
||||
)
|
||||
settings = result.stdout.split("\n")
|
||||
bundle_id = next(
|
||||
line.split("=")[1].strip()
|
||||
for line in settings
|
||||
if "PRODUCT_BUNDLE_IDENTIFIER" in line
|
||||
)
|
||||
build_dir = next(
|
||||
line.split("=")[1].strip()
|
||||
for line in settings
|
||||
if "TARGET_BUILD_DIR" in line
|
||||
)
|
||||
|
||||
app_path = find_app(build_dir)
|
||||
if not app_path:
|
||||
print(f"Could not find .app file in {build_dir}")
|
||||
return
|
||||
print(f"Found app at: {app_path}")
|
||||
print(f"Bundle identifier: {bundle_id}")
|
||||
print(f"App path: {app_path}")
|
||||
except (subprocess.CalledProcessError, StopIteration) as e:
|
||||
print(f"Failed to get build settings: {e}")
|
||||
return
|
||||
|
||||
device_udid = ensure_simulator_booted(simulator_name)
|
||||
|
||||
# Install the app on the simulator
|
||||
install_command = ["xcrun", "simctl", "install", device_udid, app_path]
|
||||
|
||||
try:
|
||||
subprocess.run(install_command, check=True)
|
||||
print("App installed on simulator successfully!")
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Failed to install app on simulator: {e}")
|
||||
return
|
||||
|
||||
# List installed apps
|
||||
try:
|
||||
listapps_cmd = "/usr/bin/xcrun simctl listapps booted | /usr/bin/plutil -convert json -r -o - -- -"
|
||||
result = subprocess.run(
|
||||
listapps_cmd, shell=True, capture_output=True, text=True, check=True
|
||||
)
|
||||
apps = json.loads(result.stdout)
|
||||
|
||||
if bundle_id in apps:
|
||||
print(f"App {bundle_id} is installed on the simulator")
|
||||
else:
|
||||
print(f"App {bundle_id} is not installed on the simulator")
|
||||
print("Installed apps:", list(apps.keys()))
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Failed to list apps: {e}")
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"Failed to parse app list: {e}")
|
||||
|
||||
# Focus simulator
|
||||
subprocess.run(["open", "-a", "Simulator"], check=True)
|
||||
|
||||
# Run the project on the simulator
|
||||
run_command = ["xcrun", "simctl", "launch", "booted", bundle_id]
|
||||
|
||||
try:
|
||||
subprocess.run(run_command, check=True)
|
||||
print("Application launched in simulator!")
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Failed to launch application in simulator: {e}")
|
||||
|
||||
|
||||
# Usage
|
||||
current_script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
project_path = os.path.join(current_script_dir, "Playground.xcodeproj")
|
||||
scheme_name = "Playground"
|
||||
simulator_name = "iPhone 15"
|
||||
destination = f"platform=iOS Simulator,name={simulator_name},OS=latest"
|
||||
|
||||
if __name__ == "__main__":
|
||||
build_and_run_xcode_project(project_path, scheme_name, destination)
|
Loading…
x
Reference in New Issue
Block a user