導入事例

現代のモバイルユーザーは、情報への即時アクセスを期待しています。システムレベルの検索をiOSアプリに統合することで、ユーザーはアプリを最初に開くことなくコンテンツを見つけることができるのです。 コアスポットライトAPIは、Appleの組み込みフレームワークで、アプリコンテンツをインデックス化して、デバイスのグローバルSpotlight検索に表示します。ユーザーがホーム画面から検索したり、検索ビュー内で検索すると、アプリのインデックス項目が表示されるのは、Mail記事、Mailのメール、メッセージ、その他の機能、およびその他の機能に関するすべての機能に関する詳細な機能が提供されます。

コアスポットライトとその利点を理解する

Core Spotlightは、軽量でプライバシーにやさしいインデックスシステムです。 完全にオンデバイスで生活しています。クラウドキットを明示的に使用しない限り、データの残留はユーザーの携帯電話に残しません。 これは、メモ、連絡先、文書、またはユーザー生成されたデータなどの個人コンテンツに理想的です。 主な利点は次のとおりです。

  • エンゲージメントの増加[] – ユーザーは、忘れたコンテンツを発見し、繰り返しの使用を促進します。
  • []シームレスなナビゲーション] - 検索結果をタップすると、関連する画面に直接アプリを開くことができます。
  • [オフライン機能] - インデックスされたアイテムは、インターネット接続なしで検索可能ままです。
  • [] 実装コストが低い – APIは、小さくて、よくドキュメント化され、既存のデータモデルと簡単に統合されます。

Core Spotlightは[]NSUserActivityのインデックス作成と並んでいますが、静的または頻繁に更新されたコンテンツの場合は、CSSearchableItemのインデックス作成を直接してより細かい制御を行います。

前提条件とセットアップ

コードを書く前に、プロジェクトが正しく設定されていることを確認してください。

  1. お使いのアプリは、iOS 9以降を対象としなければなりません[(iOS 9でデビューしたAPI)。
  2. コアスポットライトを有効にします。 Xcodeの機能は[]の下の]]]]の& Capabilities[は、「コアスポットライト」のエンタイトルを追加します。 これは、フレームワークをインポートする際に自動的に含まれています。
  3. コアスポットライトフレームワークとMobileCoreServices(タイプ識別子の場合):[]とをインポートします。

サーバの設定やユーザ権限は必要ありません。 インデックス化は、バックグラウンドで非同期的に行われます。

検索可能な項目の作成とインデックス作成

Core Spotlight のコアは オブジェクトです。各項目は以下から構成されます。

  • [unique ID]] (例:) - 選択または更新を処理するために後で使用されます。
  • オプション[ドメイン識別子[]] - グループ関連項目(例:)。
  • []attribute set ([)] - ]、 []、 []、 []などのプロパティを持つコンテンツについて説明します。

以下は、単一のノートをインデックス化する完全なSwiftの例です。

import CoreSpotlight
import MobileCoreServices

func indexNote(note: Note) {
 let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeText as String)
 attributeSet.title = note.title
 attributeSet.contentDescription = note.body
 attributeSet.keywords = [note.title] + note.tags
 if let imageData = note.thumbnail?.pngData() {
 attributeSet.thumbnailData = imageData
 }

 let item = CSSearchableItem(
 uniqueIdentifier: "com.yourapp.note.\(note.id)",
 domainIdentifier: "com.yourapp.notes",
 attributeSet: attributeSet
 )
 // Optionally set expiration date (default is one month)
 // item.expirationDate = Date.distantFuture

 CSSearchableIndex.default().indexSearchableItems([item]) { error in
 if let error = error {
 print("Indexing error: \(error.localizedDescription)")
 } else {
 print("Note indexed successfully.")
 }
 }
}

属性セットプロパティ

[はから継承され、何十ものプロパティを提供しています。ほとんどのアプリでは、以下が不可欠です。

  • [ – 目立つように見える短い、記述的なテキスト。
  • – タイトルの下にある長いスニペット。
  • – の配列は、代替検索条件のために。
  • または – プレビュー。
  • [ – 一緒にリンク項目 (例、親子メモ).

メディアコンテンツでは、タイプ固有のプロパティ()、[、またはを使用します。

インデックスコンテンツの更新と削除

アプリのコンテンツが変更されると、インデックスを同期に保つ必要があります。同じ[メソッドを使用します。

アイテムの更新

同じ一意の識別子で[を呼び出します。APIは、古いエントリを自動的に置き換えます。

アイテムの削除

階段のコンテンツを削除するには、[[]または[]を使用します。

CSSearchableIndex.default().deleteSearchableItems(withIdentifiers: ["com.yourapp.note.123"]) { error in
 // handle
}

バッチ操作は効率的です: または に配列を渡します。 完全にリセットするには、を使用します。 (本当に必要です)。

ユーザーの活動および深いリンクの処理

ユーザーがSpotlight結果をタップすると、アプリは[]の継続による呼び出しを受け取ります。 [または[]で次のdelegateメソッドを実行します。

func application(_ application: UIApplication,
 continue userActivity: NSUserActivity,
 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

 if userActivity.activityType == CSSearchableItemActionType {
 if let userInfo = userActivity.userInfo,
 let identifier = userInfo[CSSearchableItemActivityIdentifier] as? String {
 // Navigate to the item with this identifier
 navigateToContent(identifier: identifier)
 return true
 }
 }
 return false
}

状態の回復

スムーズな体験のために、ローディング状態を示すために[も実装します。シーンベースのアプリ(iOS 13+)では、[]メソッド[を使用します。

NSUserActivity との深いリンク

Core Spotlight は の仕組みで動作します。既に を使ってアクティビティをインデックス化している場合は、 フラグを追加できます。ただし、タイトルや説明を上回る微調整には、 を直接使用してください。

効果的なインデックス作成のためのベストプラクティス

これらのガイドラインに従って、インデックスされたコンテンツが関連性および実行者を維持します。

1. 指数のみ意味のあるコンテンツ

小さなデータをすべてインデックス化しないでください。 アイテムのユーザーに焦点を当てると、最近の文書、高値ページ、またはブックマークされたコンテンツを検索する可能性があります。

2. 適切な有効期限を設定

デフォルトでは、アイテムは1ヶ月後に期限が切れます。静的コンテンツの場合は、を設定してください。時間感度データ(例、イベントリマインダー)については、現実的な日付を使用します。

3. ドメイン識別子を賢く使用して下さい

ドメイン識別子を使用すると、グループからすべての項目を一度に削除できます。たとえば、ユーザーがフォルダーを削除した場合は、[]を呼び出します。

4. 意味のあるキーワードを提供して下さい

同義語、一般的なスペルミス、および代替名を含める。 過度の接種を避けてください。 5~10ウェル・チョセンのキーワードは十分です。

5. 重複コンテンツのインデックス化を回避

重複した項目(例えば、異なるドメインの同じタイトル)をコピーすると、ユーザーは混乱した結果が表示されます。アプリレベルで重複します。

6. バルク更新のためのバッチ操作

複数の項目(例、クラウド復元後)を同期させると、メインスレッドをブロックしないようにするには、50〜100の配列にそれらをバッチ処理します。 配列でを使用して、複数のシングルコールを呼び出します。

性能とバッテリーの考慮事項

コアスポットライトは、低優先の背景プロセスを実行します。 しかし、悪い実装は、バッテリーを排出したり、システムの性能を劣化させることができます。

  • 再インデックス周波数[を制限します。 - 実際にデータが変更されると、すべてのアプリ起動時にのみ再インデックスします。
  • スロットル大操作] – と] (])を使用して、原子の更新。
  • ]重画像を空にしない – []は小さめ(例えば、64×64点、JPEG圧縮)であるべきである。 大きい画像はメモリ圧力を増加させる。
  • [] デフォルトインデックス - []は、ほぼすべてのアプリで十分です。 カスタムインデックスを作成することは、ほとんど必要ありません。

AppleのCore Spotlightドキュメンテーションは、インデックス処理が「火と忘れ」として重要視しています。メインスレッドの完了コールバックを同期的に待つことはありません。

コアスポットライトの統合をテスト

Spotlight 結果をデバッグすると、すぐに表示されないため、トリッキーな結果が得られます。このテスト戦略に従ってください:

  1. [] シミュレータテスト - iOSシミュレータ(iOS 15以降)を使用します。 インデックス化後、数秒待ってから、ホーム画面をプルダウンして検索します。 結果はシミュレータで長くかかる可能性があることに注意してください。
  2. デバイステスト - 常に物理的なデバイスをテストします。 スポットライトのインデックス化は、実際のハードウェアでより積極的に動作します。
  3. [] インデックスをリセット – 設定アプリ:一般 → スポットライト検索 → を使用して、アプリをオフとオンに切り替えます。これにより、インデックスが消去され、新しいスタートが強制されます。
  4. [削除]を検証します。アイテムを削除した後、古い結果が現れなくなったことを確認します。システムがキャッシュ結果が発生した場合、最大30秒まで表示されます。
  5. デバッグコンソール]をチェックします。 - をXcodeのスキーム引数でを渡すことでログを有効にします。

有用なリソースは、WWDC 2015「Introducing Core Spotlight」 で、今日はまだ基礎的な概念をカバーしています。

コンテンツ

Core Spotlight APIは、ユーザーがアプリとどのようにやり取りするかを変換できる堅牢で、アンダーユーティリティ化されたツールです。関連するコンテンツを追加することで、システムの検索インデックスに最新のコンテンツを追加することで、検索からコンテンツへの摩擦のないパスを提供できます。エンゲージメントと保持を向上します。 開始する:最も重要なコンテンツを最初にインデックス化し、徹底的にテストし、二次アイテムをカバーするために拡張します。 インデックスをクリーンに保つことを忘れないでください。 独自の識別子を一貫して使用し、ユーザーアクティビティコールバックの猶予を処理します。 この記事では、この手順を詳細に説明してiOSを最初に体験することができます。

詳細は、公式[]コアスポットライトフレームワークリファレンス[]]の検索プログラミングガイドを参照してください。