«Pattern of unusual behavior»: як я пройшов реджект 5.6 з першим iOS-застосунком

💡 Усі статті, обговорення, новини про Mobile — в одному місці. Приєднуйтесь до Mobile спільноти!

Всім привіт. Мене звати Дмитро, і я соло-розробник iOS-застосунків. Ця стаття для тих, хто в шоці від процесу App Review, або для тих, кому його ще тільки належить пройти. Поділюсь досвідом своїх реджектів і тим, що я з ними робив.

Історія розробки самого застосунку буде в окремому пості, тут буде саме про рев’ю від команди Apple. Це був мій перший особистий проєкт (не рахуючи робочих релізів), тому і відчувався він зовсім інакше.

Перший реджект: 5.6 за чотири години

12 серпня 2026 року я відправив на рев’ю перший білд свого застосунку і вже сподівався наступного ранку прокинутись доларовим мільйонером: усі його скачають і заплатять трошки дєняк.

Але реальність виявилась іншою, і приблизно за 4 години я отримав реджект за пунктом 5.6 (Developer Code of Conduct). Формулювання англійською:

«pattern of unusual behavior», «commonly associated with fraudulent activity», «features that appear to have been intentionally hidden during the review process»

Конкретики — нуль. Яка саме фіча, де і що не так, не сказано.

Ну я напрягся: думаю, як це я такий білий і красивий, а мені такі погані слова пишуть. Пішов розбиратись, що я там відправив на рев’ю.

Поліз у Supabase і бачу, що застосунок навіть ніхто не відкривав: за весь час рев’ю в логах бази жодного запиту. Тому розумію, що проблема в метаданих або в бінарнику, і реджект я отримав, по суті, автоматом.

Що я знайшов

  1. У релізній збірці лежали Configuration.storekit і *.xcconfig. Причина банальна: у Xcode 16 синхронізовані групи, і все, що лежить у папці таргета, їде в бандл, а в membershipExceptions у мене був лише Info.plist. У storekit-файлі було 12 продуктів, а на рев’ю я подав 5. І всі 12 ідентифікаторів ще й були захардкоджені в коді)))
  2. Виявилось, що я забув додати 5 in-app purchases до сабмішена. Ну, якби вже нормальний такий провтик.

Для сканера це виглядало як прайс-лист прихованих фіч: файл для симуляції покупок, а в ньому продукти, яких нема на рев’ю.

Що виправив

  • Виніс .storekit і .xcconfig з таргета (або можна додати їх у membershipExceptions).
  • Прибрав із коду ідентифікатори, яких не було в App Store Connect.
  • Додав усі покупки до сабмішена.

Втрачати вже не було чого, тож я додатково пройшовся аудитом із Claude. Він мені сказав, що механіка розблокування контенту за шер у сторіс не дуже якісна і від неї варто відмовитись (це ризик за пунктом 3.2.2). Ну хто я такий, щоб не слухатись ШІ :D

Після таких переживань написав невеликий скрипт, який перевіряє бінарник перед аплоадом. Спрощена версія нижче:

APP="path/to/YourApp.app"   # з архіву: …xcarchive/Products/Applications/

# 1. dev-файлів у бандлі бути не повинно
find "$APP" \( -name '*.storekit' -o -name '*.xcconfig' \) -print

# 2. ідентифікатори продуктів у бінарнику, звірити з тим, що подано в ASC
strings "$APP/YourApp" | grep -o 'com\.yourapp\.[A-Za-z0-9_.]*' | sort -u

# 3. слова, яких у релізі бути не повинно
strings "$APP/YourApp" | grep -i -E 'spicy|debug'

Важливо проганяти його саме по архіву, а не по дебаг-збірці.

2.1: відео та опис

Відправив новий білд, але тупанув і випадково видалив тред із реджектом 5.6 (прибрав версію зі старого сабмішена, і той закрився як Removed). Потім мені це ще відгукнеться)

Наступного дня прийшов уже звичайний реджект 2.1 з проханням надати додаткову інформацію: 8 питань про застосунок, опис екранів і функціоналу та відео з реального телефона. Я відправив усе з медіафайлами й описом. Порада: записуйте відео з TestFlight, а не з Xcode. З Xcode покупки підуть через локальний storekit-конфіг і на відео просто не спрацюють.

Орієнтовно 2 тижні застосунок був на перевірці.

Десь тоді я натрапив на таку інформацію. Це з матеріалів суду Epic проти Apple (2021 рік), тож цифри вже не нові, але чомусь у це легко віриться:

Щотижня в App Store надходить у середньому близько 100 000 сабмітів, і перевіряють їх приблизно 500 рев’юерів. На один застосунок у середньому витрачають від 6 до 12 хвилин.

Кількість застосунків у сторі росте, бідні тестери вже не витримують)

Другий 5.6

Потім прийшов повторний реджект 5.6, і знову за логами мій застосунок навіть не відкривали. Тут і відгукнувся той видалений тред: на перший реджект я так і не відповів, і з боку Apple це виглядало так, ніби я мовчу і просто шлю нові білди.

Цього разу я не створював новий білд, а написав у Resolution Center, що проблеми з першого рев’ю вже виправлені в білді № 2, і пояснив, що саме знайшов і виправив.

28 серпня Apple відповіли, що питання закрите, і попросили надіслати новий білд. 10 вересня застосунок вийшов в App Store.

Що б я порадив тим, хто тільки готується до сабміту

  1. Розпакуйте свій .ipa перед відправкою. Реально відкрийте архів і подивіться, що там лежить. Я був впевнений, що там тільки код і картинки, а там сидів тестовий storekit.
  2. Звірте продукти в трьох місцях: у коді, в App Store Connect і в самому сабмішені. У мене було 12, 5 і 0. Ні, я не жартую.
  3. Не анонсуйте те, чого ще нема в сторі. Навіть якщо дуже хочеться похвалитись майбутнім паком.
  4. Не видаляйте версію зі старого сабмішена. Разом з нею зникає тред з реджектом, і Apple бачить, що ви просто мовчите.
  5. Спочатку відповідайте в Resolution Center, а потім шліть білд. Мені саме лист, а не новий білд, закрив 5.6.
  6. У Review Notes не пишіть «never» і «nothing else». Якщо в застосунку є хоч щось динамічне, вас на цьому зловлять. Краще чесно описати, що і коли змінюється.
  7. Відео для рев’ю пишіть з TestFlight. З Xcode покупки підуть через локальний конфіг і на відео не спрацюють.

Висновок

Коли прийшов перший 5.6, я реально думав, що це кінець і акаунт зараз заблокують. А по факту все виявилось доволі приземлено: у бінарнику лежав зайвий файл, покупки я не прикріпив, а потім ще й сам заплутав листування, видаливши тред.

Apple нормально відповідають, якщо писати коротко і по суті: що знайшли, що виправили, де це подивитись. Головне не панікувати і не слати білд за білдом у надії, що наступного разу пропустять.

Тепер у мене перед кожним сабмітом скрипт і чекліст, і наступні релізи вже не такі страшні.

Що далі

Може, щось і забув, але застосунок уже в сторі. Тепер нова проблема: написати щось це 1% справи, а от як це все продати. Ну, поки вірю, що завтра прокинусь, а багаті омериканці скачають його 10010101 разів і куплять по паку)

👍ПодобаєтьсяСподобалось1
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter