Розробка розширення iMessage для iOS
iMessage-розширення — це окремий Extension target всередину iOS-додатку, який вбудовується в додаток «Повідомлення». Користувач відкриває ящик з додатками під полем введення й запускає ваш міні-інтерфейс прямо в переписці. Стикери, інтерактивні карточки, спільні ігри, передача даних через повідомлення — все це без виходу з чату.
Два режими: Sticker Pack vs MSMessagesAppViewController
Sticker Pack — найпростіший варіант. Створюється без коду: додаємо Extension target типу «Sticker Pack Application», кидаємо PNG/APNG/GIF у Stickers.xcassets. Apple сам генерує UI. Розміри: Small (100×100 pt), Regular (136×136 pt), Large (206×206 pt). APNG для анімації — до 500 КБ, GIF — до 25 МБ, але GIF небажаний через якість.
MSMessagesAppExtension — повнофункціональне розширення з UIKit/SwiftUI. Тут MSMessagesAppViewController — точка входу. Два режими відображення: Compact (знизу екрана, ≈225 pt висоти) та Expanded (майже повний екран). Перемикання через requestPresentationStyle(.expanded).
Найважливіше — MSMessage і MSMessageLayout. Це об'єкт повідомлення, який вставляється в чат. Має URL (з користувацькою схемою додатку), MSMessageTemplateLayout з зображенням, заголовком, підзаголовком. Коли одержувач тапає таке повідомлення — у нього відкривається те ж розширення (якщо встановлено) або запрошення встановити додаток.
Проблеми, які знаходять не відразу
Спільний стан між двома учасниками. Якщо хочеться передавати дані (хід гри, вибір у опитуванні), не можна використовувати UserDefaults або Keychain напряму — у одержувача інший пристрій. Дані кодуються в URL повідомлення через параметри запиту або base64 в шляху. Розмір URL обмежений — не зловживайте.
Паттерн: MSMessage.url = URL(string: "yourapp://state?data=\(encodedState)"). Одержувач парсить URL у willBecomeActive(with:).
App Group та спільний контейнер. Розширення ізольовано від основного додатку за замовчуванням. Якщо потрібно читати дані додатку в розширенні (користувацькі стикери, авторизація), налаштуємо App Group: один і той же group.com.yourapp.shared у Capabilities основного таргету та розширення. Потім UserDefaults(suiteName:) та FileManager.containerURL(forSecurityApplicationGroupIdentifier:).
MSMessagesAppViewController не підтримує всі UIKit-компоненти. UIActivityViewController всередину iMessage Extension крашиться — не можна шарити контент через системний шер. UIImagePickerController — теж ні. Для вибору зображень потрібний PHPickerViewController.
Пам'ять. Розширення працюють у строгих межах пам'яті (~100 МБ). Завантаження важких ресурсів, кешів зображень без обмеження — прямий шлях до EXC_RESOURCE краху. Використовуємо NSCache з countLimit та totalCostLimit.
Що перевіряємо при розробці
- Розширення працює коректно в compact та expanded режимі
- Повідомлення коректно декодуються у одержувача (тест з двома реальними пристроями)
- App Group налаштований якщо потрібні дані основного додатку
- Стикери правильних розмірів та форматів, анімації не перевищують ліміти
- Розширення не крашиться при отриманні повідомлення без встановленого додатку
Розклад
Sticker Pack без коду: 1–3 дні (дизайн + збірка). iMessage Extension з інтерактивними карточками: 3–5 тижнів. Мультиплеєрна гра або складний data exchange: 6–10 тижнів. Вартість розраховується після аналізу сценаріїв взаємодії.







