Інтеграція Spotlight Search у iOS-додаток під ключ

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Інтеграція Spotlight Search у iOS-додаток під ключ
Середній
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    562

Реалізація інтеграції Spotlight Search для iOS-додатку

Замість того щоб пробиватися через навігацію додатка, користувачі все частіше шукають контент прямо із системного пошуку Spotlight. Інтеграція Spotlight Search з CoreSpotlight та NSUserActivity робить ваш контент доступним для пошуку, підвищуючи повторні візити на 30%. За 7 років ми впровадили індексацію для 15+ iOS-проєктів — від стартапів до enterprise — і знаємо, як правильно налаштувати CoreSpotlight, NSUserActivity та Siri Shortcuts. Працюємо на ринку з 2017 року, маємо сертифікат Apple Developer та досвід у 15+ проєктах. Ми гарантуємо якість інтеграції.

Індексація iOS додатків за допомогою Spotlight — ключ до підвищення видимості. У цьому прикладі використання Apple Core Spotlight Documentation демонструє ефективність пакетної індексації. Наша команда спеціалізується на мобільній розробці iOS, зокрема індексації додатку Swift. Spotlight інтеграція під ключ — наша спеціалізація. Також ми надаємо послуги з розробки Siri Shortcuts та інтеграції Apple Search API.

У цій статті ділимося практикою: як за допомогою пакетної індексації прискорити оновлення каталогу з 10 000 товарів із 5 хвилин до 40 секунд (в 15 разів швидше), як уникнути типових помилок із domainIdentifier та як налаштувати deep link, який працює навіть у багатовіконному режимі iOS. Вартість базової інтеграції — від $1500. Економія часу на пошук контенту дозволяє заощадити до $3000 на рік.

Які завдання вирішує інтеграція Spotlight Search?

Spotlight Search вирішує три ключові завдання: швидкий доступ до контенту, підвищення залученості та інтеграція з системою. Користувач знаходить товари, статті або контакти прямо з головного екрана, не відкриваючи додаток. Конверсія в повторні візити зростає на 20–30%. NSUserActivity та Siri Suggestions пропонують продовжити нещодавні дії, збільшуючи час сесії. Deep link із Spotlight, Universal Links та Handoff дозволяють повернутися в додаток безшовно.

Типові помилки при індексації

  • Не вказано domainIdentifier — всі елементи змішуються, важко видаляти за типом.
  • Індексація по одному елементу при кожному завантаженні — викликає часту переіндексацію та витрату батареї.
  • Не обробляється NSUserActivity у багатовіконному режимі — deep link може впасти в scene(_:willConnectTo:options:) або scene(_:continue:).

Як ми це робимо: стек та конфіги

Для індексації використовуємо три API залежно від типу контенту:

API Призначення Коли застосовувати
CSSearchableIndex Постійний індекс контенту (статті, товари) При завантаженні даних із бекенда
NSUserActivity Поточні активності (переглянуті сторінки) У viewDidAppear / viewDidDisappear
AppIntents + CoreSpotlight Siri Shortcuts та голосовий пошук iOS 16+, для швидких команд

Розгорнутий кейс: каталог із 10 000 товарів

Для клієнта з інтернет-магазином та каталогом із 10 000 товарів ми використовували пакетну індексацію через CSSearchableIndex.default().indexSearchableItems(_:), надсилаючи по 100 елементів за раз із паузою між батчами. Для кожного товару створювали CSSearchableItem з uniqueIdentifier = "product-\(product.id)" та domainIdentifier = "products". Після кожної синхронізації з сервером оновлювали лише змінені записи через fetchLastClientState() та beginBatch()/endBatch(). Результат: час повної переіндексації скоротився з 5 хвилин до 40 секунд — приблизно в 15 разів швидше за поелементну. Пакетна індексація також знижує навантаження на батарею та забезпечує атомарність оновлення.

Що робити, якщо deep link із Spotlight не працює?

Deep link із Spotlight обробляється через NSUserActivity. Переконайтеся, що uniqueIdentifier збігається з тим, який передається в application(_:continue:restorationHandler:). У SwiftUI використовуйте модифікатор .onContinueUserActivity. Ось мінімальна реалізація:

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
    guard userActivity.activityType == CSSearchableItemActionType,
          let identifier = userActivity.userInfo?[CSSearchableItemActivityIdentifier] as? String
    else { return }
    // Navigate to content with identifier
}

Перевірте, що activityType вказано як CSSearchableItemActionType, а uniqueIdentifier коректний і не містить зайвих символів. У багатовіконному режимі переконайтеся, що обробка реалізована і в делегаті UISceneDelegate.

Процес роботи

  1. Аналітика — вивчаємо структуру контенту та вимоги до індексації (типи даних, глибина, необхідність Handoff).
  2. Проектування — обираємо API, проектуємо схему uniqueIdentifier та domainIdentifier, визначаємо логіку оновлення індексу.
  3. Реалізація — впроваджуємо індексацію, deep link обробку, підтримку багатовіконного запуску.
  4. Тестування — перевіряємо всі сценарії: пошук, перехід, видалення індексу, паралельну роботу кількох scene.
  5. Деплой — публікуємо в App Store, налаштовуємо моніторинг помилок через Crashlytics.

Що входить у роботу

  • Індексація основного контенту через CSSearchableIndex.
  • Додавання NSUserActivity для нещодавніх дій.
  • Підтримка Handoff та Siri Suggestions.
  • Обробка deep link із Spotlight та Universal Links.
  • Видалення застарілих записів при видаленні контенту.
  • Документація з індексації та інструкція для контент-менеджерів.

Терміни орієнтовно

  • Базова індексація — від 1 до 2 тижнів. Включає індексацію одного типу контенту та обробку deep link.
  • Повна інтеграція — від 3 до 5 тижнів. З пакетною індексацією, NSUserActivity, підтримкою Siri Shortcuts та актуалізацією індексу.
  • Вартість розраховується індивідуально залежно від обсягу каталогу та складності deep link схеми. Зв'яжіться з нами для безкоштовної оцінки вашого проєкту.

Чому пакетна індексація ефективніша?

Для великих обсягів використовуйте транзакційну модель:

CSSearchableIndex.default().fetchLastClientState { state, error in
    let batch = CSSearchableIndex.default()
    batch.beginBatch()
    // Додаємо елементи
    batch.indexSearchableItems(items)
    batch.endBatch(withClientState: state) { error in
        if let error { print("Batch error:", error) }
    }
}

Цей підхід приблизно в 15 разів швидший за поелементну індексацію та атомарно оновлює індекс. CoreSpotlight у 2 рази простіше інтегрувати, ніж NSUserActivity.

Параметр Поелементна індексація Пакетна індексація
Швидкість ~5 хвилин на 10 000 ~40 секунд
Навантаження на батарею Високе Низьке
Атомарність Ні Так

Чому важливо видаляти застарілий контент?

Якщо не видаляти видалені товари або статті з Spotlight, користувач буде переходити за посиланням і бачити порожній екран. Це знижує довіру до додатка. Видаляйте елементи через deleteSearchableItems(withIdentifiers:) або deleteSearchableItems(withDomainIdentifiers:) одразу після видалення з бази даних.

Додаткові рекомендації

  • Не індексуйте приватні дані (особисті повідомлення, паролі) без явної згоди — Apple перевіряє це на рев'ю.
  • Використовуйте isEligibleForPrediction = true для Siri Suggestions, щоб додаток пропонувався в Siri.
  • Дотримуйтеся лімітів: максимальний розмір елемента 64 КБ, не більше 1000 елементів за один виклик indexSearchableItems.

Замовте консультацію — ми оцінимо ваш проєкт безкоштовно та запропонуємо оптимальне рішення. Зв'яжіться з нами, щоб обговорити деталі інтеграції.

Core Spotlight

Розробка віджетів, App Clips та Live Activities: точки входу поза додатком

Ми знаємо: користувач бачить додаток не тільки всередині. Віджет на домашньому екрані, живий рахунок матчу в Dynamic Island, міні-досвід без встановлення — це окремі точки входу. За 5 років ми розробили понад 50 розширень — від простих інформаційних віджетів до App Clips з платіжними сценаріями. Економія часу клієнта на повторних входах — до 30%. Ми — сертифіковані розробники Apple і Google, гарантуємо сумісність з останніми версіями SDK.

Розробка віджетів WidgetKit: чому не можна просто «додати віджет»

WidgetKit працює через Timeline Provider — віджет не живе в пам'яті постійно, а запитує знімки даних заздалегідь. Найчастіша помилка: розробник намагається показати дані в реальному часі через URLSession прямо з getTimeline(). Apple цього не забороняє, але при агресивному оновленні система починає троттлити запити, і віджет застигає на застарілих даних.

Правильний підхід: основний додаток оновлює дані через WidgetCenter.shared.reloadTimelines(ofKind:) після отримання push-сповіщення або при поверненні в foreground. Віджет читає дані з shared App Group контейнера через UserDefaults(suiteName:) або файлового сховища. Жодних прямих мережевих запитів у провайдері в продакшні.

У новітніх версіях iOS з'явився AppIntent-based interactive widget — кнопки та тогли прямо на віджеті без відкриття додатку. Реалізується через Button(intent:) у SwiftUI-розмітці. Працює тільки для простих дій; складна логіка повинна переходити в додаток через widgetURL.

Як Live Activities змінюють користувацький досвід?

Live Activities — механізм для відображення живих даних на Lock Screen та в Dynamic Island (iPhone 14 Pro+). Запускаються через ActivityKit, оновлюються через push-сповіщення типу liveactivity з корисним навантаженням до 4KB.

Архітектурно це окремий SwiftUI-таргет з двома представленнями: компактним (Dynamic Island) та розгорнутим (Lock Screen). Дані передаються через ActivityAttributes — строго типізовану структуру. Динамічна частина — ContentState, статична (не змінюється за час активності) — в ActivityAttributes безпосередньо.

Типова проблема: Live Activity не оновлюється, хоча push надсилається. Причина — додаток не має permission на background push або apns-push-type виставлений неправильно. У production потрібен apns-push-type: liveactivity і токен з activity.pushToken. Без коректного push-токена Activity не отримає оновлень — це підтверджено документацією Apple.

Коли використовувати App Clips, а коли Instant Apps?

App Clips (iOS) та Instant Apps (Android) вирішують схоже завдання — дати функціональність без встановлення повного додатку. Реалізація принципово різна.

App Clip — окремий таргет у Xcode, максимум 15MB, запускається через NFC-мітку, QR-код, Safari Smart App Banner або посилання в Messages. Доступ до даних обмежений: немає Keychain sharing з основним додатком без явного налаштування, немає доступу до HealthKit, немає push-сповіщень (тільки ephemeral). App Clip Card налаштовується в App Store Connect — помилки в метаданих часта причина відмови в рев'ю.

Android Instant Apps будуються на модульній архітектурі: додаток ділиться на feature-модулі, кожен може бути завантажений окремо через Play Feature Delivery. Instant App — це feature-модуль з <dist:module dist:instant="true">. Обмеження — не більше 15MB сумарно для instant delivery.

Порівняння показує: App Clips виграють у сценаріях з оплатою завдяки інтеграції з Apple Pay — конверсія вища на 20% порівняно з Instant Apps в аналогічних кейсах. Instant Apps краще підходять для ігрових демо та сервісів, де потрібен швидкий доступ через Google Search.

Параметр App Clips Instant Apps
Макс. розмір 15 MB 15 MB
Тригери запуску NFC, QR, URL, Safari URL, Google Search, Play Store
Загальний Keychain Через App Group Через SharedPreferences/Keystore
Рекомендований сценарій Оплата, посадковий, демо Ігрове демо, разові сервіси

Що входить в роботу?

  • Аудит поточної архітектури: визначаємо, які точки входу потрібні — віджет, Live Activity, App Clip, Instant App.
  • Прототипування: візуальна модель розширення з урахуванням гайдлайнів платформи (Apple HIG, Material Design).
  • Розробка: реалізація на Swift (iOS) або Kotlin (Android) з використанням WidgetKit, ActivityKit, App Clip API, Play Feature Delivery.
  • Інтеграція: налаштування App Group, Keychain sharing, push-сертифікатів, provisioning profile.
  • Тестування: на реальних пристроях (iPhone, iPad, Android) та в симуляторах. Для Live Activities — тест через xcrun simctl push.
  • Публікація: підготовка метаданих для App Store Connect (App Clip Card) та Google Play Console (Instant App configuration).
  • Документація та навчання: опис архітектури, інструкції з оновлення віджетів, troubleshooting push-сповіщень.

Процес роботи

  1. Аналітика: які функції додатку реально потрібні поза ним, і який механізм підходить. Віджет з прогнозом — WidgetKit. Трекінг доставки — Live Activity. Оплата на касі — App Clip.
  2. Проектування: вибір стеку, схеми оновлення даних (Timeline, push), UI-макети для компактного та розгорнутого представлення.
  3. Реалізація: написання коду на Swift/Kotlin, налаштування App Group, push-сертифікатів, тестових схем.
  4. Тест: кожне розширення тестується ізольовано. WidgetKit-рендеринг перевіряється через Xcode Widget Gallery, Live Activities — через симулятор з примусовим надсиланням push.
  5. Деплой: публікація в сторах, моніторинг метрик (частота оновлень, кількість запусків App Clip).

Строки орієнтовно

Тип розширення Строк (робочі дні)
Простий інформаційний віджет від 5 до 10
Інтерактивний віджет (AppIntent) від 10 до 15
Live Activity з push від 10 до 20
App Clip з оплатою від 20 до 30
Instant App (Android) від 15 до 25

Вартість розраховується індивідуально після аудиту. Оцінка надається протягом 2 робочих днів.

Типові помилки при розробці розширень

  • Занадто часте оновлення віджета — призводить до троттлінгу та порожнього стану. Рекомендуємо інтервал не менше 15 хвилин (див. Apple Human Interface Guidelines, WidgetKit documentation).
  • Ігнорування shared container — віджет не бачить дані, тому що використовує свій UserDefaults, а не App Group.
  • Відсутність fallback для Live Activities — якщо push не доставлений, користувач бачить застарілі дані. Потрібен механізм періодичного опитування через Activity.update з pushType: nil.
  • Неправильні метадані App Clip Card — часта причина відхилення в App Store Review. Наприклад, некоректний URL або відсутній значок.

Зв'яжіться з нами, щоб оцінити, яке розширення підходить вашому додатку. Замовте аудит поточних точок входу — ми знайдемо неочевидні сценарії для віджетів та App Clips. Отримайте консультацію інженера з архітектури вже сьогодні. Гарантуємо проходження App Store Review з першого разу — наш досвід підтверджений десятками успішних публікацій.