Наприклад, мені знадобилося додати стікери для iMessage в нашу гру. І все б нічого, але Defold не створює Xcode проект, а відразу ж збирає готовий ipa (точно так само робить Adobe AIR, наприклад). У цього є свої плюси і мінуси, але мова зараз не про це.
Отже, вихідні дані у нас такі:
- mac з xcode;
- ipa готове до відправки в AppStore;
- красиві картинки для стікерів;
- бажання зробити стікери для нашого ipa.
Для того, щоб не переробляти все по багато разів, прочитайте відразу всю статтю і тільки потім приступайте до дій.
створення стікерів
Я не буду загострювати увагу на процесі створення стікерів, тому що цих матеріалів повно в інтернеті. Розповім лише основні моменти, які варто знати в рамках нашого завдання:
- стікери підписуються тим же сертифікатом, що і основне додаток.
- ID стікерів повинен бути таким же, як і ID основного додатки + назва стікерів. Наприклад, якщо ваш додаток має ID com.mysupergame, то ID стікерів повинен бути com.mysupergame.mysuperstickers
При цьому, після основного ID повинно бути не більше однієї точки, тобто com.mysupergame.mysuperstickers.pack вже видасть помилку. - версія стікерів повинна збігатися з версією основного додатка. Це не критично, але допоможе уникнути зайвих warning'ов від Apple;
- стікери підтримуються з iOS 10, тому MinimumOSVersion повинен бути мінімум 10.0 (в Xcode цей параметр називається Deployment Target). Але для основного додатки можна залишити ту версію, що вам потрібна.
- створюю новий додаток в xcode;
- вибираю для нього сертифікат і провіжен, як у основого додатки вручну;
- додаю до проекту новий target стікерів (думаю, можна відразу створити проект стікерів, але я не перевіряв);
- для стікерів вручну вибираю той же сертифікат, що і у основного додатки і спеціально створений для стікерів провіжен (для завантаження в стор, а не для розробки);
- виставляю версії такі ж як і у основного додатка;
- Deployment Target всюди 10.0;
- створюю архів додатки Product-> Archive;
- в записнику роблю експорт ipa для завантаження в appstore, прибравши всі зайві «галочки»;
- ipa зберігаю в папку stickers (надалі я дам команди, які будуть розраховані саме на таке розташування цього ipa).
Додавання стікерів до готового ipa
Отже, у нас є 2 ipa файлу, один зі стікерами в папці stickers і в сусідній папці ipa гри (як називаються ipa не важливо).
Відкриваємо термінал в папці game (це лише мій приклад ієрархії, в ньому важливо тільки назва папки stickers) і виконуємо наступні команди, попередньо замінивши YOUR_CERTIFICATE на сертифікат вашої програми:
Якщо ви збираєте стікери не так, як я, а у вас просто є зібраний appex зі стікерами, то після> rm -r Payload / *. App / _CodeSignature додавайте його в app в папку PlugIns і відразу переходите до підписування додатки. Це спрацює для тестування (якщо будуть девелопмент провіжен і сертифікат з прописаним пристроїв), але заллється чи в стор я не знаю.
Тепер у нас є ipa зі стікерами і ось тут, якраз, і починається все найцікавіше ...
Проблеми та їх вирішення
Якщо ви врахували всі, що я описав, то Application Loader завантажить вашу програму і навіть не видасть помилок або попереджень.
Коли я завантажував ipa, моїй радості не було меж. Але через 5 хвилин процесингу додатки вже в самому сторі я отримав лист з App Store з наступною помилкою:
Я навіть не хочу озвучувати кількість ipa, які я зібрав і завантажив в стор в спробах розібратися з цією помилкою.
А якщо ви не забули додати MessagesApplicationExtensionSupport в ваш ipa, то можливий ще й такий варіант помилки:
Invalid Messages Application Support - The files MessagesApplicationExtensionStub do not match YourApp.app/PlugIns/stickers.appex/MessagesApplicationExtensionStub. Make sure the files are correct, rebuild your app, and resubmit it. Do not apply post-processing to YourApp.app/PlugIns/stickers.appex/MessagesApplicationExtensionStub.
Цікаво, що MessagesApplicationExtensionStub зовсім гугл. І навіть немає інформації, що це за файл такой.Да і в загальному, по цих помилок інформації дуже мало в інтернеті.
Для вирішення цієї проблеми потрібно повернутися на етап збірки вихідного ipa з нашою грою і внести правки в info.plist нашого додатка (не стікерів, а саме гри). У Defold можна задати шаблон info.plist в настройках проекту (як це робиться в AIR я вже й не пам'ятаю).
Для Defold. Якщо шаблону у вас немає, то взяти його можна, скачавши останню версію bob.jar, на сайті d.defold.com. Після цього перейменувати bob.jar в bob.zip, розпакувати і пройти в com / dynamo / bob / bundle / resources / - там є шаблони для всіх платформ: AndroidManifest, info.plist і ін.
Крім того, зміни в plist можна внести і вже в зібраний ipa перед підписанням (команда> codesign -f -s «YOUR_CERTIFICATE» -entitlements Entitlements.plist).
Як я писав вище, стікери підтримуються тільки в iOS 10+, а, значить, в plist потрібно виставити як мінімум 10.0 для цього параметра:
Тепер можна заливати додаток і радіти стікери.
замість висновків
Розібратися з цією проблемою було не просто. Заради цього я навіть зареєструвався на stackoverflow, щоб задати своє перше запитання (до речі, там мені ніхто не допоміг).
Хочеться сказати спасибі розробникам Defold за допомогу (тема на форумі).
Крім цього, величезне спасибі @TheRabbitFlash за те, що допоміг зрушити з мертвої точки на початкових етапах.
Я просто розповів свій досвід, щоб простіше було згадувати, коли в наступний раз зіткнемося з подібними проблемами. Я не претендую на істину в останній інстанції і абсолютну правильність. Ви робите все на свій страх і ризик. я за це ніякої відповідальності не несу.
UPD: Дякую, Акім. Вніс уточнення про мінімальну версію програми. Вона може відрізнятися від версії стікерів і бути нижче 10.0.