Search APIの公式日本語リファレンスが出ていた件


iOS9から追加されたSearch API関連のドキュメントが2015.10.27に日本語化されていました。

App Search プログラミングガイド
https://developer.apple.com/jp/documentation/General/Conceptual/AppSearch/Intro/Intro.html

日本語版は丁寧に翻訳されており、もともと実装部分と分けられて内容が記述されているため、iOSアプリエンジニアでない企画をつくるような人でも読みやすい文章になっています。

下記、日本語版を見るまで私が読み飛ばしてしまっていたところを中心に引用します。

## iOS9でも特定の端末ではNSUserActivityやCore Spotlightの検索機能は動作しない

引用:
> 注意：  「App Search」はiOS 9のユーザーに対して有効なものですが、NSUserActivityやCore Spotlightの検索機能は、iPhone 4s、iPad 2、iPad（第3世代）、iPad mini、iPod touch（第5世代）ではサポートされていません。

- iPhone 4s
- iPad 2
- iPad（第三世代）
- iPad mini（おそらく第1世代?）
- iPod touch（第5世代）

私はiOS9Beta版では4sでCore Spotlightの動作確認をしていた記憶があるので、おそらくこのドキュメントは正しくないのではないかと思います。実機で確かめましょう。

## ニュースアプリでは検索の期限を指定し期限切れ扱いにすることを紹介している

NSUserActivityを使った例として「ニュースアプリ」を例として紹介していますが、その中でニュースアプリの記事indexを期限切れにすることを紹介しています。

引用:
> ユーザが閲覧した記事をインデックスするほか、expirationDateプロパティを使って、所定の日数が経過した記事は「古く」なったとみなし、「期限切れ」扱いにすることもできる。

確かに、古い記事は今起こってることを知りたいという意味での「ニュース」ではないので、検索にヒットされるのはユーザにとっては微妙です。鮮度が関わってくる情報はindex化する際に期限をあらかじめexpirationDateにセットするのが良いでしょう。

## Core Spotlightのバッチ更新(batch update)について

Core Spotlightにはほかにも、インデックスをバッチ更新する、インデックスに問題がある場合にアプリケーションが動作していない間に更新する、などの高度な機能があります。

ただ、日本語版を読んでも具体的な使い方をイメージできなかったため省略します。

おそらくバッチ更新で出来ることとしては

- 一度に全てのindex化を行わず処理を分けることが出来る（？）
- アプリケーションが動作していない間にindexを更新することが出来る

やはり、index化はデータが多量にあるときにindex化の処理が重すぎてしまうことをまず懸念すると思います。ただindex化のためにDBのページング処理を組み込むのはやや面倒なのでバッチ更新という仕組みが用意されていると解釈しています。ただサンプルコードがないのでよくわからないしこのリファレンスもイマイチよくわかりません。

誰かがいい感じのサンプルコードを書いてくれることに期待ですね。

## 検索に関与するいくつかの技術

WWDC2015ではSpotlightからメーラーが起動するような画面を見た記憶がありましたが、やはりiOS9ではメーラーは起動できないままのようです。

> どのAPIを使ったとしても、ユーザは検索結果の画面から直接、電話をかける、ある場所への行き方を調べるなどのアクションを実行できるようにできます。ビュー内でユーザが呼び出せるアクションとしては、次のようなものがあります：

![](https://developer.apple.com/jp/documentation/General/Conceptual/AppSearch/Art/Contact_snip_2x.png)

![](https://developer.apple.com/jp/documentation/General/Conceptual/AppSearch/Art/Direction_snip_2x.png)


このリファレンスには書かれてはいませんが、自分が試した限り受話器を表示し電話を起動したい場合は次のように

```swift
attributeSet.supportsPhoneCall = true
attributeSet.phoneNumbers = ["09012345678", "08012345678"] // 0番目が電話できる
```

地図を起動したい場合は次のようにすれば良いです。

```swift
attributeSet.supportsNavigation = true
attributeSet.latitude = 35.698135
attributeSet.longitude = 139.589517
```
                
## 検索結果の表示の改善

結果表示についても細かく推奨される内容があります。箇条書きすると

- 項目ごとに簡潔なタイトルを与える
	- iOSデバイスの画面には大きさの制約があり、長いタイトルは切り詰められてしまうので、90字以内に収めるとよいでしょう。
- 詳細情報の記述を工夫し、タイトルをそのまま繰り返しただけのような形にしない
	- たとえば料理レシピのタイトルが「チョコレートチップクッキー」であれば、詳細情報は「口の中でとろける、ママが作ってくれたようなチョコレートチップクッキー」などとします。タイトルと同様、長すぎると切り詰められてしまうので、300字以内に収めるとよいでしょう。

ざっくりと推奨文字数があります。さらに

- コンテンツタイプを適切に設定する
	- Spotlightは項目の外観を、contentTypeの値に従って調整します。当該項目のCSSearchableItemAttributeSetオブジェクトを生成する際に指定した値です。たとえば、検索結果の中に現れる「連絡先」を「Contacts」アプリケーションと同じような外観にしたければ、contentTypeの値としてkUTTypeContactを設定し、authorsプロパティも指定してください（あるいは、連絡先情報の順序を保ちたい場合、authorNamesおよびauthorEmailAddressesプロパティを指定）。各種のコンテンツタイプが、『UTType Reference』に載っています。

コンテンツタイプを指定しても見た目は変わらないと思い込んでいましたが、連絡先情報の順序を保つこともできるらしいです。おそらく、他のコンテンツタイプも見た目上それほど違いはないとは思いますが、それっぽいものを指定すると良いことがありそうです。

- 項目を適切かつ魅力的に見せるよう、サムネール画像を用意する
	- できるだけ、項目ごとに異なる画像を使ってください。少なくとも、すべての項目に同じ画像を用いることは避けます。たとえば、各種の製品すべてについて同一のアプリケーションロゴを使ったのでは、ユーザの関心を惹くことはできません。

NSUserActivityもCore Spotlightも基本的にはローカルの画像しか表示できないため、いろいろな妥協でアプリケーションロゴにしたくなるところですが、ユーザの関心を引くことを考えると何かしらの画像を使ったほうが良い。とのことです。