Categories: 勉強会

#WWDC21cafe iOSの新しい技術の情報交換をするWWDC2015 情報共有会に行ってきた!

今年のWWDCで発表された内容を掘り下げて共有するWWDC2015 情報共有会に参加してきましたのでそのまとめメモです。

簡単Complication

complicationとは

  • watchOS2に搭載されました
  • ClockFace上に配置される領域に情報を表示できる
  • 表示内容はカスタマイズが可能
  • 表示内容にはtextとImageが使用可能
  • 過去と未来の状態を確認できる「Timetravel」機能がある

用語解説

  • complicationの表示パーツ(PlaceHolder)は、CLKComplicationTemplateで構成する
    • CLKComplicationTemplateの表示情報の中に、CLKImageProviderとCLKTextProviderで作成する。
    • UIImageとNSStringじゃないです。
  • CLKImageProvider
    • backgroundImageやbackgroundColor, foregroundImage, foregroundColorを指定できるが、backgroundImageは必須
    • 例えば飛行機の画像は背景を指定して、飛行機の画像を貼っつけたりする
    • 画像はalpha値のみ参照する。(ユーザがカラーを設定するため)だけどまだバグで動いてない
  • CLKTextProvider
    • 様々なオプションが有る
    • TimeTextProvider (2:15 pm)
    • CLKRelativeDateTextProvider (枠の大きさによって日付情報を適宜削ってくれる)
  • CLKComplicationTemplate
    • CLKImageProviderとCLKTextProviderで構成されている
    • たくさんあるが、必要なPlaceFolderに応じたTemplateのみ実装すればいい

実装

  • TimeLineはcomplicationの状態を過去から未来まで並べている
    • CLKComplicationTemplateを時系列に並べ順に参照するもの
    • CLKComplicationTimelineEntryはNSDateとCLKComplicatoinTemplateを内包する
    • CLKComplicationTimelineEntryをArrayで持っておき、TimeTravelから参照させられる
  • 既存のプロジェクトにTargetとしてApple watchを追加する際に、Include complicationにチェックを入れる
  • サンプル – complicationBasicSample

Tips

  • complicationをタッチするとアプリが起動する
  • watch OS2 Beta2において、バグがいっぱいある Known Issues
  • CLKComplicationTimelineEntryはWCsessionから追加可能
    • iPhoneからbackgroundでcomplicationの更新可能
  • complicationの更新するにはreloadTimelieneForComplicationを使う

Search API in spotlight and Safari

  • safariやMarkupがメイン
  • いろんなインデックスをspotlightやsafariで検索できる
  • アプリをインストールされてなくてもアプリの検索結果がでます

Index Architecture

  • On-Device index
    • privateのインデックス
    • デバイス上にどんどん溜まっていきます
  • Apple’s cloud index
    • 他のユーザの検索結果がインデックスされます

Cloud index mechanism

  • どのユーザーもみている人気コンテンツがクラウド上に乗る
    • 人気がないものはクラウドにのっからない
    • URLさえあればsafariでもでる
  • AppleBotがweb上のdeep linkをかき集めてくる
  • deviceとwebで集めたindexがcloud indexにのる
  • 検索のアルゴリズムやランキングの基準がある
    • URL人気度、結果がリッチUIか、
    • 検索できたところでアプリの起動がスムーズか
      • 起動時にwebを挟んだりしてはいけない

3 search API

NSUserActivity

  • Handsoffで使われるもの
  • コンテンツを検索結果にして、publicでもprivateでもできる
  • インデクスされたのはsafariでもspotlightにも出る
  • メタデータを登録できる
  • 画面をタップするとアプリに遷移するが、その際にはfunc application(UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: [AnyObject]? -> Void) -> Boolメソッドが呼ばれる
  • コンテンツ自体にプライバシー性があるものはprivateにする
    • ログインした後の支払内容など
    • ユーザーの個々のコンテンツもprivate
  • Handoffやsiri suggestionsにもでる

CoreSpotlight

  • private only
  • NSUserActivityはインデックスを削除できないがspotlightならできる
    • deleteSearchableItemsWithIdentifieresで削除できるが、ドメイン指定で削除したりなどができる

WebMarkup

  • フロントエンドのページにdeep linkはっておけばAppleBotが拾ってくれる
  • ポイントはitunes connectのsupport urlと marketing urlにページを登録しておくとbotが回って拾ってくれる
  • アプリ持ってない人にはsmart app bannersを出すほうが親切
  • DeepLinking
    • Universal linkを使う
    • カスタムスキーマではなく、url形式でやるので一意なものとなる
    • サーバ上に証明書いれないといけないのでセキュア
    • アプリがあればアプリに飛ぶし、なければインストールを誘導してくれる
    • capabilityでドメインの指定が必要

ランキング結果を上げるには

  • コンテンツ結果をリッチにする
  • レシピなどで、rateなどを表示するように仕様
  • 電話するや音を鳴らすなどのアクションを付ける
  • コンテンツの関連性として、3つのAPIを使うがその際にはおなじURLを使うようにする
    • CoreSpotlightとNSUserActivityだけの場合はidentifierを指定する
  • 有益な情報を表示する
    • サムネイルの内容を表示する
    • カテゴリのキーワード(チケット、iOSなど)を3~5個つける
  • アプリの起動時間をみていて、その起動時間でランキング結果が決まるので遅いとはじかれる
    • アプリを開いた際にログインを求めるのは論外

既存バグ

  • メール・メッセージ、お気に入り地図、ノートやメッセージからアプリを起動できない
  • NSUserActivityのメタデータは追加したインデックスを取得できない
  • サムネ画像が表示されない(beta2では治っている)
  • release notesやdeveloper forumを見よう!

質問

  • インデックシングは始まってたりする?
    • iOS9では動いているがpublic indexで確認できない
    • corespotlightはちゃんと動いてる

METAL

  • OpenGLに変わるレンダリングエンジン
  • A6チップ以降のデバイスから使える
  • El CaptainよりOSXにも対応
  • OpenGLは多数の実行環境に対応してるので分岐があって遅いのでOSに適用したもの

DrowCall SetPass

  • setpass
    • レンダリングのSpriteのクラスからCPUで計算して、レンダリングエンジン(OepnGLなど)に渡して描画する動作
    • これからのトレンドはsetpassを軽減する流れになっている
  • DrowCall
    • CPU->GPUに描画内容を渡すための呼び出し
  • 描画速度を上げる
    • METAL対応すればはやくなるが、描画のための準備も高速化する必要あり

Metal in Review

  • CPUパワーを大幅に削減
  • 効率的なマルチスレッドを実現
  • Shader(マテリアル)処理の統合
  • Tools Supportみるといいです
  • Unityも次期バージョンで対応するとのこと

New Features

  • メタルは2012年以降のモデルであれば使用可能
  • 画像圧縮フォーマットはASTCがベストらしい

Metal App thining

  • メモリサイズ最適なテクスチャフォーマットがある
  • 画像はimages.xcassetsで管理

What’s new in Core Location

  • Background location
    • Xcodeのcapabilityのbackgroundのlocation updateにチェックをしていれば継続的に位置情報をとれたが、ios9から、allowsBackgroundLocationUpdatesをYESにしないと、backgroundで位置情報がとれなくなりました。(デフォルトNO)
  • Single location
    • 今まではstartLocationで継続的に位置情報がとれたが、ios9からrequestLocationがふえて、一度だけの位置情報が取得可能になった
    • iosとwatchOS2で利用可能
    • 成功した時はlocationManager:didUpdateLocations、エラーはdidFailWithErrorが呼ばれる
    • 両方共実装しないと、位置情報がとれた瞬間にcrashします
  • Authorization
    • ユーザに位置情報をとってもいいかどうかを聞くリクエストはrequestWhenInUseAuthorization(アプリを起動するときだけ)、requestAlwaysAuthorization(アプリを起動しない時にとる)だったが、watchOS2から単体でとれるようになったので許可のフローが変わった
    • iPhoneで許可する場合は普通にダイアログが出るが、アプリ本体を起動する前にwatchOSを起動した場合は、iPhone側で位置情報の許可をしてねとのダイアログが出るのでiPhone側で許可をする
    • UX上で許可させるのはあまりよくないのが理由らしい
  • AppleWatchBestPractice
    • startUpdatingLocationはwatchOS2では使えません
    • 継続的に位置取得はできません
    • requestLocationを使う必要があるので1回きりだけしかつかえない
    • Watch Connectivityを使って継続的に使ってください
  • PotLocというサンプルアプリがすごい参考になります

New feature & Tips in LLDB

「WWDC2015 情報共有会」で発表してきました。皆様の協力のおかげでとても楽しく発表することができました。ありがとうございます...
- blog.dealforest.net
  • breakpoint
    • breakpoint set -E swift -N allThrows
    • 言語をサポートするようになった
    • lldbinitで初期設定が可能に
    • mallocを毎回ブレークポイントセットしたりdisableしたりなどの設定ファイル(~/.lldbinit)をかける
    • 今回からこれはrunした瞬間から読み込まれるようになりました(今まではbreakした時)
  • formatter
    • expressionとfameにformat引数が追加されたので16進数で表示などフォーマットを指定しての出力ができるようになった
  • formatting models
    • frv, p, poがある
    • frame variableはpure LLDBの情報を出力
    • pはevalした結果をLLDB fromatで出力
    • po はevalした結果を言語ごとに最適なもので出力される
  • runtime
    • 式の評価ができるようになったので、forやifをかけるようになりました
  • swiftなら自動でできます
    • expr import UIKitとやればobjective-cでも使えます
  • xcode7からself.viewを自分で作って置き換えるとかもできちゃったりする
  • 以下swiftのみのはなし
  • type lookup
    • classやstructの定義一覧を見れたりする
  • protocol
    • print、debugPrint, LLDB用の出力がそれぞれできました
    • printがクラス名だけじゃなくてクラスのプロパティの中身などもちゃんと出るようになりました
    • debugPrintはカスタマイズしなければprintとおなじ
    • po hogeはインデントついてprintなどよりもさらにわかりやすく表示される
  • tuna使えばbreakしなくても気軽にpo使えます!!!!!!
  • Tips
    • セッションごとのhistoryだったのがstop/startしても残るようになった
    • ~/.lldbinit-Xcodeを見なくなった
    • all exception breakpointは設定しなくてもpo $arg1をしとけばfatal error messageが見れるよ

Watch Connectivityについて

  • OS1のころは全部iPhoneにデータ置き場などはありましたが、extensionがwatchOSで動くようになりました
  • WatchConnectivityはiPhoneとAppleWatchでのやりとりを可能にしました

WCSession

  • データ通信を可能にするにはセッションをactivateにする必要がある
  • プロパティ
    • paird : ペアリングされているかを知れる
    • watchAppInstalled : インストールされているかを知れる
    • complicationEnabled : watch faceに設定されているか
    • reachable : iPhoneアプリとwatchアプリがアクティブで通信可能か

WCSessionDelegate

  • iphoneか、apple watchから送信したデータを受信できる
  • delegate method
    • sessionWatchStateDidChange : paired, watchAppInstalled, complicationEnabled, watchDirectoryURLなどに変化があったら呼ばれる
    • sessionReachabilityDidChange : 対になるアプリのreachabilityに変化があれば呼ばれる

データを送信する方法

  • Background TransferはOSがよろしくやってくれる(デバッグしづらい)
    • Application Context、User Info Transfer、File Transferの3つがある
  • Interactive Messagingはすぐ送ってくれる

BackgroundTransfers

  • ApplicationContext
    • 更新するとどんどん上書きされる
    • Dictionary型のデータが格納できる
    • session:didReceiveApplicationContextデータを受け取れる
  • User Info Transfer
    • 上書きされずキューイングされる
    • Dictionary型のデータが格納できる
    • session:didReceiveApplicationContextデータを受け取れる
  • File transfer
    • キューイングされる
    • 大きめのデータを転送できるが、あまり大きすぎるとcrashします
    • metadataをつけれる
    • session:didReceiveFile: で対になるアプリからデータを受け取れる

Interactive Messaging

  • DictionaryやNSDataも可能
  • お互い通信可能な状態であることが条件
    • iPhone側でreachable = trueになるのはBluetoothでAppleWatchと通信可能で、Watch appがフォアグランドにある状態
    • Apple watch側でreachable = trueになるのはBluetoothでiPhoneと通信が可能な状態(iPhoneアプリはフォアグランドである必要はない)
  • Apple Watch->iPhoneアプリの場合はiOSアプリをBackgroundで動作させられる
  • replyHandlerを使って通信結果を送信側に返したほうがよさげ

About ReplayKit

  • 画面を録画するフレームワークで、マイクや実況音声も一緒に記録できる
  • 単一のUIWindowを記録し続けるので、キーボードなどは記録されない
  • 外部ディスプレイつないでると録画不可
  • 動画のトリミングまで提供している
  • 生データにはアクセス出来ないのでシェアエクステンションで共有する
  • iPhone5s以降、iPad air以降で動きます

使い方

  • RPScreenRecorderを使って録画を開始し、終了に合わせてRPPreviewViewControllerを表示し、RPPPreviewViewControllerから保存&共有
  • まだちゃんと動かないっぽい
  • 解像度・画質は高くない(568x320px, 3Mbps)

その他

  • ユーザビリティテストに利用すれば使えそう
    • ユーザーに〜を操作しますといってもらって操作してもらったりすれば、動作完了に迷ったりした点を観測できる
    • TouchVisualizerと組み合せればタッチポイントもわかる
    • シナリオテスト中の偶発的なバグも記録できるかも

Swift2.0 プロトコル拡張の話

@es_kumagai様

  • 今までのプロトコルは定義だけだったが、プロトコル拡張は実装を書く
  • すべてのコレクション型で使える
  • where条件を指定してElementがIntegerTypeだったときに使える機能を実装したりなどができる
    • 型を制限することでより高度なことが書ける
  • ,を使えば複数の条件も指定できます
  • ==を使えば同じ型として演算ができるようになったりする
  • 自分自身を成約できる
  • 型で明示的に限定もできる
    • 適応範囲がせまくなりすぎる気がするのであんまり推奨しない
  • 規定の実装は上書きが可能
    • 実装しなければextentionの実装を使ったりといった使い方もできる
  • 最後にオブジェクト指向とprotocol指向についてわかりやすいお話がありました
    • プロトコル拡張の醍醐味は特徴に着目して機能を作れる

所感

おしゃれな雰囲気でゆったり楽しく皆さん発表されていました。
実際に新しいことをやっていて躓いた内容などを知ることができたのでとても有意義でした。

印象に残ったのは、最後の@es_kumagai様の発表で、講義のようなゆったりとした独特な発表でした。オブジェクト指向とプロトコル指向について、とてもわかりやすい犬の話でもちきりになっていました。
protocolを使うことでかわいい犬(小太郎)の制作に注力できるらしいので、積極的にオブジェクト指向から脱却してプロトコル拡張指向で実装に取り組んでいきたいと思います!!

mogmet

View Comments

  • Your article helped me a lot, is there any more related content? Thanks!

  • Your point of view caught my eye and was very interesting. Thanks. I have a question for you.