THERAMPAGE
THERAMPAGE
THERAMPAGE
Switch to the English version
Main   |   Blog   |   EngRead   |   Dragon: The Eater   |   Rampage CMS
Директория iOS приложения в запущенного в симуляторе
Бывает, что нужно посмотреть, как там дела у приложения на диске.
Какие файлы хранятся, сколько места занимают и т.д.
И как это сделать, не так чтобы очевидно.
 
Первый и самый простой способ это, пожалуй, добавить куда-нибудь в приложение строку: 
print("app folder path is (NSHomeDirectory())")
И затем по необходимости искать в консоли результат ее выполнения.
Вариант конечно неплохой, но довольно громоздкий: прописать, найти, скопировать, вставить...
 
Другой способ, это воспользоваться командой:
xcrun simctl get_app_container booted com.example.app data
В результате на экран будет выведен путь до нужной нам директории.
Тут тоже не самая простая команда, но это можно доработать, чем мы немного позже и займемся, а пока рассмотрим третий вариант:
 
Приложение RocketSim for Xcode Simulator [https://apps.apple.com/app/apple-store/id1504940162]
Фантастическая вещь для разработчика, добавляющая к iOS симулятору всевозможные вспомогательные функции, в том числе и возможность быстро перейти в директорию приложения.
Крайне рекомендую, но есть нюанс, только для MacOS 12.4 и выше.
 
Но вернемся к нашей команде, как можно ее улучшить.
Ну для начала поместить ее в шелл скрипт.
Затем добавить удобную возможность задавать Bundle Id, обработать полученные результаты в вывести их в удобной форме, например сразу открыв нужно нам окно. Вуаля и вот результат: 
#!/bin/sh
DEVICE_IDS="$(xcrun simctl list | grep Booted | awk -F '[()]' '{print $2}')"
while read -r line; do DEVICE_IDS_ARRAY+=("$line"); done <<<"$DEVICE_IDS"
DEVICE_NUMBER="${#DEVICE_IDS_ARRAY[@]}"
if [ "$DEVICE_NUMBER" = 1 ]; then
    DEVICE_ID=$DEVICE_IDS
else
    DEVICE_NAMES="$(xcrun simctl list | grep Booted | awk -F '[()]' '{print $1}')"
    while read -r line; do DEVICE_NAMES_ARRAY+=("$line"); done <<<"$DEVICE_NAMES"
    i=0
    for element in "${DEVICE_NAMES_ARRAY[@]}"
    do
        i=$((i+1))
        echo "$i) $element"
    done
    read -p "Choose which one: " DEVICE_POSITION
    DEVICE_ID=${DEVICE_IDS_ARRAY[DEVICE_POSITION-1]}
fi
echo "DEVICE_ID: ${DEVICE_ID}"
if [ -z "${DEVICE_ID}" ]; then
    echo "No running simulators have been found"
    exit 1
fi
getopts ":fFtT" CHOICE;
shift $((OPTIND - 1))
APP_NAME=$1
if [ -z "${APP_NAME}" ]; then
    read -p "Enter some part of an app budle id: " APP_NAME
fi
echo "APP_NAME: ${APP_NAME}"
APP_PATH=~/Library/Developer/CoreSimulator/Devices/$DEVICE_ID/data/Containers/Data/Application
echo "APP_PATH: ${APP_PATH}"
cd $APP_PATH
APP_ID=$(find . -iname *$APP_NAME* | head -n 1 | awk -F '/' '{print $2}')
echo "APP_ID: ${APP_ID}"
if [ -z "${APP_ID}" ]; then
    echo "Unable to find an app which bundle id contains '$APP_NAME'"
    exit 1
fi
echo "The path is:\n\n$APP_PATH/$APP_ID\n"
if [ -z "${CHOICE}" ] || [ "$CHOICE" = "?" ]; then
    read -p "Open [T]erminal or [F]inder window?: " CHOICE
fi
if [ "$CHOICE" = "T" ] || [ "$CHOICE" = "t" ]; then
    open -a Terminal "$APP_PATH/$APP_ID"
fi
if [ "$CHOICE" = "F" ] || [ "$CHOICE" = "f" ]; then
    open "$APP_PATH/$APP_ID"
fi
 
Скачать файл openSimDir.sh