#ca_swift CA.swift #9 WWDC19報告会 に参加してきたまとめ
サイバーエージェント主催の CA.swift #9 WWDC19報告会に参加してきたのでそのまとめです。
今回はAbema Towersで開催されていました。
初めて行きましたがとてもおっきいタワーでした。
Storyboard Preview by Swift UI
- SwiftUIはiOS13からだが、Preview機能使えばios13サポート切れるのを待たなくても良いのではないか?!
- Mastering Xcode Previews session233を見ればやり方わかります
- 運用中のプロダクトに導入してみた
- コードはここにおいてます
- 名前をサイズによって小さくして、端末によって非表示のものを出したりなどの画面でのデモ
- updateUIViewというメソッドで随時修正をしていく
- サーバから帰ってくる値(画像URLなど)を入れてあげることで変更が反映される
- プレビューの段階でデータ通信して画像をとってきてくれる
- xibファイルに対してSwiftUIを表示してあげて表示確認をするデモ
- updateUIViewというメソッドで随時修正をしていく
- extensionでUIViewRepresentableを継承して描画準備を行う
- 上記をすることでxibもSwiftUIが使えるようになる
- preview用のターゲットを作ることで分けることが可能
Image Processing with Vision Framework
- visionフレームワークはios11から導入されたフレームワークで、コンピュータビジョンアルゴリズムを適用するもの。
- コンピュータビジョンは画像や動画の特徴、テキストオブジェクトの検知やトラッキングができる
Saliency(顕著性)
- 感覚刺激がボトムアップ性注意を誘引する特性
- 画像内で目立つものや重要なもの(saliency)を指す
- object-based
- 被写体や全景のオブジェクトのハイライト度合いを目的
- attention-based
- 人々が見ている可能性、注目性が高い/低いものを見つける
- 注目されてるものに対してHeatmapとBounding boxが表示できる
- 色が濃いほど認識している
- Attention basedは人間性なものをよく見つける
- VNSaliencyImageObservationからヒートマップやbouncing boxを取得できる
- saliencyの検知活用例は、目立たない箇所の強調や、写真ビューアなどスライドショーでランダムで画像を拡大して画像効果をしたりして、画像鑑賞体験を上げる
Image classfication
- 画像を分類するための機能
- 大規模な分類ネットワークをゼロから作るには大変だが、Appleはそのプロセスを終えて、大規模ネットワークを公開する予定
- Taxonomy
- 階層構造になった1000クラスで意味のあるグループで分類されている。
- それぞれが方向関係、親子関係を持つ
- 動物→哺乳類→犬→パグ
- 動物→哺乳類→猫→ペルシャ
- 発表の例では犬や猫の種類も判定はしていた
- 画像を判定させるとラベルに対して信頼度の数値をとれる
- 実際に使う場合はhasMinimumPrecision / hasMinimumRecallを使って結果をフィルタリングできる
- Precision: 結果のうちどのくらい結果が正しいかを示す
- →どれだけ無関係な結果よりも関連性の高い結果を返すか
- Recall: 正解の中で結果のなかにどれくらい正解が含まれるかを示す
- →どれだけアルゴリズムが関連性のある結果を返すか
- 検索エンジンの例
- 検索エンジンで30件ヒットして、そのうち20件が関連し、関連している40件がひっとしなかった
- Precision : 20/30 = 2/3
- Recall : 20/(20+40) = 1/3
- PrecisionとRecallは一方が上がれば他方が低下する関係
- アプリケーションの特性にあったしきい値を設定するのが推奨されている
- F-measureという指標の評価を表す計算式があり、値が高いほどバランスが良い
Image Similarity
- 2つの画像がどれだけ相似しているかを示す機能
- 分類ネットワークが画像の表現を作成
- FeaturePrint
- 単語ベクトルのような画像ディスクリプタ
- 値が小さいほど、類似性の高さを示す
Other New API
- Face capture quolitiy
- Face Landmarks Enhancements
- Human detector
- Cat and Dog detector
- New Object Tracker
- Vision and CoreML
Sign In with Apple
- session 706, 504を参照
Sign In with Appleとは
- Respect for privacy
- アプリ開発社側は名前とメールアドレスしか取得できない
- サービス毎にprivateなメールアドレスを発行する
- Appleはサービス内の行動を追跡しない
- Security Built in
- 2段階認証を設定しているAppleIDのみ利用可能
- AppleデバイスではFaceID or TouchIDでサインイン可能
- Works everywhere
- iOS macOS tvOS watchOS、さらにjsが使えるのでブラウザで動作可能
- Antifraud
- デバイス上の機械学習やその他の情報によって新しいユーザーが人かBotかを判別する
- Signinしたあとのレスポンスに含まれている情報を参考にしてサービス側でアカウントを許可するかどうかを選べる
- ※Appleがサインインさせないとかではない
Sign In with Appleの構造
- アプリでサインインしたらAppleにユーザ情報を要求し、ユーザー識別子と情報をアプリに戻し、ユーザー所識別子に基づいてアカウントを作成して、アカウントを提供する
- jsでは指定したURLにリダイレクトして何度かAppleサーバと通信してアカウントを作成する
- ユーザー識別子はAppleDeveloperTeamで共通になる
- どのアプリでログインしても同じ識別子になる
- privateなメールアドレスに送信できるメールアドレスはAppleDeveloperで設定しないといけない
- privateメールアドレスを不正に手に入れてもメールを送れないようになっている
- OAuthやOpenID Connectのような認証企画のkey群を設定できる
- ServiceIDとAppIDに分けられる
- ServiceIDにはPrimary App IDやAPP ID、ブラウザなど指定できるようになった
- サービス毎に共通のPrivate emailがある
- 単体でsign witth appleを使う場合はservice idは不要
- ブラウザや他のアプリに紐付けるときにServiceIDは必要になる概念になる
Labで質問してきたこと
- privateなアドレスにメール送信する方法
- AppleDeveloperで事前に登録したドメインまたはアドレスで送る
- 送信者と受信者が一緒だとだめです。
- 最初に生成されたアドレスのみ有効な挙動だったが、毎回同じアドレスが生成されるよう修正されていた
- AppleDeveloperで事前に登録したドメインまたはアドレスで送る
- PrivateなアドレスのRevoke
- 設定アプリまたはブラウザからService単位でRevoke可能
- Sign In with Apple JSでのユーザ情報のとり方
- まだ提供していない
- 3rd Partyログインのボタンより上に置かない場合はリジェクト対象か
- HIGにそれっぽい記載があったが現在は消えている
- 3rd Partyログインをサポートしているアプリで、Sign In with Appleをサポートしない場合はリジェクト対象か?
- まだ決めてない
- AuthenticationServices.ASFoundationとはなにか?
- Foundationとの内部通信クラス
- アカウントを複数持てるサービスではどう対応すればよいか
- 一つのAppleIDで複数アカウントの作成をサポートしていない。サービス側で解決するしか無い
- Sign In with Appleでサインインしたあとに年齢などを追加で取得するのはありか?
- サービスとして必要な情報はとっても良い
- Facebook連携なども同様
- あくまでサインインの手段として提供している
Awaiting for New UI in iOS 13
Dark mode
- 暗いカラーパレットを用いたUI描画
- 設定アプリやコントロールセンターから設定できる
- 開発においてはシミュレータ→Setting→Developer、Developerツールなどから設定できる
- Light modeとDarkmodeの療法をサポートの必要あり
- ユーザが作成したコンテンツはユーザが選択したコンテンツを反映させることを推奨
- Dark mode反映しないならplistに設定
- 一部のところで反映したくないならプロパティを設定することで反映が可能
- System color
- LightとDark2つのカラーを提供
- アクセシビリティーの動作を行ったときのカラーも提供
- Grayに関しては2-6が追加。半透明のGrayも追加された。
- 交差する要素に対して設定する
- 色がさなっているときにalpha値を変更するのを避けたほうがいい
- Semantic Color
- 色の目的を表したColor
- .fill: アイコンや図形に設定できる
- Background Color
- primary/secondary,,がありviewを階層化することを想定
- Elevated Color: uiが重なっているときに少し明るいElevatedColorが使われる
- Custom Color
- コードとAssetでそれぞれ定義できます
- コードではsynamicColorを使って設定する
- Dynamic Images
- assetでdarkmode用の画像を追加
- SF Symbolesを可能な限り使用することを推奨
- Materials and Vibrancy
- MaterialsにはThick, regular thin などが追加されている
- Vibrancyにはlabel, fill, separatorが追加されている
- マイグレーション
- Custom ColorをDynamic Colorへ変更
- Storyboard上のcolorの定義をコードでの指定に変更
- Traitが変化したときにCALayerは動的に色が変わらないので、更新されたタイミングで毎回CALayerのカラーを更新する処理を入れる
- 他にもIndicatorの対応、attributed text, StatusBar、アイコンのSFSymbols化、SemanticColorの適応するのか、デザイナーやディレクターと対応自体するのかどうかも相談する必要あり
- 今の所ダークテーマ適応は推奨。
UI for iOS 13
- Flexible UI
- 2020/4までに対応が必要
- スプラッシュ画面でLaunchImageがdeprecated
- io13対応の場合どのデバイスサイズにも対応が必要
- Sheet
- defaultのModalがセミモーダルのSheetにデフォルトなる
- 複雑な処理をモーダルではしない
- 極力閉じるボタンをいれる
- 処理を表すタイトルを入れる
- 処理を中断するときはアラート表示する
- UIModalPresentationStyle
- 殆どは.pageSheetでの表示
- LandscapeモードではfullScreen
- UIImagPickerControllerではfullScreen
- 今までの全画面表示したい場合はfullScreenを選択
- Abemaにいれてみたらキャンセルボタンを押すときはアラートが出るが、スワイプジェスチャーでの閉じる処理がアラート表示うまくいかなかった。
- 閉じるときの対応として、isModalInPresentaionをtrueにすると閉じれなくなり、閉じるときに呼ばれるUIAdaptivePresentationControllerDelgateのメソッド内で処理を行う
- UISerachController
- UISearchControllerがよりカスタマイズできるようになった
- キャンセルボタンの表示非表示やresult controllerの選択ができるようになった
- 検索画面のTextFieldもカスタマイズ可能に。
- UISearchTokenが登場し、検索するものをUISearchTextFieldのテキストから検索条件を表示できる
- 複数条件の検索UIに使える
- Multiple Selection Gestures
- 日本指でスワイプするとセルの選択ができる
- delegateメソッドをshouldBeginMultipleSelectionInteractionAtIndexPathの返り値をtrueにすれば実装できる
- 2本指でやっているとdidSelectも呼ばれるのでうまく制御する必要あり
Sign In with AppleJS
- JSのライブラリでwebでもAppleIDでsign inできる代物
下準備
- Sign In with Appleを実装したいAppIDを選択
- ServiceIdを作成
- web domainとreturn URLをこのときにいれる
- return urlはsign inに成功したあとにリダイレクトするURL
- Domainの検証
- apple-developer-domain-association.txtを.well-knownディレクトリにおいて検証する
実装
- sign inに必要な情報として、client-id、scope、redirect-url、stateを渡す
- metaタグでなくてもjsで動的に埋め込みでも可
- Sign Inのボタンを配置
- ボタンの背景なども変更可能
- JSでボタンもかけます
- demo
できてないところ
- redirect先のURLにクエリパラメータでcodeとstateが渡ってくるので、stateの同一性を確認して、必要なパラメータをApple に送って、uniqueなIDを取得してwebユーザと紐付ける
QA
- Sign in with appleでアカウント作ったユーザがAndroidに機種変したらどうするの?
> Sign in with appleでアカウント作ったユーザがAndroidに機種変したらどうするの?
こちら同じService IDに所属しているサービスだったら同様の共通のユーザー識別子が返ってくるので、サービス側でアカウントを紐付ける仕組みを開発する必要があるかと思います… #ca_swift
— のんちゃん / Takeshi Ihara (@nonchalant0303) 2019年6月19日
Voice Controlはすごい
- アクセシビリティ機能の一部
- siriと似ているが、オフラインでも使用可能
- 機能をONにするためには、設定画面→Accessibility→VoiceControlをONにする
- 時刻の予告にvoicecontrolのマークがつく
- しかし対応言語は英語だけ
- できること
- open [google maps]とかいうとアプリを開ける
- show gridというと画面が分割され、「Tap 5」とかいうと底の部分をタップできる
- Show numbersというとタップできるところにTap Xとかいうとそこをタップする
- Show namesというとタップできるとところがラベルで出てきてtap nameでタップできる
- 新規にコマンド登録できたりする
- 例として、twitterでカメラ起動
- 単語登録をすると一つの単語として認識される
- アクセシビリティwith SwiftUI
- 標準UIパーツはデフォルトですでにアクセシブル
- カスタムUIパーツも自動でアクセシブル
- Middle Buttonという名前でButtonつければ自動的にラベリングされる
- 画像も画像の名前をつけると判定される。しかし名前がわかりにくいこともあると思うので、labelとして設定すればちゃんとラベルが振られる
- アクセシビリティを高めるためには、わかりやすいアクセシビリティラベルをつけてあげるといい
- 状態変化を自動で送信してくれる
- チェックボックスが変更されたときにシステム側で検知して読み上げ機能が変わったと読み上げてくれる
- reference: 238, recap-accecibility
チケットなくても楽しかったよ!
nameki様
- たくさんのイベントが同時開催されている
- AltConf, Try! Swift, Layers(デザイナー向け)、Live near WWDC(音楽イベント)、LoopBash
- AltConf
- 6/3-6/6やっている
- 初日はKeynoteとPlatform state of the Unionのライブ配信を見る
- 2Track + ラボ
- 無料
- Week in ReviewというセッションでJames Dempseyが技術系を歌にして振り返ってくれる
- Infinity Loop Apple社屋訪問
- USベイエリアに浸透しているアプリ
- Uber
- VTA, mini: アプリでチケット買って乗る
- Bird, Lime, アプリでQRコードを読み取って乗車開始。利用時間に応じて料金がかかる
- Bay Wheels: レンタル自転車
- クレジットカード決済: square
- イベントに参加していない時
- ライブ配信を見る
- 実際にコードを書いて試す
- 気になっていたバグや技術の調査
- Image Saliency試してみた
- 人間が注目するエリアを検出するもので注目するものがなければ真ん中らへんに視線が集まる
- 検出されるエリアはなかなかいいが時々外す。
- 解析にはそれなりに時間がかかるので、表示時に使うのは難しいので、画像編集時にクロップ領域を提案したりするのがいいと思う
@mogmetの所感
SwiftUIを使うにはサポートの問題からまだまだ先の話かなとは思ってはいましたが、使い方によっては導入する方法もあり、使い方はいろいろあると改めて感じました。
またVision Frameworkの説明とデモがいい感じに2つのLTに分かれていてとてもいい勉強会でした。
ますますVision Framework使って何かしらのアプリを作ってみたいですね。