Запускаем iOS приложения из консоли на девайсе и симуляторе
В статье будет кратко описано, как собрать приложение консольными командами и запустить на реальном девайсе и симуляторе без какой-либо надобности открывать xcode для этого.
В общем, стоит начать с того, что в моей компании имеется отдел ios разработки в составе > 10 человек, которые работают над пачкой приложений. Для автоматизации рутинной работы нам пришлось развернуть CI сервер (пока самописный, ввиду особых исторических причин (ну как у всех), планируется миграция на jenkins). К рутинным вещам я отношу — сборку проектов, запуск тестов (если, конечно, вы их пишете), создание ипашек для тестеров и для выкладки в app store. В общем, хотелось чтобы по нажатию кнопочки или по хуку в гите всё это начинало работать. Пока у нас всё работает по нажатию кнопки разработчиком, про гит пока только в планах. В данной статье я только затрону тему компиляции проекта и упаковку его в ipa файла. Функционал запуска проектов на девайсах на стороне CI сервера еще находится в стадии разработки, а вот сам процесс упаковки уже давно в «бою», может кому пригодиться.
Перед компиляцией проекта необходимо установить apple doc generator github.com/tomaz/appledoc (там есть описание как установить).
Переходим к скаченному проекту. Корневой проект представляет собой сам ResearchKit framework, само тестовое приложение находится в другом месте, переходим туда:
Пробуем компилировать приложение. Собираем под симулятор, так как для сборки проекта под симулятор не нужны сертификаты/провижен файлы.
Билд падает, так как нет схемы ORKCatalog. Так как схема в оригинальном проекте не была помечена как shared, то после “слива” из гита, xcode еще ничего не знает об этой схеме, чтобы он ее снегирил, нужно просто открыть проект. Поэтому просто открываем проект:
После видим долгожданное ** BUILD SUCCEEDED **. Отлично, всё работает.
Запускаем проект на симуляторе
Компилируем под симулятор, архитектуры могут быть i386/x86_64. Через SYMROOT задаем путь результата сборки:
(Мысли вслух: когда писал статью, компиляция в режиме Release работала, перед публикацией статьи еще раз проверил все шаги и компиляция в этом режиме перестала работать, поэтому собираем в Debug, какие-то из последних коммитов это сломали.)
После успешной сборки мы получили ORKCatalog.app файл в build/Debug-iphonesimulator/. Осталось запустить это на симуляторе. Для этого будем использовать ios-sim утилиту github.com/phonegap/ios-sim. Пользоваться ей достаточно просто.
Получаем список доступных симуляторов:
Из предложенного списка я выбрал ‘iPhone-6-Plus’. Запускаем приложение на нем:
Если всё правильно сделали, то должен запуститься симулятор с приложением (для входа в режим ввода в консоли используйте ctrl + C).
Создание ipa файла и запуск на реальном девайсе
Тут немного сложнее, нам нужен mobileprovision файл для разработки (developer) и наличие сертификата на машине (p12 файл), при этом наличие аккаунта в xcode не нужно. При подписании/упаковки приложений из консоли нет необходимости добавлять аккаунт в xcode, это очень помогает, например, на CI сервере можно держать только p12 файлы.
Будем считать, что на вашей машине есть соответствующий сертификат. После генерируем developer mobileprovision через developer.apple.com в вашем аккаунте и скачиваем на машину (дадим ему название test.mobileprovision, а bundle id будет ru.habrahabr.test). После копируем его в директорию, где его сможет подхватить xcode:
Собираем архив под девайс (это архитектуры arm64/armv7):
Компиляция упадет, так как мы еще не прописали в приложении свой bundle id и не прилинковали mobileprovision, ошибка будет такого вида:
Будем передавать bundle id из консоли + нужно прописать его в Info.plist файле. Также через консоль будем передавать линк на наш mobileprovision. Plist файл находим по пути ORKCatalog/Supporting Files/Info.plist, в котором для ключа CFBundleIdentifier выставляем значение ru.habrahabr.test. Bundle id передаем через ключ со значением нашего ид PRODUCT_BUNDLE_IDENTIFIER=ru.habrahabr.test. Линк на mobileprovision передаем через ключ PROVISIONIG_PROFILE, со значние UUID, который прописан в mobileprovision.
Значение будет подобно 87b0df89-793a-4a0f-92bf-c5f9c35f1405. Снова собираем:
В итоге получим архив build/archive.xcarchive, который осталось упаковать в ipa. В xcode 7 появился новый метод упаковки, им и воспользуемся. Перед этим создадим конфиг файл options.plist с таким содержанием:
Пробуем собирать ipa:
Сборка падает, по логам можно понять, что что-то с entitlements:
По ошибке ясно, что приложение подписываем entitlements, значения в котором не соответствуют значениям в нашем mobileprovision, а именно com.apple.developer.healthkit. Ищем причину. Смотрим каким entitlements подписано приложение:
Видим, что всё ок, за исключением этого:
У нас в mobileprovision нет этой опции, нужно выяснить, откуда это взялось:
Поиск нам выдал ORKCatalog/Supporitng Files/ORKCatalog.entitlements. Смотрим что внутри:
Там только одно значение:
По логике нужно перезаводить mobileprovision, в который нужно добавить это значение, но мы ленивые и для теста это не обязательно, нам нужно просто переподписать приложение с entitlements без этого значения.
У нас есть как минимум два варианта:
1. Просто редактируем существующий entitlements (ORKCatalog/Supporitng Files/ORKCatalog.entitlements) и снова пересобираем (через archive).
2. Без пересборки, сами переподпишем ORKCatalog.app с нужным entitlements.
Выберем первый вариант как более простой. Поэтому из файла ORKCatalog/Supporitng Files/ORKCatalog.entitlements просто удаляем строки:
и снова пересобираем архив:
Видим долгожданное сообщение ** EXPORT SUCCEEDED **. Под build/dev-ipa/ появиться ipa файл, который будем устанавливать на девайс. Устанавливать на девайс будем с помощью ios-deploy github.com/phonegap/ios-deploy. Цепляем девайс к машине, получаем id девайса через:
Собираем ipa файл для маркета
Без использования xcode смогли собрать ipa файлы для тестов и на выкладку в app store. Всё это можно легко автоматизировать на CI сервере чтобы облегчить жизнь разработчикам.
iPhone won’t connect to Xcode over WiFi
Just starting to learn Xcode and I can test the first chapter’s app on my iPhone if it’s conncted via USB-C. The book walks me through the part where I can allow Xcode to connect to the iPhone via WiFi, just checking «Connect via Network.»
Yet Xcode cannot find my phone unless it’s connected via USB. When I go to Devices that checkbox stays checked, unless I unplug the phone it which case that box doesn’t even appear.
And yes, they are both on the same WiFi, it’s the only one I have and it’s up and running.
Answers
>The book walks me through the part where I can allow Xcode to connect to the iPhone via WiFi, just checking «Connect via Network.»
Do you have a paid Developer Program account or are you working with Xcode’s free provisioning? Just curious.
In the mean time, via Xcode 11.4.1:
We have some network debugging information in this Xcode help article.
In the end it comes down to rebooting one or both devices (Mac and iPhone). But in the end I have to keep doing it, at least twice today. Wish I could find what’s causing this to happen.
Find the Console application in the Utilities folder, run it and browse system and/or networking logs during live testing.
I cleared the system log (for the system, not user), plugged my iPhone in via USB, made sure Connect via Network was checked, unplugged the iPhone (and the iPhone disappeared.
Below is what was in the system log. But this is more than my knowledge. Am going to see if Xcode can help me, but thought you might be able to spot the problem. Starting at the 32 second is when I pulled out the USB cable.
May 19 22:15:10 Sergios-MacBook-Pro MobileDeviceUpdater[1069]: Entered:_AMMuxedVersion2DeviceConnected, mux-device:43
May 19 22:15:10 Sergios-MacBook-Pro AMPDeviceDiscoveryAgent[399]: Entered:_AMMuxedVersion2DeviceConnected, mux-device:43
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class PDFToRasterImageRef is implemented in both /System/Library/PrivateFrameworks/AMPLibrary.framework/Versions/A/AMPLibrary and /System/Library/PrivateFrameworks/AMPDevices.framework/Versions/A/Support/AMPDevicesAgent. One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class AMPArtworkSourceInfo is implemented in both /System/Library/PrivateFrameworks/AMPLibrary.framework/Versions/A/AMPLibrary and /System/Library/PrivateFrameworks/AMPDevices.framework/Versions/A/Support/AMPDevicesAgent. One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class AMPLibraryClientEventsXPCObject is implemented in both /System/Library/PrivateFrameworks/AMPLibrary.framework/Versions/A/AMPLibrary and /System/Library/PrivateFrameworks/AMPDevices.framework/Versions/A/Support/AMPDevicesAgent. One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class AMPLClient is implemented in both /System/Library/PrivateFrameworks/AMPLibrary.framework/Versions/A/AMPLibrary and /System/Library/PrivateFrameworks/AMPDevices.framework/Versions/A/Support/AMPDevicesAgent. One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class AMPLFrameworkClient is implemented in both /System/Library/PrivateFrameworks/AMPLibrary.framework/Versions/A/AMPLibrary and /System/Library/PrivateFrameworks/AMPDevices.framework/Versions/A/Support/AMPDevicesAgent. One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class AMPLMediaAppClient is implemented in both /System/Library/PrivateFrameworks/AMPLibrary.framework/Versions/A/AMPLibrary and /System/Library/PrivateFrameworks/AMPDevices.framework/Versions/A/Support/AMPDevicesAgent. One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class AMPLSharingClient is implemented in both /System/Library/PrivateFrameworks/AMPLibrary.framework/Versions/A/AMPLibrary and /System/Library/PrivateFrameworks/AMPDevices.framework/Versions/A/Support/AMPDevicesAgent. One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class asn1ReceiptToken is implemented in both /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore (0x7fff8ca69a08) and /System/Library/PrivateFrameworks/CoreFP.framework/Versions/A/CoreFP (0x111bb52a8). One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class ISPurchaseReceipt is implemented in both /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore (0x7fff8ca69990) and /System/Library/PrivateFrameworks/CoreFP.framework/Versions/A/CoreFP (0x111bb52f8). One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class asn1Token is implemented in both /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore (0x7fff8ca69a80) and /System/Library/PrivateFrameworks/CoreFP.framework/Versions/A/CoreFP (0x111bb5348). One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class asn1SetToken is implemented in both /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore (0x7fff8ca69a58) and /System/Library/PrivateFrameworks/CoreFP.framework/Versions/A/CoreFP (0x111bb5370). One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class asn1SequenceToken is implemented in both /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore (0x7fff8ca69a30) and /System/Library/PrivateFrameworks/CoreFP.framework/Versions/A/CoreFP (0x111bb5398). One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class asn1IntegerToken is implemented in both /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore (0x7fff8ca699b8) and /System/Library/PrivateFrameworks/CoreFP.framework/Versions/A/CoreFP (0x111bb53c0). One of the two will be used. Which one is undefined.
May 19 22:15:10 Sergios-MacBook-Pro AMPDevicesAgent[1130]: objc[1130]: Class asn1OSToken is implemented in both /System/Library/PrivateFrameworks/CommerceKit.framework/Versions/A/Frameworks/CommerceCore.framework/Versions/A/CommerceCore (0x7fff8ca699e0) and /System/Library/PrivateFrameworks/CoreFP.framework/Versions/A/CoreFP (0x111bb53e8). One of the two will be used. Which one is undefined.
May 19 22:15:11 Sergios-MacBook-Pro com.apple.xpc.launchd[1] (com.apple.xpc.launchd.domain.pid.AMPDevicesAgent.1130): Failed to bootstrap path: path = /System/Library/PrivateFrameworks/AMPDevices.framework/Versions/A/Support/AMPDevicesAgent, error = 2: No such file or directory
May 19 22:15:11 Sergios-MacBook-Pro AMPDevicesAgent[1130]: Entered:_AMMuxedVersion2DeviceConnected, mux-device:43
May 19 22:15:32 Sergios-MacBook-Pro AMPDevicesAgent[1130]: Entered:_AMMuxedDeviceDisconnected, mux-device:43
May 19 22:15:32 Sergios-MacBook-Pro MobileDeviceUpdater[1069]: Entered:_AMMuxedDeviceDisconnected, mux-device:43
May 19 22:15:32 Sergios-MacBook-Pro AMPDevicesAgent[1130]: Entered:__thr_AMMuxedDeviceDisconnected, mux-device:43
May 19 22:15:32 Sergios-MacBook-Pro MobileDeviceUpdater[1069]: Entered:__thr_AMMuxedDeviceDisconnected, mux-device:43
May 19 22:15:32 Sergios-MacBook-Pro AMPDeviceDiscoveryAgent[399]: Entered:_AMMuxedDeviceDisconnected, mux-device:43
May 19 22:15:32 Sergios-MacBook-Pro AMPDeviceDiscoveryAgent[399]: Entered:__thr_AMMuxedDeviceDisconnected, mux-device:43
Как вы выполняете беспроводную отладку в Xcode 9 с iOS 11, Apple TV 4K и т. д.?
беспроводная отладка была недавно добавлена в качестве функции в Xcode 9, iOS 11 и tvOS 11. Apple TV 4K не имеет USB-порта, поэтому требуется беспроводная отладка. Как вы выполняете эту беспроводную отладку в Xcode?
15 ответов
настройка устройства для отладки сети
Примечание: система Mac и iPhone / iPad должны использовать одну и ту же сеть для использования беспроводной отладки.
отладка приложения, работающего на устройстве iOS или tvOS через WiFi или другое сетевое соединение.
Примечание: сеть отладки требуется Xcode 9.0 или более поздней версии работает на macOS 10.12.4 или более поздней версии, и на устройстве, требуется iOS 11.0 или более поздней или tvOS 11.0 или более поздней.
шаги по настройке iPhone, iPad или iPod touch
выберите Окно > устройства и симуляторы, затем в появившемся окне щелкните устройства.
подключите устройство к компьютеру Mac с помощью кабеля Lightning.
в левом столбце выберите устройство, а в области сведений выберите подключение по сети.
в Xcode пары с вашим устройством. Если Xcode может подключиться к устройству по сети, рядом с устройством в левом столбце появится значок сети.
Примечание.: Устройство требует код доступа для включения удаленной отладки.
теперь вы готовы к отладке по сети.
шаги по настройке Apple TV:
убедитесь, что ваш Mac и Apple TV находятся в одной сети.
выберите Окно > устройства и симуляторы, затем в появившемся окне щелкните устройства.
на Apple TV откройте приложение Настройки и выберите пульты и устройства > удаленное приложение и устройства.
Apple TV ищет возможные устройства, включая Mac. (Если у вас есть брандмауэр или интернет-безопасность, отключите/выключите, чтобы разрешить поиск.)
на компьютере Mac выберите Apple TV на панели устройства. На панели Apple TV отображается текущее состояние запроса на подключение.
введите код проверки, отображаемый на AppleTV в области окна устройства для устройства и нажмите кнопку Подключить.
Xcode настраивает Apple TV для беспроводной отладки и сопряжения с устройством.
Если вы выполнили все шаги дано Surjeet и все еще не получая значок сетевого подключения, затем выполните следующие действия:
Unpair устройство с помощью правой кнопки мыши на устройстве из подключено.
нажать на кнопку «+» кнопка с конца левой стороны всплывающий.
теперь вы можете увидеть значок сетевого подключения после имени устройства. Наслаждайтесь!
Я попытался использовать окно Xcode Devices для подключения через сетевые параметры. но я не могу увидеть значок «подключен по сети» рядом с именем устройства. также, как только удалите USB, опция «подключиться через сеть» исчезла. также имя устройства отображается в списке отключенных устройств.
но с помощью » Connect via IP Address. «вариант,я могу подключиться.
условие
активация
подключите устройство iOS к компьютеру Mac с помощью кабеля.
выбрал устройства сегмент и выбрал нужное устройство из левого списка устройств.
с правой стороны вы можете видеть open подключиться через сеть, включите эту опцию, как показано в прикрепленном изображении.
после нескольких секунд вы можете увидеть знак сети перед вами устройство.
отключить устройство и использовать отладку, как вы обычно используете.
Если после шаги, описанные Surjeet вы все еще не можете подключиться, попробуйте выключить и снова включить Wi-Fi вашего компьютера. Это сработало для меня.
сетевая отладка требует Xcode 9.0 или более поздней версии, запущенной на macOS 10.12.4 или поздно, и на устройстве, требуется iOS 11.0 или более поздней версии, или tvOS 11.0 или поздно.
iPhone
iOS 11 не будет доступен для 32-битных устройств, т. е. iPhone 5 и iPhone 5c и ниже. Первый 64-битный iPhone-5s.
для iPad
iPad mini 2 будет самым старым iPad с iOS 11 поддержка.
iPod
iPod должен быть iPod 6, чтобы иметь возможность запускать iOS.
в новой xcode9-beta мы можем использовать беспроводные отладки как сказал Apple:
вырезать кабель
Выберите любое из устройств iOS или tvOS в локальной сети для установки, запуска и отладки приложений – без USB-кабеля, подключенного к компьютеру Mac. Просто нажмите ‘подключение по Сети’ флажок при первом использовании нового устройства iOS, и это устройство будет доступно по сети с этого момента вперед. Беспроводная разработка также работает в других приложениях, включая инструменты, инспектор доступности, Quicktime Player и консоль.
Если перед отключением вопросы, попробуйте это:
решение: включить режим полета на вашем устройстве в течение 10 секунд, а затем отключить режим полета, чтобы восстановить связь
Я только что говорил с некоторыми инженерами Xcode в WWDC, и автоматическое обнаружение iDevices все еще немного глючит. Также иногда ваш телефон неправильно вещает. Включение и выключение устройства может помочь.
есть несколько обходных путей/откаты:
в качестве резервного вы можете подключиться к устройству, вручную введя IP-адрес (щелкните правой кнопкой мыши на устройствах в окне устройства). Однако этот IP-адрес будет сохранен, поэтому, если вы измените сети, вам нужно будет сбросить это. Эта опция пока недоступна в Xcode, но вы можете сделать это через терминал со следующей командой:
это напечатает идентификатор, который вам нужно использовать в следующем команда:
теперь ip-адрес очищается, и вы можете ввести новый.
последний вариант-создать сеть «компьютер-компьютер». Это работает нормально,но логически у вас не будет доступа в интернет.
Я выполнил все предложенные шаги, в частности те, которые предоставлены из ios_dev, но мой iPhone не был распознан из Xcode, и я не смог отладить через WiFi. Щелкните правой кнопкой мыши на левой панели над моим iDevice в окне» устройства и симуляторы», затем » подключиться через IP-адрес. «, вставил iPhone IP и теперь он правильно работает
Xcode ► Окно ► Устройства и симуляторы ► выберите вкладку Устройства ► нажмите кнопку Подключить через сеть
моя проблема заключалась в сетевом вещании SSID.
Я пробовал все решения выше, но все еще не мог подключить свое устройство, не было никакого значка «глобус» для моего устройства вообще. Затем я обнаружил, что по какой-то причине моя сеть отключила трансляцию SSID(tho я все еще мог подключить сеть, введя SSID вручную). Как только я включил трансляцию SSID, я мог подключить свое устройство через » Connect via IP Address. ‘.
Я попробовал все ответы, но ничего не работало для меня. Я закончил подключение к другой сети WiFi, тогда я смог отлаживать беспроводную связь.
Я понятия не имею, почему он не работает со старой сети
единственный способ заставить его работать, если мой Mac и мой iPhone были на разные сетей. У меня есть основной DSL-модем, который называет его network1, а второй network2 устанавливает нам точку доступа. У них есть SSIDs network1 и network2. Если телефон был на network1 и mac на network2, он будет работать, или наоборот. Но если бы оба были в network1 или оба были в network2, это было бы не работа.
Как начать разрабатывать под iOS
Если мака нет, его можно конечно купить. Но можно использовать бюджетный вариант и запустить Mac OS в виртуальной машине. Я использовал вот эту сборку для VMware на довольно не мощном компьютере. Процесс установки виртуальной машины пропустим, об этом можно прочитать на самом рутрекере.
Установка Xcode
После запуска мака, нужно установить среду разработки Xcode. Для этого заходим в AppStore, находим поиском Xcode и устанавливаем. Он бесплатный.
Patch Xcode
Необходимо пропатчить сам Xcode и каждый проект который вы хотите протестировать на вашем айфоне или айпаде. Для этого, качаем JailCoder и запускаем.
И вот, вы сделали свой первый проект «Hello, world!» и готовы запустить его на вашем новеньком айпаде. Если ваше устройство не взломано (jailbreak), то сделать это не получится. Я делал jailbreak по этой инструкции и всё получилось. Если же устройство взломано, то компилируем проект и забираем файл *.app.
Осталось запустить iTunes, подключить устройство к компьютеру, перетащить новый *.app файл в окно iTunes и синхронизироваться.
Вот так можно сэкономить немного денег на покупке мака, сертификата и начать программировать под iOS.
















