Auto-deciding simulator vs device script for iOS simulators in React Native
A simple Bash script that combines instruments and xcrun from Xcode's CLI Tools to see if an USB device is attached, and fallback to run it via the Simulator if none is attached.
# Get a list of available USB attached devices, provide --simulator to also output available sims
function list_ios_devices() {
echo -e "\033[0;32mAvailable devices (USB):\033[0m"
instruments -s devices | grep -v Simulator | grep -v Mac | grep -v "Known Devices:"
if [ "$1" == "--simulators" ]; then
echo ""
echo -e "\033[0;32mAvailable simulators:\033[0m"
xcrun simctl list | grep iPhone | sed 's/Phone://' | sed 's/(.*)//' | sort -u | awk '{$1=$1};1' | uniq -u
fi
}
# Requires ios-deploy from npm and xcrun from Xcode dev toolchain. Can dynamically decide which scheme to use. Will automatically grab the connected USB device from `instruments`
function run_ios() {
if ! command -v ios-deploy > /dev/null; then
echo "ios-deploy is required but was not found."
echo "Please follow the instructions to install ios-deploy:"
echo " → https://github.com/ios-control/ios-deploy#readme"
exit 1
fi
if ! command -v xcrun > /dev/null; then
echo "xcrun is required but was not found.";
echo "Please make sure latest Xcode is installed and you have the xcode CLI tools by running:"
echo " $ xcode-select --install"
exit 1
fi
local scheme
local device
device=$(list_ios_devices "$@" | tail -1)
case "$1" in
debug)
scheme="(Dev)"
;;
client)
scheme="(Client)"
;;
rc)
scheme="(Release)"
;;
release)
scheme="(AppStore)"
;;
*)
scheme="(Dev)"
;;
esac
if echo "$device" | grep -q "Available devices"; then
echo -e "\033[0;32mExecuting (Simulator): react-native run-ios --scheme \"$scheme\"\033[0m"
react-native run-ios --scheme "$scheme"
else
device=$(echo "$device" | sed 's/(.*]//;s/^ *//;s/ *$//;s/ */ /;')
echo -e "\033[0;32mExecuting (USB Device): react-native run-ios --scheme \"$scheme\" --device \"$device\"\033[0m"
react-native run-ios --scheme "$scheme" --device "$device"
fi
}Afterwards you can add it to NPM run tasks, VSCode tasks, Make …
{
"scripts": {
"ios:debug": "./run-ios.sh debug",
"ios:client": "./run-ios.sh client",
"ios:rc": "./run-ios.sh rc",
"ios:release": "./run-ios.sh release",
}
}