（明るい音楽）
- 皆さん こんにちは そして ようこそ ライアンです
Firebaseチームの ソフトウェアエンジニアです
カナダのウォータールーオフィスで Apple SDKに取り組んでいます
- チェンです Firebaseチームの ソフトウェアエンジニアです
私もApple SDKに取り組んでいて
カリフォルニア州サニーベール オフィスを拠点としています
- Firebaseの使命は
アプリの構築と運用を簡単にして デベロッパーの成功を支援することです
- Firebaseはクロスプラットフォーム のモバイルデベロッパーツールキットであり
iOSに加えて Android、ウェブ、 C++、Unityをサポートします
ところで 皆さんがここに 来てくださった理由はわかっています
皆さんが私のように胸をはずませているなら Appleのエコシステムによって
マルチプラットフォームアプリの開発が 簡単になることが理解できるでしょう
iOSやiPadOSだけでなく
macOS、WatchOS、tvOS、 Catalystにも対応しているからです
とても充実していますね
Firebaseチームでは いくつかのユースケースを調べて
Appleのすべてのプラットフォームで Firebaseが利用できるようにしています
Appleプラットフォーム用の Firebase SDKは
iOS開発フローの可能性を解き放ち
将来に向けて さらに多くのことを実現していきます
- iOSやその他のApple プラットフォーム用のアプリでは
構築方法や実行方法が 過去数年間で変化しました
Swiftは アプリを構築するための デファクト言語になっています
このセッションでは Swiftの優れた 言語機能やフレームワークについて説明します
たとえば SwiftUIを使うと
シンプルかつ簡潔な構文で 美しいインターフェースを構築できます
Swift Package Managerを使うと
簡単にFirebase SDKを プロジェクトに含めることができます
async/awaitとCombineは
非同期プログラミングを 合理化する新しい方法です
Firebaseチームでは これらの変更を注視しています
今日は エコシステムのこれらの 変更に対する私たちのアプローチを紹介します
その前に チェン GitHubリポジトリで 起きていることについて話してくれるかな
- 説明しましょう
Firebaseでは 最初の一歩として
2017年にクライアントライブラリを オープンソース化しました
現在 Appleプラットフォーム向けの Firebase SDKの大部分は
GitHubで入手できます
2020年末には Firebase Performance SDKを オープンソース化しました
まだ見たことがない方は ぜひチェックして ご意見をお聞かせください
私たちは 透明性を 高め続けることをお約束し
より強力な デベロッパーコミュニティを構築します
現在までに 2,000を超える 問題を解決し
5,000を超えるプルリクエストを 受け取りました
Firebaseチームは GitHubで 皆さんとやり取りすることが大好きです
ぜひフィードバックをお寄せください
機能リクエストでも バグの問題でも構いません
SDKを開発しているエンジニアと じかに話ができます
ライアンも私もいます
また 技術的な 対話がはるかに簡単になります
すばらしい貢献者の コミュニティができて嬉しく思っています
現在 Appleプラットフォーム向けの Firebase SDKには 139人の貢献者がいます
コミュニティメンバーと Firebaseチームの間で
活発なオープンソース コラボレーションが展開されていて
Combineのサポートに関して 一緒に取り組んでいます
SDKの改善に貢献していただいた 皆さんには とても感謝しています
オープンソース化したことで 多くのことが実現できました
コードをステップ実行して SDKの動作を厳密に調査できるので
バグ調査の時間を短縮できました
新たな機能も実現できました
tvOS、macOS、Catalyst、WatchOS向けの コミュニティサポートなどです
最近では WatchOSの コミュニティサポートとして
Realtime Databaseと Remote Configが追加されています
現在 スマートウォッチアプリで このサポートを試せます
GitHubのディスカッションから 何でも質問してください
皆さんの多くは すでに Swift Package Managerを
使用して依存関係を管理しています
現在 Firebaseは
Swift Package Managerを 公式にサポートしています
現在は CocoaPodsに加え Swift Package Managerを使って
アプリにFirebase ライブラリを追加できます
とても簡単なので その方法を説明しましょう
まず Firebase iOS SDKの リポジトリのページからURLを取得します
ページからURLをコピーして 貼り付けます
この方法は GitHubで公開されている ほとんどのライブラリで利用できるはずです
ここで Xcodeでアプリを開き [File]をクリックし
[Swift Package]を選択します
次に [Add Package Dependency]を クリックし
URLを貼り付けて [Next]をクリックします
ターゲットにする バージョンまたはブランチを選択します
SDKの最新バージョンを 入手することをお勧めします
新機能だけでなく さらに重要なバグの修正や 改善が含まれているためです
するとすぐに 使用したいプロダクトを 選択できるようになります
ここでは Analyticsと Authを使います
新しいSwiftUI拡張APIも 試してみましょう
覚えておくべきことがあります 別のターゲットに追加する場合
たとえば 別にスマートウォッチ用の ターゲットがあり
スマートウォッチアプリだけに Messagingをインストールしたい場合
右側でターゲットを選択できます
完了したら クリックして終了します
パッケージを確認するには
次に [Project]をクリックして [Swift Packages]を選択します
後でFirebase SDKを追加する場合は
編集するターゲットに移動して [General]をクリックし
[Frameworks, Libraries, and Embedded Content]で
Firebase SDKを手動で追加したり 不要になったSDKを削除したりできます
Swift Package Managerを 使って新しいプロジェクトを作成できたので
SwiftとSwiftUIについて ライアンに詳しく説明してもらいましょう
- チェン ありがとう
このSDKは 主に Objective-Cで記述されていますが
すべてのAPIを評価して Swiftに どのようにインポートされるかを確認し
すばらしいエクスペリエンスが 提供されるようにしています
しかし Result型、 Codableのサポート、
デフォルトのパラメータ、列挙型や それに関連する型についてはどうでしょうか
私たちはObjective-Cで記述するとき Swiftの優れた機能を活用しています
ときには Swiftコードを書くことが 必要になることもあります
そのため さまざまなSDKに オプションの Swift拡張機能を同梱し始めました
中にはコミュニティの 貢献によって実現したものもあります
では いくつかのハイライトをご紹介します コードもたくさん登場します
これは Firebase Storageから 画像をダウンロードするスニペットです
従来の完了ハンドラ ブロックを使用しています
dataとerrorはどちらも オプショナルです
そのため 多少ぎこちないコードになり errorの強制アンラップが必要になります
避けることができるなら そうしたいものです
dataがnilの場合 常にerrorが設定され
errorがある場合 dataは常にnilになります
しかし 既存のコードでは それをコンパイラで強制することはできません
新しいSwift拡張機能が提供する 関数を使用するように切り替えると
この厄介な状態と 強制アンラップを排除できます
switchステートメントを使うと
２つの状態しかないことを コンパイラが保証してくれます
dataかerrorのどちらかがあり ほかの状態はありません
Firestoreとデータ解析に移りましょう
この短いコードスニペットは
Firestoreクイックスタートのもので 以前のバージョンでのデータ解析方法です
Firestoreからデータを取得した後
提供されたディクショナリから ローカルの型に変換します
今回は Restaurant型に変換します この種のコードになじみはありますか？
メニューを読むたびに悲しくなります
文字列をキーとしてデータをアンラップし
Swiftの型安全機能は使っていません
壊れやすくて読みにくいうえ 記述するときにミスしやすいからです
代わりに Restaurant型を Codableに準拠させます
Codableプロトコルに準拠することで
何も失うことなく 手動で解析するコードを削除できます
コードはコンパイラによって生成され 型全体で整合性を保ちつつ更新されます
これで Firestoreデータを 簡単に読み取ることができます
ドキュメントのスナップショットに対して データを関数として呼び出し
Restaurant型に渡すのも簡単です
オブジェクトを手動で解析する必要はなく Codableがすべて行ってくれます
Firestoreにデータを セットすることも簡単です
インスタンスのディクショナリ表現ではなく データをインスタンスに直接渡します
Firebase Database向けの APIも公開できました
外部の貢献者のおかげです
次に 新しくエキサイティングな SwiftUIを紹介します
私のお気に入りの機能です
最近 SwiftUI固有のAPIを いくつかリリースし 今後も続く予定です
WWDC 2020で 新しいSwiftUI アプリライフサイクルが紹介されました
これはプラットフォーム間で共有されます
これまでの推奨方法では FirebaseApp.configureを
AppDelegateのdidFinishLaunchingに 配置していました
では AppDelegateがない場合は どこに配置すればよいでしょうか？
アプリの起動時に呼び出される init関数をオーバーライドするだけです
そこでFirebaseApp.configureを 呼び出します
UIApplicationDelegateAdaptorを使って プッシュ通知などを扱う場合も同様です
これについては 後でチェンがデモで説明します
最初に紹介したい新APIは
Firebase向けGoogleアナリティクスで 手動画面表示イベントを記録するものです
既存のAPIは
UIKitの画面表示や画面クラスを 自動的に記録します
しかし SwiftUIには対応する UIViewControllerがありません
そのため SwiftUIでは動作しません
ありがたいことに 昨年 手動画面表示イベントが追加されたので
このイベントを記録するタイミングを 細かく制御できます
これはUIKitで開発する場合にも 当てはまります
viewDidAppearに組み込んでも ほとんど邪魔になりません
SwiftUIではどうなるか 見てみましょう
手動ロギングAPIの呼び出しは
onAppear修飾子を使って ビューが表示されるたびに行います
この方法は機能しますが かなり冗長であり コードが乱雑になるほか
ビューの構造から 逸脱する可能性があります
Objective-Cでは APIの観点から 提供できるものが制限されます
しかし Swiftでは より適切に操作できます
この場合は カスタムビュー修飾子を 使用する絶好の機会であり
これこそ 私たちが構築したものです
提供されるanalyticsScreenビュー修飾子で 任意のビューをマークアップできます
宣言するのは ビューの名前 そしてクラスはこの場合は構造ですが
呼称は既存のアナリティクスに 合わせています
ビューが表示されたときに記録したい 追加パラメータも宣言できます
Swiftのデフォルトの引数のおかげで
名前だけを指定して残りは省略できます
この例では 追加パラメータ引数を 省略しています
この新しい方法はとても有望です
ビューをマークアップすることで 画面表示イベントを記録します
SwiftUI関連で もう１つの改善を 公開しています
それは 独自のアプリ内 メッセージビューを作成する機能です
この例では modalInAppMessage 修飾子を使用しています
クロージャーはビュービルダーで 引数のmessageには
コンソールで構成された データが含まれます
また delegateは
アプリ内メッセージングSDKに インタラクションを通知するために使います
たとえば メッセージがタップや 消去されたときに
指標やインプレッションを記録できます
また 各メッセージタイプに 対応したAPIがあり
アプリ内メッセージから カスタムインターフェースを簡単に提供できます
関心がある他のSwiftUIヘルパーについて 何かアイデアがあれば
GitHubのディスカッションで お知らせください
コミュニティはCombineに興奮しています
それは無理もありません 私たちもそうです
コミュニティの皆さんには 非常に貢献していただきました
また 私たち自身で いくつかの変更に取り組んでいます
この領域でやるべきことはまだありますが
皆さんが期待できることを 少し紹介します
これは メールとパスワードで Authにサインインするパブリッシャーです
Authデータの結果や 関連するエラーの Combine Futureを返します
これは少し単純化されていますが このパイプラインでは
ユーザーを抽出し エラーをnilに置き換え
signedInUserプロパティに割り当てて UIに表示しています
さまざまな SDKを横断して 複数のパブリッシャーを取得し
皆さんの非同期データフローを支援します
Combine APIの進捗状況は
私たちが設定したGitHubプロジェクトで 確認できます
非同期処理コードが実現するすばらしい進展は Combineだけではありません
Swiftツールチェーンのリリースバージョンで 間もなくasync/awaitが公開されます
メールとパスワードでサインインする例を もう一度見てみましょう
今回は 完了ハンドラと async/awaitを比較してみます
ここでは 完了ハンドラを使用して 制御フローを処理しています
その完了ハンドラの中で さらに多くの非同期呼び出しを実行できますが
破滅のピラミッドに つながる可能性があります
async/awaitを使うと この呼び出しはどうなるでしょうか？
完了ハンドラブロックで 状態をすべて管理する必要はなくなります
同期コードに近く わかりやすくなります
他の非同期呼び出しについても 同じことが可能です
はるかに簡単に状態を維持できるほか
エラーを適切に処理できるようになります
ここで チェンに引き継いで エキサイティングなデモをご紹介します
- ありがとう ライアン
Firebaseで独立したスマートウォッチ アプリを作る方法について説明します
スマートウォッチで 毎日のコーヒー摂取量を追跡したいとします
独立したスマートウォッチアプリの優れた点は
スマートフォンと同期することなく 使用できることです
Firebaseを動作させると スマートウォッチアプリの開発は簡単になります
スマートウォッチが Firebaseクラウド サービスに直接接続するからです
現在 WatchOSがコミュニティサポート されているプロダクトがいくつかあります
そのため たとえば プッシュ通知をFirebaseコンソールから
スマートウォッチアプリに 直接送信できます
つまり コーヒーの摂取量を Realtime Databaseと同期できます
コンパニオンスマートフォンは 使いません
または クラウドストレージから 画像を直接ダウンロードすることもできます
知っておくべきことの１つは コンソールで設定したアプリは
Apple Store Connectの アプリと１対１で対応する必要があることです
アプリが複数のプラットフォームに 対応している場合は
１つのFirebaseアプリと GoogleService-Info.plistを
アプリを実行するすべてのプラットフォームで お使いください
これは iOSアプリの 拡張機能にも当てはまります
たとえば アプリのターゲットがiOSアプリ、 macアプリ、ウィジェットである場合
メインアプリのGoogleService-Info.plistファイルを すべてのターゲットにインポートします
これで Firebaseプロダクトが 正常にセットアップされました
次に plistファイルをXcodeに インポートします
ここでスマートウォッチアプリに プッシュ通知を直接送信する方法に戻ります
ここでは 最新の SwiftUIライフサイクルを使用します
利用できるExtensionDelegateが ないことがわかります
その理由は デフォルトでは SwiftUIライフサイクルに
AppやExtensionタイプの デリゲートが含まれないからです
ここで使うことができるのが WKExtensionDelegateAdaptorです
デリゲートをアプリに挿入し そこにコードを追加して
WatchOSのプッシュ通知 パーミッションをリクエストします
合わせて AppDelegateが必要になる Firebase SDK APIを処理します
この場合 Messaging SDKに apnsTokenを設定する必要があります
このステップは swizzlingが有効になっていれば Messagingが自動で行っていました
しかし swizzlingが 問題が明らかになるにつれて
WatchOSで このアプローチは 推奨しなくなりました
代わりに実装するメソッドが
WKExtensionDelegateの didRegisteredForRemoteNotificationsです
そして 手動でMessagingに apnsTokenを設定します
SwiftUIライフサイクルを使用する場合 iOSアプリにも同じことが当てはまります
UIApplicationDelegateAdaptor を使って
UIKitから独自の AppDelegateを挿入する必要があります
その後 AppDelegateを 必要とするコードを実装できます
次にお見せするコードスニペットでは
生き生きとしたかわいい画像を直接 スマートウォッチアプリにダウンロードします
ここでは Firebase Storageを 使っています
iOSアプリでもまったく同じコードを 実行できることに気付きましたか？
そうです Firebase Storageは
Messagingのような 特別な ウォッチキーAPIを必要としません
ほぼ同じコードを WatchOS、iOS、 tvOS、macOSアプリで使用できます
また いくつかのアプリ拡張サポートを 解放しました
これらのサポートは実際に役立ち
ユーザーがアプリにアクセスして さらに楽しいことができるようにします
例としてWidgetを取り上げます
WidgetExtensionは アプリ情報を表示するための優れた方法であり
アプリをより魅力的にして ユーザーがクリックするようにします
このコードスニペットは
ストレージを使用して画像を WidgetExtensionにプルできるようにします
このスニペットを使用すると WidgetKitでも画像を取得できます
アプリで重要な情報を ユーザーに伝える方法として
基本的なアイコンを置き換えることができます すばらしいと思いませんか？
デモは以上です
私たちと一緒にAppleアプリを構築する 時間を楽しんでいただけましたか？
GitHubリポジトリも ぜひチェックしてください
役に立つ情報がたくさんあります
試してみて バグを追跡し GitHubでディスカッション始めてください
皆さんがFirebaseで 作成するアプリを楽しみにしています
（明るい音楽）