WWDC15 参加レポート Day5 AppSearchとフィッシャーマンズワーフ編

こんにちは、大島です。

6/8から1週間WWDCに参加してきました。今回は最終日のレポートです。最終日ともなると慣れとともに疲れもたまってきます。この日はホテルの朝食を食べながら自分のPCでセッションを見ながら1日をスタートさせました。

前回までの記事はこちら

Advanced NSOperations

発表はDave Delogさんです。個人的にTwitterアカウントをフォローしたり、StackOverflowでコメントを見かけたりとAppleの有名人だと勝手に思っております。WWDC期間中に何度かすれ違いましたが蝶ネクタイとカラフルなシャツがシンボルのようでとても目立っていました。生で見れて嬉しかったです!

そんなDaveさんのこのセッションは、実在するWWDCアプリを題材にNSOperationでのフロー制御についてでした。WWDCアプリはサーバーからのデータ取得や、各WWDCセッションのFavorite機能、フィードバックコメント機能、Videoストリーミングとダウンロード機能、通信がなくても使えるようにCoreDataにデータを保存するなど様々な要素が詰まっています。また、認証一つをとってもAppleID認証、CloudKit認証など複数のサーバーに対して行わなければなりません。それらの処理の依存関係をNSOperationを使ってフロー制御しているという内容です。実在するアプリの説明なのでイメージが湧きやすいのでオススメなセッションです。できることならソースコードも見たいですが・・

このセッションとは関係ない話ですが、今までお恥ずかしながらCloudKitはiCloudにつないで単にドキュメント保存するだけのフレームワークかと思っていましたが、Baasのようなフレームワークだったということを知りました。AWSからもCognitoが出ていますが2-Tierアーキテクチャのサーバーレスな世界が少しずつ近づいてきているような気がします。Swift2.0からオープンソースになるということで各種Baasの処理をSwiftでカスタマイズできるようになったりしたら面白いですね。

IMG_7722

昼はフィッシャーマンズワーフへ

5日目にもなると余裕が出てきたので昼に少し遠出をしてみようかということになり、同僚とフィッシャーマンズワーフにお昼ご飯を食べに行ってきました。正直なところ、ダウンタウンは汚く、高い建物も多いのでそれほど最高な街だなーとは思いませんでしたが、フィッシャーマンズワーフは自分のイメージ通りのサンフランシスコでした。遠くには海が見え青空が広がり、アメリカンなカラフルなお店がたくさん並んでおり最高な街並みでした!

IMG_7704

ピア38という商業ゾーン的なところをお散歩しながら名物のクラムチャウダーを食べました。すごくおいしいんですが、でかすぎてメインまで食べ切れませんでした(笑)。

クラムチャウダー

App Search and Spotlight Lab

ラボのためにSearchAPIを試しにコーディング

会場に戻ってきたあと、Search APIの要素であるNSUserActivityCSSearchableItemについて実装方法を聞きに行くためデモアプリを実装していました。デモアプリの作りとしてはテーブルビューでレシピ一覧があり、タップするとレシピ詳細画面に遷移するだけの簡単なアプリです。こんなアプリがあったときにどのように実装するのがよいのか?ということを聞いてみました。例によって話しても伝わらないと思ったので、Question1から4までコード上に以下のようにコメントで書きました。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Question1: Where to instance a NSUserActivity in best place?
        // Question2: What purpose of NSUserActivity?
        let activity = NSUserActivity(activityType: "jp.co.recruit-mp.SearchAPISample")
        activity.title = "Recipe"
        activity.keywords = ["recipe", "cooking", "menu"]
        activity.userInfo = [
            "id" : "001",
            "description" : "あああ"
        ]
        activity.contentAttributes = [
            "contentDiscription": "ほげほげほげほげほげ",
            "thumbnailData": UIImage(named: "aaaa")!,
            "relatedUniqueIdentifier": "recipe001"
        ]
        activity.eligibleForPublicIndexing = true
        activity.becomeCurrent()
        // Create an attribute set for an item that represents an image.
        let attributeSet = CSSearchableItemAttributeSet(itemContentType: kUTTypeImage as String)
        attributeSet.title = "レシピ"
        attributeSet.contentDescription = "ほーげほーげふががあがが"
        // Question3: What should I set the uniqueIdentifier here?
        let item = CSSearchableItem(uniqueIdentifier: "recipe001", domainIdentifier: "jp.co.recruit-mp.SearchAPISample", attributeSet: attributeSet)
        // Index the item.
        CSSearchableIndex.defaultSearchableIndex().indexSearchableItems([item]) { (error) in
            if let e = error {
                // Question4: When do errors ocurred?
                print(e.localizedDescription)
            } else {
                print("search item indexed")
            }
        }
        return true
    }

ラボに突入

まず自分で実装していて気づいたのは、NSUserActivityCSSearchbleItemは独立して使えるということです。単にiPhoneやiPad内でSpotlight検索したいだけならCSSearcheItemを登録するだけでOKです。

次にNSUserActitivyをどの単位で作成するかということですが、今回のようなレシピ一覧アプリではレシピごとにkeywordsが変わったりする(例えば材料に肉が使われてたり、野菜が使われたり)ので、今回で言えばレシピ一覧でレシピをタップしたときにNSUserActivityを作るといいかもという話でした。さらに言えば、レシピ詳細でLikeボタンや口コミの投稿したときなどユーザーが行動した単位がよいということを言っていました。ただ今回の担当者の方の英語がとても速くほとんど聞き取れなかったので微妙なところです。。詳しい方がいたら教えていただきたいです。

次にこれもよくあることだとは思うのですが、例えばデータをサーバー側で管理している場合に、サーバー側に新しくデータが追加された場合はどうなるのかということを聞きました。アプリ側でNSUserActivityが作られなければPublic Indexされないというなら、アプリを立ち上げてもらわないとダメなんじゃないかと思ったからです。
これに関しては、セッションでも語られていましたがWebサイト側にPublic Index用のmetaタグを書いておけばAppleのクローラーが巡回してとりにきてインデックスしてくれるとのことでした。私がちゃんとセッションを見ていなかったのでちゃんと見てから行けばよかったと反省しています。一方で、Webサイトのmetaタグでインデックスできてしまうのなら、NSUserActivityはなんのためにあるんだろうか・・というところは謎のままですが、少し理解が進んだように思います。とにかくこのSearch APIは、今後対応が必要なことの一つだと感じました。

ちなみに、今回担当していただいた方は、イタリア語?のようななまりがありスピードも速くほとんど聞き取れませんでした。。私が分からなそうな顔をしていたので表現を変えて説明してくださるのですが、やっぱり速くて聞き取れなく申し訳ない気持ちでいっぱいでした。

WWDC終了

金曜日のセッションは15時半ごろに終了します。この頃になると会場も人も少なくなってきていました。セッションが終わったあとは会場の有線LANゾーンで、帰りの飛行機で見るためのセッションビデオをダウンロードしていました。1GBオーバーのビデオがなぜか1分弱でダウンロードできるので専用サーバーが会場にあるんじゃないかという説が流れていました。
ある程度ダウンロードし終えたあと会場をくまなく回ってみて写真をとったりして会場をあとにしました。これで私の初のWWDCが終わりました。今年は確か約70%が初参加の参加者だったそうです。1)keynoteで言ってたけどうろ覚え一度も行ったことがない人はきっと来年も当たりやすいような気がします。

IMG_7688

最後となりましたが、WWDCへの参加を承諾して頂いた関係各位に感謝しています。弊社ではWWDC以外にもGoogle I/O、Adobe Maxなど海外のカンファレンス参加が奨励されています。そういった制度にご興味を持った方は中途の方も新卒の方も是非ご応募頂ければと思います!ほぼ旅行記のようなレポートですが読んでいただいた方もありがとうございました!

応募はこちらから

脚注

脚注
1 keynoteで言ってたけどうろ覚え
関連職種の採用情報
詳しくはこちら