サイバーエージェントが開催する
CA.swift #12 WWDC20報告会に参加してきたのでそのまとめになります。
Detect Body and Hand Pose With Vision
Computer Visionとは?
人間の資格システムにおいて行えるタスクをコンピュータで実現することを追求する研究分野。みたり、書いだりしたものをすぐわかるが、コンピュータにとってはバイナリで意味がないので、そこに意味を持たせる。
iOSVisionとは?
- ios11で導入されたフレームワークで、顔のランドマーク検出、テキスト検出、バーコード認識、画像認識などができ、CoreMLモデルを使用した検出も可能
- 今年から体と手のポーズを検出できるようになりました
活用例
- 特定のジェスチャーを検知して撮影することで自撮り棒がいらない
- 手の形を判定して絵文字をオーバーレイして表示させることができる
パフォーマンス
- appleのサンプルアプリ(空中で文字をかけるというアプリ)を使ってみた
- 流石に絵を書くのは厳しいと思うが、やってみたところ、割とかけた
- 意思疎通を目的とするなら十分の機能と思われる。
- 思ったより線画きれいにかけ、勢いよく動かしても検知できるが、すべての指が見えるようにしないとうまく検知はしてくれない
制度を高めるための考慮事項
- appleから明示されているものとして、画面の端ではうまく機能しない、カメラの視野方向に対して平行な手は検知や手袋をしている場合が難しい、足を手と勘違いされる、デバイスは固定される必要があるなどの考慮事項がある
- 三脚でやるとベストとのこと
実装面
- VNDetectHumanHandPoseRequestの作成 → VNImageRequestHandlerの作成をして、Requestをわたす→VNRecognizedPointsObservationを受け取る
- 複数のリクエストをVNImageRequestHandlerを渡すことが可能
- 結果は複数あるが、複数のオブジェクトを検知可能なので、必要なものを取得して使用する
- 実際使う時は、AVCaptureOutputから判定する
- ランドマークの取得:VNRecognizedPointGroupKey
- 手には21個のポイントがある
- 指を選択して、その中からどの関節かのポイントを選ぶ
- VNRecognizedPointを最終的に取得できるが、ランドマークに関する座標や、ラベルなどを保持している
- サンプルアプリだと、親指と中指の座標を確認してやっている
レイテンシに関する注意事項
- HandPoseRequestは複数検知できるが、必要最小限にしないとパフォーマンスに影響が出る
- body poseもほぼ同じ処理
- ARKitのモーションキャプチャーとの違いとしては、Visionはポイントごとに処理でき、サポートされているデバイスにも差がある。visionはapple watch以外。
What’s update in SwiftUI for iOS 14
SwiftUIの更新内容について
- 一度コードを書けばどのデバイスでも使えるもので、データバインディングなどができます
- appleはプラットフォームによる垣根をなくそうとしている模様
- 今年発表のAppleシリコンではMac OSでiOSアプリが起動したりなどをしている
- 今年のiOS14で、アップデートが多く、実践でも使える質になってきた
バグ修正
- tabbarとnavigation viewのスタック問題が解決した
- ios13では他のタブを選択してpushして画面タブに戻るともとに戻ってしまうのが治った!
- これのために本番に入れられないといった声もあったので、本当にいいアップデート
- NavigationViewのiPad縦向きでのPadding問題
- iOS 13ではNavigationViewに複数のViewをネストさせた状態でPaddingを追加するとiPadの縦向きでSplit Viewが表示される現象があったが治った!
- もともとsplitviewをswift UIで表現したかった
- ios14からiPadのレギュラーサイズがTabBarではなくSidebarが推奨になった。
- 3絡むまで表示できるようになった
- sidebarとtabbarを組み合わせてはいけない
App, Scene, WindowGroup
- アプリを100% SwiftUIでつくれるようになった。
- @mainというものが導入され、プログラムが最初に処理できるものを指定できる
- Appはメインメソッド
- Sceneはユーザに表示するViewの階層コンテナを表現できる
- WindwoGroupは同じ構造のウィンドウのグループを掲示するScene。
- ipadのマルチウィンドウ、macのマルチウィンドウで見せ方を変えれる
- アプリの起動を検知するには、AppDelegateを実装した後、@UIApplicationDelegateAdapterをいれることで対応できる
- バックグラウンドの検知は、@Environment(.scenePhase)を用いる
New UI Components
- LazyVStack, LazyHStackというのができ、Reuseの概念ができた
- LazyVGrid, LazhHGridでCollectionViewが使えるようになりました
- .adaptive(minimum:100)とかすると100のサイズで作れる
- OutlineGroup:ツリー構造のデータを折りたたみUIで表示非表示ができる
まとめ
- iOS13での不具合が治ってより使えるようになった
- sidebarが重要になった
- App, Scene, WindowGroupでSwiftUIだけでアプリがつくられるようになった!
- 新しいコンポーネントもたくさん追加された!
- サンプルコード
最強リジェクト対策&実践 SwiftUI
AppClipsはド直球シンプルであれ
- 自転車をAppClipsでレンタルできるサービスで、ドンキまで距離あるし、自転車使おうと思っているユーザがいたとして、Googleアカウント、パスワード設定、クレカ登録などがあると離脱しやすくなる
- この状況で、AppClipsがあると、FaceIDでログインしてApplePayで一瞬で使える
- →今後も使うとなったらアプリもDLする
Widgetsには未来を表示しろ
- なぜ今になってWidgetsか?→ホーム画面に陳列されるアプリが限定的になったと予想される。ホーム画面は汚さず、本当に必要なものだけにしてと思っているのでは。
- ユーザが必要そうなものを予測する必要がある
- 時間がどれくらいなのかというときにさっと時間がみれる
AppClips, WidgetsはAppleをパクれ
- AppClipsはappstoreのUIに近い。わざと似せることで、使い方がわかるようにシンプルにしている
Appleを愛しましょう
- Sign in with AppleやApple Pay, HIG, In-App Purchaseなど、確実にユーザを幸せにするツールたちと考えて使うといいのではないか
実践SwiftUI
- どう使いやすくなったかをSwiftUIのUICollectionViewとの違いを紹介
- 入れ子にした形でColumnを生成しているが、ios14からLazyVGridを使うことでCollectionViewを実現可能に
- サンプル
- Introduction to SwiftUIのセッションをおすすめ
iOS 14のピッカーあれこれ
ColorPicker
- Design with iOS pickers, menus and actions
- 色を選べるピッカー
- 色は保存して他のアプリにも使える
- スポイトツールも使える
- ボタンをタップするとColorPickerが表示され、色を選択するとbackgroud colorが変わるサンプルを作った
- selected Color
- getter, setterがある
- setterはピッカー起動時に指定する用途?
- supportsAlpha:アルファ値のスライダーをONにするかどうかの設定
- colorPickerViewControllerDidSelectColor: ピッカー上で色を選択されたら呼ばれる
- colorPickerViewControllerDidFinish: ピッカーを閉じた時に呼ばれる
DatePicker
- コンパクトモードインラインモードで表示できるようになった
- 時間はキーボードで入力可能に。
- Date、Time, Date/Timeの3種類を選べるが、.compact表示にすると、UIButtonのような日付表示をタップしてピッカーを起動できる。
- .inline表示はピッカーがそのまま埋め込まれていて、モーダルを出す手間が省けるため、iPaなどスペースが広かったらよいかもしれない
- なにか対応は必要か?
- UIDatePickerのAPIは全く同じ。
- ios14 SDKでビルドしたら、preferredDatePickerのautomaticの選択の挙動がcompact表示に変わるので注意
- 今まで通りにしたいなら、.wheelsにすればいい
- storyboardではDatePickerを置くだけ。ぱっとみはドラムロールが置かれてるように見えてるがちゃんと反映されます
まとめ
App Clipをざっくり把握しよう
AppClipとは
- アプリをDLしなくてもアプリの一部を体験できる
- NFCタグやスマートアプリバナーから起動できる
- Appleの例だとスムージー店にいった時に、Clipsで購入したりしていた
- ユニバーサルリンクのような形でURLを踏むと起動する
- AppClipカードにもガイドラインが決められていて、画面サイズやAsepectRatioなどきまっているが、AppConnectでおしてくだけ。
- アプリのフローイメージは、アプリがあって起動すると、タブがあって詳細をいくが、大切な機能だけ絞って実装する。
- 導入メリットとしてはアプリの体験してもらうハードルが下がる。要領が軽く、すぐに利用できる
- 活用例としては、スムージーを事前注文しててぽ受け取ったり、NFCタグを使って自転車貸出したり、美術館で作品の横にQRを用意して音声解説をしたりするなど
- 起動方法としてはQRやNFCタグ以外にも地図アプリからorder nowで起動したり、safariの上の方にopenとあったのが、app clipsに置き換えられたり、Siriの提案(ある位置に来た時に判断して)で起動したりもできる
- AppClipコードというものがあり読み取って起動もできる
AppClipの作り方
- サーバ側の準備として、apple-app-site-associationファイルにappclips項目を追加する
- AppClip用のターゲットを追加して、AssociatedDomainにサーバのドメインを追加
- NSUserActivityからwebpageURLを取得してappclipsの起動かどうかを判定して処理する
- AppClipを動かす上で必要なコードとアセットをAppClipターゲットに追加する
URLを設定する
- AppStoreConnectで、AppClipExperienceの設定をする(このURLならAppClipだよという設定をする
- AppClipカード、個々のExperienceのAppClipカードの設定も必要
- 物理タグの起動は高度な設定を行う
- DefaultのAppClipカードの設定だと、画像などを行う
- AppClipExperienceはURLや、どんな画像や文言をはめ込むかなどの設定を行う
デバッグ
- _XCAppClipURLを設定するとそのURLで起動してくれる
- URLのクエリにスムージーの種類や位置情報を渡してあげたりしている
FAQ
- AppClipだけ作って配布できる?→NG
- 複数のAppClipを設定できる?→OK
- 注文用と、予約用のAppClipExperienceをそれぞれのURLで設定できる
- ある店舗だけ挙動を変えれるか?→OK
- チェーン店などで、キャンペーンをするとかであれば特定の店舗のURLを登録しておけばいい
- アプリをインストール済みでAppClipExperienceをふんだら→アプリが開く
- ログインや支払い機能は使える?→OK
- Apple Pay, Sign in with Appleの利用が推奨
- ログインはタスク完了後に求めるのが望ましい
- プッシュ通知は使えるか?→OK
- 注文したスムージーが出来上がったrい、パーキングメーターの期限通知など
- 起動後、最大8時間までスケジュールできるが、8時間以上になるなら明示的に許可を求めてきます
- カメラなどの許諾はパウリにした後も再度取る必要あるか?→得には不要
- カメラなどの認証情報はアプリインストール時に引き継がれる
- 他にも移行したいデータが有れば共有データコンテナを用いる
- 位置情報、通知の許諾はいつものアラートを使うのか?
- 一定条件下ならAppClip上でOn/Offしてもらうこともできる
- AppClipはずっと残ってるか?→NG
- 30日ほど使われないとAppClipとそのデータは削除される
- バックグランド処理はできる?→NG
- TestFlight配信できる?→OK
まとめ
登壇者によるパネルディスカッション
座標を撮った後にどんなふうに処理してグー・チョキ・パーしているか?
- 指の先端の座標をとって、指の間の距離が近ければグー、離れていたらパー、一部近くて人差し指と中指が離れていたらちょきにしている
- 今回は五本の指をどれだけ正確にとれるかを判断するためにグー・チョキ・パーしていたが、距離をとっているので、指の形ではグーと判断されてしまうので、実際にやる時はグーのモデルを使って判定するといいと思う(pihero13)
macOSでもvisionできるか?
- macOSでもできる(pihero13)
- ARKitだと対応してないがvisionでは対応している
SceneDelegateの話について、iPadで同一アプリの複数ウィンドウみたいなことをやる必要がなければもういらないということか?
- おそらくやる必要はない・・・?複数ウィンドウやりたくないならAppDelegateだけで実装すればいい認識(hatakenokakashi)
AppClip8時間の通知パーミッション取得できるからプロモーションに使えそう
- プロモーションのためだけには使えない(akatsuki174)
- プロモーションだけという露骨なものはリジェクト対象になるかも(AkkeyLab)
日付選択、旧or新UIのどちらを採用するかは選択する日付によって変わるか。どちらがユーザの手数を減らせるか
- スタイルのプロパティがあるので、それで今まで通り選択すれば今まで通りでcompactやinlineなどで設定できるので開発者やデザイナーが選択すればいい(akatsuki174)
AppClipで付随するデータってUserDefaultsのみ?Keychainはどうなのか
- UserDefaultsだけじゃない。リワードを付与したいとかになった場合、共有のデータをコンテナに保存すれば使える。(akatsuki174)
- ログインした後にアプリをアップグレードしたらAppClipのデータを引き継げる
各許諾情報が引き継がれるということはそれ全体に本体アプリでチュートリアルが作られていると違和感がでるケースがあるかも?
- 今のiosは許諾されてるかどうかの値は取れるはずなのでそれをみて挙動を変えればいい(akatsuki174)
新機能や拡張を感じられる機能をたくさん知れて、オンラインだけれどもtwitterでのコメントを拾ってくれたりとなかなかよい報告会でした。
swift UIに関してはiOS14からようやく使い物になるものになってきましたが、iOS13を切らないといけないので、来年からようやく本腰を入れて導入といったところが増えそうな所感です。
また、AppClipを使ったアプリでうまく導入すればリアルとのアプリの融合といったこともできるので新しいアプリの体験としてぜひ導入してみたいですね。