iOSにおけるDocument IndexingとApp Search | try! Swift Tokyo 2017 #tryswiftconf Day2-5 聞き起こし

twitter.com

私たちはプログラマとして、自分たちの製品のプロモーションに興味を持ち、ユーザには簡単で楽しい経験をしてほしいと考えています。それでもApp Storeには毎日無数の新しいアプリが登場し、ユーザが私たちのアプリをダウンロードしても、デバイス上の数十ものアプリの中で見失われる可能性があります。しかし当然ながら、ユーザが私たちのプロダクトを忘れずに定期的かつ積極的に使うことを望んでいます。私たちは多くのトリックや技を使えます。そのうちの1つはApp Indexing機能で、Zalandoで積極的に使っています。それは素晴らしい結果を示して見事に機能し、SpotlightやWebでアプリをより使いやすく、認識しやすくしました。この講演では、ZalandoのiOSアプリでApp Search機能をどのように使っているのかを説明し、さまざまなタイプのコンテンツ向けのApp Search機能を紹介し、経験と実例を共有します。私たちのさまざまなアプローチを示すことで、開発者が私たちのミスを防ぎ、成果をもたらしてほしいと考えています。

iOSにおけるDocument IndexingとApp Search

f:id:niwatako:20170303121307j:plain

アプリの検索をiOSでやる話をします。

新しいことでは無いですが面白いことが起きているので共有します。

f:id:niwatako:20170303121335j:plain

まだ6万アプリぐらいしか利用していません。

f:id:niwatako:20170303121404j:plain

今日は活用のインスピレーションを与えられればと思います。

f:id:niwatako:20170303121444j:plain

カタログアイテムをインデックス化したい場合

f:id:niwatako:20170303121523j:plain

f:id:niwatako:20170303121558j:plain

期間限定SaleならexpirationDateを設定します。

attributeSetはCoreSpotlightの中でアイテムを可視化します。

domainIdentifierを使えば春物を一斉削除したり出来ます。

ExtensionでIndexingのバックグラウンド処理も可能です。

f:id:niwatako:20170303121714j:plain

コンテンツは最新版にしておきましょう。

f:id:niwatako:20170303121744j:plain

事例はGithubに載っています。

f:id:niwatako:20170303121807j:plain

この機能はiOS10以降です。Spotlightから検索をアプリ内へ継続させることが出来ます。

f:id:niwatako:20170303121837j:plain

10項目ぐらいしか表示できませんでしたが、iOS10からはこうなります。

f:id:niwatako:20170303121850j:plain

f:id:niwatako:20170303121854j:plain

アプリ内へ入って続きを見ることが出来る

f:id:niwatako:20170303121940j:plain

バックグラウンドのバッチはバッチの開始と終了の宣言、そしてスレッド処理を自分で管理します。

f:id:niwatako:20170303122008j:plain

トリガーはデベロッパー設定へ行きます。AllIdentifier?を設定するとExtensionを呼び出してくれる。

f:id:niwatako:20170303122041j:plain

itemはどのようにSpotlightで見えるかということだけに責任を持ちます。

f:id:niwatako:20170303122108j:plain

注意いただきたいのはシミュレーターでは機能しません。矢印などの挙動はリアルデバイスを利用して確認します。

f:id:niwatako:20170303122135j:plain

supportsPhoneCallやsupportsNavigaionをtrueにすると、位置情報などは提供されないので検索結果に出なくなります。

f:id:niwatako:20170303122215j:plain

NSUserActivityは見えるものです。publicに定義するとクラウドに表示されます。ユーザーがアプリケーションを持っていなくてもSpotlightに表示され、タップするとアプリをダウンロードできる。

f:id:niwatako:20170303122259j:plain

NSUserActivityのプロパティはSearchableItemとほとんど変わりません。

スクリーンをアプリケーションでWebページと同じものにすることが出来ます。

f:id:niwatako:20170303122529j:plain

以前は削除ができませんでしたが可能になりました。

f:id:niwatako:20170303122546j:plain

f:id:niwatako:20170303122559j:plain

f:id:niwatako:20170303122619j:plain

アクティビティを作るとイニシャライザが必要になります。ActivityをInitializerを作っても機能しないんです。イニシャライズしてからプロパティを設定する必要があります。

f:id:niwatako:20170303122705j:plain

クローラーがWebPageでインデックスされているかを確認するとわかると思います。

f:id:niwatako:20170303122740j:plain

f:id:niwatako:20170303122746j:plain

SearchableItemとActivity

スクリーンに影響を及ぼします、常に見えるようになっていなければなりません。

f:id:niwatako:20170303122816j:plain

対応するWebサイトがなければ使う理由はありません。常にPublicです。Appleクローラーがクローリングします。クローリングを確認する方法はありません。

Deeplinksを加え、robots.txtに加える。マークアップでリッチインフォメーションを加える。

f:id:niwatako:20170303122915j:plain

f:id:niwatako:20170303122924j:plain

UniversalLinkはWebサイトから直接アプリを開きます。使うためにはFQDNを加えて下さい

f:id:niwatako:20170303123011j:plain

機能するかどうかを確認することが出来ます。ユーザーの選択を記憶します。

f:id:niwatako:20170303123137j:plain

以前はwildcardで対応していました すべてのリンクに対応して欲しい時、ユーザーに関連するものだけを使いたい時、リダイレクトではなくWebにリダイレクトしたい時。

f:id:niwatako:20170303123218j:plain

Notを使って下さい。リダイレクトされないようにします。

ワイルドカードの前に記述する必要があります。

f:id:niwatako:20170303123241j:plain

他のWebサイトのコンテンツからリダイレクト出来るのか

これは出来ません。メタデータを特定する必要があります。

f:id:niwatako:20170303123315j:plain

  • アプリケーションへのアクセスが早まる
  • SpotlightのTopResultに表示される
  • ユーザーエンゲージメントが高まる
  • プロモーションにも使える
    • ユーザーがWebを使いたくない時にアプリにリダイレクト出来る。

f:id:niwatako:20170303123408j:plain

Githubのリンクを用意していますので使ってみて下さい。

Q&A

Indexingを様々なイメージとリンクする時どうしたら良いのでしょうか。Imageをまずダウンロードしなければいけません。どんなイメージを使う必要があるでしょうか、イメージを保存しておく必要があるのでしょうか。

Indexしたら保存しておく必要はありません。開く時に取得すればいい。 ちさなアイコンで見せたいときはプロパティに設定します。勝手に縮小してくれるのでJobは発生しません。

画像そのものをIndexingでSaveする必要はありません。

ImageのShapeが違うように見えた。四角ではなく少し長くなって見えた。これが推奨ですか?

そういうわけではありません。まずイメージが有りますね、カタログのような。イメージの中で馬に乗る女性があるとすると、女性と馬のキーワードを登録する。 検索結果から開いたアイテムが分かるのでDBから取る

Spotlightを実際のアプリでどれくらい使っていますか

統計的に何人ぐらいが利用しているか、それは難しいですね。例えば今のところは50%ぐらいのお客様がSpotlightから来ている。

データ自体は魅力的だと思う。データは冗長されていますか?インデックスをするのか大きなストアに持たせるのか データの失効は有効期限は付けていますか

有効期限を付けておくとインデックス化で自動で削除されます。更新もあとからできます。 あとから期限を定めても良い

APIコールでペンと検索する時、データはIndexに置くのでしょうか

IDなどがもらえるので、Index済みかどうか確認することが出来ます。