Todd Kerpelman
Developer Advocate


iOS デベロッパーの皆さん、こんにちは!

iOS で Firebase バージョン 3.6 が利用できるようになったことをお知らせします。バージョン 3.6 には、重要なバグの修正や iOS 10 サポートに必要な機能が含まれています。そのため、できるだけ早く pod update を実行(またはフレームワークを手動アップデート)してプロジェクトを再コンパイルすることをお勧めします。

修正内容や機能強化の完全なリストはリリースノートでご覧いただけますが、ここでは新機能について簡単に紹介しましょう。

新しい通知のサポート

Firebase Cloud Messaging は、iOS 10 の新しいユーザー通知をサポートするようになります。iOS 10 で動作するアプリの場合、userNotificationCenter:willPresentNotification: withCompletionHandler メソッドで着信する通知を処理することができます。アプリが古い application:didReceiveRemoteNotification: completionHandler メソッドしかサポートしていなくても、新しいメソッドが存在しなければ APN は古いメソッドを呼び出しますので、心配はいりません。詳しくは、アップデートされた FCM のドキュメントをご覧ください。

アプリのレビュー ガイドラインに関する注意事項

iOS 10 のアップデートに伴い、Apple は App Store のレビュー ガイドラインに多くの変更を加えました。最新版の Firebase では、新しいガイドラインに対応するように多くの変更が行われています。最も重要なのは、NSCalendarsUsageDescription NSBluetoothPeripheralUsageDescription などに対してテキストを提供するよう促す iTunes Connect エラーが表示されないようにする必要があることです。

このガイドラインに従った結果、Safari で iOS 検索のアプリ インストール広告を測定していた機能が削除されています。

Firebase Invites を利用している方は、plist ファイルで NSContactsUsageDescription を提供する必要があります。Firebase Invites はこの連絡先情報を使ってユーザーが招待状を送る可能性がある友だちのリストを作成しています。

もちろん、このプロセスは現在も継続されています。私たちは、このような変更に細心の注意を払っていますので、必要な場合にはさらにアップデートを公開します。

ログインの回避策

Xcode 8 でシミュレータのキーチェーンに値を書き込めないため Firebase Auth がエラーとなるという最近の ブログ投稿を覚えている方もいるかもしれません。この問題はまだ存在しているため、端末ではキーチェーンを利用しつつ、シミュレータでは NSUserDefaults を利用する回避策を実装しています。これによって、シミュレータで Firebase Auth の開発やテストができるようになり、全機能が利用できるようになります。

バグの修正

皆様が見つけたバグは私たちが修正します。今後も、オンライン フォームから問題や機能リクエストをお寄せください。お寄せいただいた内容は適切に対応いたします。

質問は、Firebase タグを付けて Stack Overflow でお尋ねください。または、Google グループに送信していただいても構いません。

Firebase デベロッパーの皆様、いつもありがとうございます。ぜひ、アプリのアップデートをお願いいたします!


Posted by Khanh LeViet - Developer Relations Team

先週より、Android Studio 2.2 がダウンロードできるようになっています。Google I/O 2016 でプレビュー版が発表された Android Studio 2.2 は、世界中の数百万人の Android デベロッパーが使用する IDE の最新リリースです。

さまざまな機能強化が組み込まれた今回のリリースには、スピード、スマート、Android プラットフォーム サポートという 3 つの主なテーマがあります。アプリのユーザー インターフェースをすばやく直感的に作れる新しい Layout Editor などの機能は、開発のスピードを上げます。新しい APK Analyzer、強化された Layout Inspector、拡張されたコード分析、IntelliJ 2016.1.3 機能などによって、今まで以上にスマートな開発を行うことができます。また、Android アプリ開発の公式 IDE である Android Studio 2.2 では、Android 7.0 Nougat の最新デベロッパー機能がサポートされています。たとえば、マルチ ウィンドウのサポートクイック設定 API、再設計された通知などの Android プラットフォーム機能を追加するためのコード補完、そしてもちろん、これらすべての機能をテストすることができるビルトイン Android Emulator などの機能が含まれています。

今回のリリースでは、Android フレームワークと IDE をともに進化させた Constraint Layout が導入されています。この強力な新しいレイアウト マネージャーによって、大きく複雑なレイアウトをフラットで効率的な階層を使って設計できるようになります。ConstraintLayout は新しい Layout Editor とともに構築されており、標準 Android サポート ライブラリと同じようにアプリに組み込むことができます。

Android Studio 2.2 には、設計、開発、ビルド、テストという開発プロセスの主なフェーズのすべてを網羅する 20 以上の新機能が含まれています。新しい ConstraintLayout による UI の設計から、Android NDK と C++ コードによる開発、最新の Jack コンパイラーによるビルド、アプリの Espresso テストケースの作成まで、Android Studio 2.2 は見逃してはならないアップデートになっています。以下では、いくつかの重要なアップデートについて詳しく説明します。

設計
  • Layout Editor: 新しいユーザー インターフェース デザイナーによって、Android アプリのユーザー インターフェースの作成が今までになく簡単になります。新しく導入されたブループリント モードでアプリの UI 構造をすばやく構築し、新しいプロパティ パネルで各ウィジェットの視覚属性を調整できます。詳細を見る
Layout Editor
  • Constraint Layout: この新しいレイアウトは、複数のレイアウトをネストすることなく、アプリの動的なユーザー インターフェースを作成できる柔軟なレイアウト マネージャーです。Android API レベル 9(Gingerbread)以降と下位互換性があります。ConstraintLayout は、Android Studio 2.2 の新しい Layout Editor とともに使用するのが最適です。詳細を見る
ConstraintLayout


開発
  • C++ サポートの強化: Gradle から C++ プロジェクトをコンパイルする際に CMake か ndk-build を使用できるようになるため、CMake ビルドシステムから Android Studio へのプロジェクトの移行がシームレスになります。Android Studio の新規プロジェクト ウィザードにも C++ サポートが追加され、C++ の編集やデバッグに関する多くのバグの修正がされています。詳細を見る
C++ のコード編集と CMake のサポート

  • サンプル ブラウザ: Android Studio 2.2 では、Android サンプルコードの参照がさらに簡単になります。コードエディタ ウィンドウ内で Google Android サンプルコードにあるアプリのコードを使用することによって、アプリ開発を最初からスピードアップすることができます。詳細を見る
サンプルコード メニュー


ビルド
  • Instant Run の強化: Android Studio 2.0 で導入された Instant Run は、Android 開発を高速化、軽量化するための Google の主要な長期的投資です。この機能がリリースされてから、多くのデベロッパーの編集、ビルド、実行のサイクルが大きく改善されています。今回のリリースでは、たくさんの安定性や信頼性の向上が行われています。以前のバージョンで Instant Run を無効にしている方も、ぜひ Instant Run を有効化して、以前に発生した問題が解消されているかどうかをお知らせください([Settings] → [Build, Execution, Deployment] → [Instant Run](Windows/Linux の場合)、[Preferences] → [Build, Execution, Deployment] → [Instant Run](OS X の場合))。詳しい修正点については、Android Studio 2.2 リリースノートをご覧ください。
Instant Run の有効化

  • APK Analyzer: APK の内容を簡単に調査し、各コンポーネントがサイズに与える影響を把握することができます。この機能は、multi-dex の問題のデバッグに役立つ場合もあります。また、APK Analyzer を使って APK の 2 つのバージョンを比較することもできます。詳細を見る
APK Analyzer

  • ビルド キャッシュ(試験運用版): ビルドの高速化に向けた投資は継続的に行われており、今回はその一環として、新しいビルド キャッシュが試験運用版として搭載されます。これによって、フルビルド、増分ビルドの両方の時間が短縮されます。この機能は、gradle.properties ファイルに android.enableBuildCache=true を追加するだけで有効になります。詳細を見る

ビルド キャッシュの設定


テスト
  • Android Emulator の仮想センサー: Android Emulator にいくつかの仮想センサー コントロールが新しく搭載されます。新しい UI コントロールを使って、加速度計、気温計、磁力計などの Android センサーをテストできます。詳細を見る
Android Emulator の仮想センサー

  • Espresso テスト レコーダー(ベータ版): Espresso テスト レコーダーを使うと、アプリとのインタラクションを記録して UI テストを簡単に作成できます。記録したテストは、UI テストコードとして出力されます。端末を使ってインタラクションを記録し、アプリの特定のスナップショットの UI 要素を確認するアサーションを追加すると、Espresso テスト レコーダーは保存された記録を読み出して対応する UI テストを自動的に生成します。テストはローカルで実行できる他、継続的インテグレーション サーバーやFirebase Test Lab for Android を使って実行することもできます。詳細を見る
Espresso テスト レコーダー
  • GPU デバッガー(ベータ版): GPU デバッガーがベータ版になりました。Android 端末上で OpenGL ES コマンドのストリームをキャプチャして Android Studio 内で再生し、分析できます。指定した任意の OpenGL ES コマンドにおける GPU の状態を完全に調査できるため、グラフィック出力を詳細に把握してデバッグできます。詳細を見る
GPU デバッガー

Android Studio 2.2 に含まれる主な機能をまとめます。
設計

開発
ビルド

テスト

Android Studio 2.2 の詳細については、リリースノートプレビュー ブログ投稿をご覧ください。

スタートガイド

ダウンロード

旧バージョンの Android Studio をご使用中の方は、ナビゲーション メニューから安定版チャンネルのアップデートを確認できます(Windows / Linux の場合は [Help] → [Check for Update]、OS X の場合は [Android Studio] → [Check for Updates])。Android Studio 2.2 は、公式ダウンロード ページからもダウンロードできます。Android Studio のすべての新機能や機能強化を利用するには、アプリのプロジェクトの Android Gradle プラグインのバージョンを 2.2.0 にアップデートする必要があります。

次のリリース

今回のリリースに協力いただきました Android デベロッパー コミュニティの皆様、どうもありがとうございました。皆様の貢献、今回のリリースの新機能の元となった継続的なフィードバック、Canary ビルドやベータ版の試用、バグの報告に感謝いたします。私たちは全員、安定性向上やパフォーマンスの修正、そして多くの新機能が搭載された Android Studio 2.2 を最高のリリースとなることを願っています。次のリリースはさらに優れたものをご期待ください。フィードバックへの対応、既存機能の品質や安定性の向上によって、皆様の生産性をさらに上げることができるよう、私たちは懸命に努力を続けています。

気に入った機能や問題点、新機能の提案などのフィードバックは大歓迎です。Google+ のページや Twitter で Android Studio 開発チームからの情報をチェックしてください。

Android Studio 2.2 の新機能



Posted by Yuichi Araki - Developer Relations Team



Doug Stevenson
デベロッパー アドボケート


Android 向けの Firebase のクライアント API を使用する際に、デベロッパーのリクエストに応じて Firebase で非同期的に処理を実行させたいケースがあります。たとえばリクエストされたデータをすぐに取得できない場合や、一番最後に何か処理を実行しなければならない場合などです。なお、「アプリ内で処理を 非同期的に 行う」というのは、アプリにおいて最優先すべきビューのレンダリング処理と同時に実行しつつ、かつレンダリングの妨げにならないように処理をする、という意味です。この非同期処理を Android アプリで適切に行えば、任意の処理が Android のメインスレッドを長時間を占有するという事態は回避できます。逆に非同期処理に問題があると、一部のフレームのレンダリングが遅れ、ユーザー エクスペリエンスにおいてカクツキが発生します。さらにひどいと、ANR という最悪の状態に陥ります。遅延を引き起こす代表的な処理には、ネットワーク リクエスト、ファイルの読み取りおよび書き込み、時間のかかる演算などがあります。これらを総称して ブロッキング タスク と呼びます。メインスレッドのブロックは絶対に避けたいところです。

Firebase API を使用して、通常メインスレッドをブロックするような処理をリクエストする場合は、カクツキや ANR を回避するため、その処理を別スレッドで行うよう API で調整をしなければなりません。処理が完了した後は、確実にビューを更新するために結果をメインスレッドに返さなければならない場合もあります。

これを行うのが Play Services Task API です。Task API の目的は、簡単かつ軽量な、Firebase (および Play サービス)クライアント API 向けの Android 対応フレームワークを提供し、処理を非同期に実行できるようにすることです。この API は、Firebase と共に Google Play Services 9.0.0 で導入されました。アプリに Firebase の機能を使用している方は、気づかないうちに Task API を使用していたかもしれません。この一連のブログ記事では、Firebase API で Task を利用する方法を紹介し、高度な利用パターンもいくつか取り上げます。

本題に入る前に知っておいていただきたいのが、Android のあらゆるスレッド技術を Task API で代用できるわけではないという点です。スレッド用のツールには ServicesLoadersHandlers など多様なものがあり、各機能の内容は Android チームが詳細なドキュメントにまとめています。さらに YouTube には Application Performance Patterns の全シーズンがアップされており、こちらの動画でさまざまな手法を学ぶことができます。また、サードパーティのライブラリを利用して Android アプリのスレッド処理を行っているデベロッパーもいます。ぜひ、さまざまなソリューションについて学び、自身のスレッド要件に合った最適な手法を見つけてください。なお Firebase API では、スレッド処理の管理に一貫して Task を使用していますので、これと相性のよい手法を組み合わせて利用することをおすすめします。

シンプルな Task の例

Firebase Storage をご利用の場合、どこかで必ず Task を目にしたことがあるはずです。以下はファイルのメタデータのドキュメントからそのまま引用したコードで、ストレージにアップ済みのファイルのメタデータを取得するシンプルな例です。
    // Create a storage reference from our app
    StorageReference storageRef = storage.getReferenceFromUrl("gs://");

    // Get reference to the file
    StorageReference forestRef = storageRef.child("images/forest.jpg");

    forestRef.getMetadata().addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(StorageMetadata storageMetadata) {
            // Metadata now contains the metadata for 'images/forest.jpg'
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Uh-oh, an error occurred!
        }
    });

このコードには「Task」が見当たりませんが、実際には Task が機能している箇所があります。上記のコードの後半部分は、次のように書き換えることができます。
    Task task = forestRef.getMetadata();
    task.addOnSuccessListener(new OnSuccessListener() {
        @Override
        public void onSuccess(StorageMetadata storageMetadata) {
            // Metadata now contains the metadata for 'images/forest.jpg'
        }
    });
    task.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Uh-oh, an error occurred!
        }
    });

どうやら、コード内に隠された Task があったようです。

処理をすると約束する

書き直した上記のコードを見ると、Task を使用してファイルのメタデータを取得する方法がよくわかります。StorageReference の getMetadata() メソッドは、ファイルのメタデータがすぐには利用できないと想定して、データを取得するためにネットワーク リクエストを行います。そのネットワーク アクセスにおいて呼び出し元のスレッドがブロックされないように、getMetadata() は Task を返しておきます。この Task をリッスンすることで、最終的に処理が成功したか失敗したかがわかります。次に API は、制御するスレッドでリクエストを実行するよう調整します。このスレッド処理は API 内で行われるため詳細は把握できませんが、結果が利用できるようになると、返された Task を介して通知がきます。返された Task は、処理が完了した後に、追加したリスナーのいずれかを必ず起動することを保証するものです。このような形で非同期処理の結果を扱う API は、プログラミング環境によっては Promise と呼ばれます。

ここで、返された Task が StorageMetadata 型によってパラメータ化されていることに注目してください。これは OnSuccessListener で onSuccess() に渡されるオブジェクトの型でもあります。実際、すべての Task はこのように総称型を宣言して生成したデータの型を示し、その総称型を OnSuccessListener で共有する必要があります。また、エラーが発生すると、Exception が OnFailureListener の onFailure() に渡されます。これは、失敗時に実行する指定の例外処理になります。Exception の詳細情報を知りたい場合は、その型を調べて、期待する型に安全にキャストする必要があります。

最後にもう 1 つ、このコードについて知っておくべきことは、リスナーはメインスレッドから呼ばれるということです。Task API で、自動的にそうなるように調整をしています。StorageMetadata が利用可能になった際に、メインスレッドで行わなければならない処理がある場合は、それをリスナー メソッド内で実行できます。(ただしメインスレッドのリスナー内では、ブロッキング タスクを決して実行しないように注意してください)これらのリスナーには他にもさまざまな利用方法がありますので、次回以降の記事でその詳細を説明します。

一発勝負

Firebase には、Task に関連のないリスナーに対応した API を提供する機能もあります。たとえば Firebase Authentication を使用している場合、ユーザーがアプリのログイン、ログアウトに成功した瞬間を検出するために、ほぼ間違いなくリスナーを登録しているはずです。
    private FirebaseAuth auth = FirebaseAuth.getInstance();
    private FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
             // Welcome! Or goodbye?
        }
    };

    @Override
    protected void onStart() {
        super.onStart();
        auth.addAuthStateListener(authStateListener);
    }

    @Override
    protected void onStop() {
        super.onStop();
        auth.removeAuthStateListener(authStateListener);
    }

FirebaseAuth クライアント API は、addAuthStateListener() でリスナーを追加した際に、2 つの主要な処理を必ず実行します。まずは、現在判明しているユーザーのログイン状態に基づいて、すぐにリスナーを呼び出します。もう 1 つは、リスナーが FirebaseAuth オブジェクトに追加されている限り、以降、ユーザーのログイン状態が変わるたびに毎回リスナーを呼び出します。この動作は Task とは大きく異なります。

Task の場合は、結果が利用可能になって初めて、追加されたリスナーを最大で 1 回だけ呼び出すことができます。また、リスナーが追加される前に、既に結果が利用可能であった場合は、Task はすぐにリスナーを起動します。Task オブジェクトは、最終的な結果オブジェクトを効率的に記憶しておき、その内容を以降のリスナーに引き継いで処理します。これは、リスナーがすべてなくなり、ガベージ コレクションが実行されるまで続きます。よって Task オブジェクト以外のもので、リスナーと連携する Firebase API を使用する際は、必ずその動作を理解するようにしてください。すべての Firebase リスナーが Task リスナーのように動作するわけではありません。


もう 1 つの重要なステップ

追加した Task リスナーのアクティブな有効期間を考慮しましょう。それを怠ると 2 つの問題が生じます。まず、追加したリスナーが参照しているアクティビティと、そのビューの有効期間を超えて Task が動作することで、アクティビティのリークが生じるおそれがあります。次に、不要になったリスナーが実行されると無駄な処理が走り、すでに無効なアクティビティ状態にアクセスする処理が行われる可能性があります。このブログの次のパートでは、これらの問題とその回避方法を詳しく説明します。

このシリーズのパート 1 のまとめ

今回は Firebase のサンプルコードについて簡単に説明し、Play Services Task API の概要と(隠された)使用法を紹介しました。Task は、Firebase において処理時間が予測できず、かつメインスレッド以外で実行すべき処理に対応するための手段です。Task を使用すると、リスナーによってメインスレッドに戻って処理結果を扱うようにすることもできます。ただ、この記事で紹介した Task の機能は、ほんの一部にすぎません。次の記事では、さまざまな Task リスナーを紹介しますので、ぜひ自身のユースケースに応じて最適なリスナーを選択してください。

質問がありましたら、Twitter でハッシュタグ #AskFirebase を検索するか、firebase-talk Google Group をご利用ください.専用の Firebase Slack チャネルも用意しています。Twitter で @CodingDoug のフォローもよろしくお願いします。


Posted by Khanh LeViet - Developer Relations Team


現在の Chrome は、HTTP 接続をニュートラルな接続インジケーターとして表示していますが、これでは HTTP 接続が安全でないことが伝わりません。HTTP 経由でウェブサイトを読み込むと、ネットワーク上にいる他者がサイトの情報を事前に盗聴したり改ざんしたりすることができます。

現時点で、大半のウェブ トラフィックは HTTPS に移行しており、HTTPS の使用は増え続けています。まもなく、パソコン版の Chrome に読み込まれるページの半数が HTTPS になるというマイルストーンに到達します。また、Google が 2 月に HTTPS レポートをリリースしてから、トップ 100 ウェブサイトのうちさらに 12 サイトがデフォルトのコンテンツの提供を HTTP から HTTPS に変更しています。

調査によれば、ユーザーは「安全」アイコンがないことを警告として受け取りません。また、頻繁に現れる警告は無視されがちです。HTTP サイトを安全でないと明示するという Google の計画は、厳密な基準に基づいて徐々に進められる予定です。2017 年 1 月の Chrome 56 以降では、フォーム項目にパスワードやクレジット カードの情報がある HTTP ページを「Not secure」(安全でない)と明示します。これは、この件が特に重大な問題であることを考慮した結果です。

以降のリリースでも、継続的に HTTP の警告を拡張する予定です。たとえば、ユーザーが高度なプライバシーを求めるシークレット モードで HTTP ページを「Not secure」と明示することなどを検討しています。将来的には、すべての HTTP ページを安全でないと明示し、HTTP セキュリティ インジケーターを、破損した HTTPS に対して表示されるものと同じ赤い三角形に変更する予定です。


今後のリリースが近づいた際にアップデートした計画を公開しますが、HTTPS への移行はできる限り早く進めてください。HTTPS は今までになく簡単で安価に導入できるようになっており、HTTP では実現できない最高のパフォーマンス強力な機能を提供します。導入にあたっては、Google のセットアップ ガイドをご確認ください。



Posted by Eiji Kitamura - Developer Relations Team
Share on Twitter Share on Facebook

暗号化のサポートは、Android エコシステム全体でも強化されています。Marshmallow 以降、すべての対応端末は暗号化のサポートが必須になっています。Nexus 5X や 6P のような多くの端末でも、ARM TrustZone などの信頼できるハードウェアからのみアクセス可能な一意なキーが使われています。7.0 Nougat では、すべての新しい Android 対応端末でこういった種類のキー ストレージのハードウェア サポートが必須となっています。これによって、総当たり攻撃に対する保護を提供しつつ、キーが使用される前にロック画面で資格情報を検証するようになっています。以上のような仕組みによって、すべてのデータは自分の端末上で本人によってしか復号化できないようになっています。

メディア スタックとプラットフォームの強化

Android Nougat では、メディアサーバーの再構築と強化が行われています。メディアサーバーは、信頼されていない入力を処理する主要なシステム サービスの 1 つです。まず、Clang の UndefinedBehaviorSanitizer の一部である整数オーバーフローの無害化を取り入れることによって、報告されている libstagefright のバグの大半を占む、あらゆる種類の脆弱性を防止しました。整数オーバーフローを検知すると、攻撃を防ぐためにプロセスをシャットダウンします。さらに、メディア スタックをモジュール化して各コンポーネントを個々のサンドボックスに入れ、各サンドボックスの権限を厳格化して、ジョブの実行に最低限必要な権限のみを持たせるようにしました。この封じ込め技術によって、攻撃者がスタックの多くの部分の欠陥をついて取得できる権限は非常に小さなものになり、カーネルの攻撃対象領域も大幅に削減されています。

メディアサーバーの強化に加え、次のようなさまざまなプラットフォームの保護機能も追加されています。

アプリのセキュリティ改善

Android Nougat は、アプリのデベロッパーにとって最も安全で最も簡単に使える Android のバージョンです。

さらに、有害な可能性があるアプリからユーザーを保護するために、アプリのパーミッションや機能の改善が継続されています。

システム アップデート

また、OTA アップデート システムが大幅に拡張され、最新のシステム ソフトウェアとセキュリティ パッチによって端末を最新の状態に保つ方法がはるかに簡単になっています。OTA のインストール時間を大幅に短縮し、セキュリティ アップデートの OTA サイズも小さくなっています。アップデート プロセスの中でも特に時間がかかるアプリの最適化ステップを待つ必要はなくなりました。これは、インストールとアップデートを高速に行えるように新しい JIT コンパイラーが最適化されたためです。

ファームウェアがアップデートされた Nougat を実行している新しい Android 端末では、アップデートがさらに高速に行えるようになっています。Chromebook と同様に、アップデートは端末が通常どおり実行されている間にバックグラウンドで適用されます。アップデートは別のシステム パーティションに適用され、再起動した際に新しいバージョンのシステム ソフトウェアを実行しているパーティションにシームレスに切り替わります。
Google は Android のセキュリティ改善のための作業を続けており、Android Nougat はあらゆる面で大幅なセキュリティ改善が図られています。いつものように、作業に対するフィードバックや Android の改善提案は大歓迎です。[email protected] までご連絡ください。


Posted by Yuichi Araki - Developer Relations Team
Share on Twitter Share on Facebook



Google では、2016 年 10 月 7 日(金)に Material Design にフォーカスした開発者向けイベント「Google Developers LaunchPad Build Tokyo 2016」を開催いたします。本イベントでは、Google のエンジニアや外部の企業が、UI/UXを改善したことによって実際にどのような効果があったのかや、アプリの開発におけるデザインの活用方法などをご紹介します。


■イベント概要




■プログラムの一部のご紹介




外部からは、TimersウフィカC CHANNELFablicマネーフォワードといった企業の方にご登壇いただき、アプリのビジネスにおいてデザインがいかに重要かについてお話しいただく予定です。

※プログラムは予告なく変更させていただく可能性があります。予めご了承ください。

本イベントの詳細および参加のお申し込みに関しては、こちらのサイトをご覧ください。ご参加いただける方には、参加証を 9 月 28 日(水)より順次ご登録頂いたメール アドレス宛にお送りする予定です。

みなさまのご参加を、心よりお待ち申し上げております。



Posted by 鈴木拓生 Developer Relations Team
Share on Twitter Share on Facebook


Parul Soi
Developer Relations プログラム マネージャー

データを分析して適切な対応ができるかどうかによって、会社が成功するか失敗するかが決まる場合もあります。過去数年間、この分析するデータは大きく拡大し、それに関わるアプリ デベロッパーの数もトラッキングされるイベントの数も増え続けています。しかし、データが多すぎて何を探しているか自分でもわからなくなることが多いのが実情です。

では、製品を改善するためにどのような指標をトラッキングすればよいのでしょうか。

データ分析は非常に大きな分野であり、世界中でいくつかもの人気のある手法やフレームワークが使われています。特に技術製品に関連する分野で人気のあるフレームワークの 1 つが Pirate Metrics です。この用語は、500 Startups の設立者である Dave McClure が生み出したものです。この手法は製品ユーザーのライフサイクルをシンプルにかつ明細に表しているため、世界中のプロダクト マネージャーやグロース ハッカーの人気を集めています。

本投稿では、Pirate Metrics を構成する 5 つの指標を紹介し、その重要性について考えてみます。本シリーズの以降の投稿では、Firebase 製品を使ってこれらの指標を向上させ、製品をさらに魅力なものにする方法について考える予定です。
ステージ 1

どんな製品でも、ユーザー ライフサイクルの最初の要素はユーザー獲得です。これは、ユーザーが皆さんのアプリをインストールするということです。ユーザーの獲得はさまざまな方法で行うことができます。これには、ソーシャル メディア マーケティング、App Store の最適化、検索、ニュース、コンテンツ マーケティングなど、あるいは広告などの手法があります。

ステージ 2

ユーザーを獲得することができたとしても、仕事はまだ半分も終わっていません。次は、ユーザーが手元に置いておくべきアプリであることを確信してもらう必要があります。そのためには、アプリが特別なものであるということを経験してもらい、ユーザーを活性化させる必要があります。たとえば、ゲームであればユーザーにトレーニング レベルを終えてもらうこと、写真フィルタアプリであれば、1 つの画像で実験してもらうことがこれに当たるでしょう。

ステージ 3

ほとんどの製品にとって、最大の難関となるのが獲得したユーザーを維持することです。一般的なユーザーが毎日使っているのは、インストールしているアプリのわずか 26% です。ユーザーは、数日でアプリをアンインストールしたり、単にダウンロードしたことを忘れてしまう傾向があります。新しい健全な製品にとっての目標は、それを維持する戦略を見つけてリピート率を上げることです。

ステージ 4

また、ユーザーには最大のサポーターになってもらいたいと思うでしょう。紹介キャンペーンほど強力な獲得戦略はありません。製品を気に入ったユーザーは、友人にも試してみるよう心から勧めたくなります。もちろん、皆さんはユーザーにそうしてもらいたいと思うでしょう。それにはユーザーを阻害するような要素は取り除く必要があります。

ステージ 5

最終的に、企業を拡大させ、さらに多くのユーザーを獲得できるよう、アプリを収益化します。

この獲得活性化維持紹介収益化という 5 つのステージは、まとめて Pirate Metrics と呼ばれています。これはかなり汎用的で、ほとんどのデジタル製品に適用できます。プロダクト マネージャーは、これらの指標をトラッキングするためにさまざまなツールを使用しています。しかし、新しい Firebase を使うと、各指標を 1 か所でトラッキングできるだけでなく、それを向上させることができるさまざまなツールを活用することもできます。

この点については、今後の投稿で紹介します。ご期待ください。


Posted by Takuo Suzuki - Developer Relations Team
Share on Twitter Share on Facebook

動作の仕組み

これは、JavaScript 用に Closure Compiler を書き換えたものではなく、Node や古いブラウザでも実行できるように Java ソースを JS にコンパイルしたものです。Closure Compiler についてのすべての投稿やリソースは、このバージョンにも適用されます。

Closure Compiler の内部についての詳細は、Google の Closure チームの一員である Dimitris によるこの投稿Closure Tools ブログの投稿、Closure についての説明やそれがどのようにプロジェクトに役立つかを説明した 2016 年の投稿をご覧ください。

なお、JS 版は試験運用版であることにご注意ください。まだネイティブ Java 版とは同じように動作しない可能性がありますが、私たちはコンパイラー ファミリーへの興味深い追加機能であると考えています。Closure チームは今後も改善とサポートを継続する予定です。

使用方法

JS 版の Closure Compiler をプロジェクトに含めるには、NPM を使ってプロジェクトに依存性を追加する必要があります。
npm install --save-dev google-closure-compiler-js

次に、Gulp でコンパイラーを使用するために、次のようなタスクを追加します。
const compiler = require('google-closure-compiler-js').gulp();
gulp.task('script', function() {
  // select your JS code here
  return gulp.src('./src/**/*.js', {base: './'})
      .pipe(compiler({
          compilation_level: 'SIMPLE',
          warning_level: 'VERBOSE',
          output_wrapper: '(function(){\n%output%\n}).call(this)',
          js_output_file: 'output.min.js',  // outputs single file
          create_source_map: true
        }))
      .pipe(gulp.dest('./dist'));
});

google-closure-compiler(動作には Java が必要です)から移行する場合、gulp.src() またはそれに代わる機能を使ってコンパイル前に JavaScript を読み込む必要があります。

詳細については、使用方法サポートされているフラグデモ プロジェクトをご確認ください。現在利用可能な試験運用版では、Java リリースのすべてのフラグがサポートされているわけではありませんが、何か見逃していることがあった場合には、このコンパイラーが例外を通して教えてくれるでしょう。


Posted by Eiji Kitamura - Developer Relations Team
Share on Twitter Share on Facebook


Doug Stevenson
デベロッパー アドボケート

多くのデベロッパーの皆様に Firebase を試していただいていることをとてもうれしく思っています。試用環境を本番環境に移行した方もいらっしゃるでしょう。その中で、Android プロジェクトのビルドをどう管理すればよいかについて疑問に思った方もいらっしゃるかもしれません。一番よくある質問は、こんなものではないでしょうか。「毎日の開発データとリリースデータを分けるには、どうすればよいでしょうか?」

分析を行う際には、 実際 のアプリの利用データ(開発時の 人為的 な利用ではないもの)のみを反映させたいと誰もが思うでしょう。また、日々の開発でのクラッシュ データと、公開されているリリース版のクラッシュ データが混在していては不便です。何よりも、開発チームが拡大してアプリが複雑になると、お互いの作業が衝突しないように、各チームメンバーの作業環境を個々のサンドボックスに分割したいと考えるはずです。

ここでは、プロジェクトを設定してこういった状況に対応する方法をいくつか考えてみます。Android でアプリをビルドする場合、もっとも好まれる方式は Android Gradle プラグインの設定機能を活用することです。これは、Firebase コンソールのいくつかの設定と合わせて適用されます。

その設定について説明する前に、まずはいくつかの用語を整理しておきましょう。今回使用する用語は、次のとおりです。

Firebase プロジェクト

[Firebase コンソール] のトップレベルで作成するプロジェクトです。作成したプロジェクトは、カード形式で表示されます。


Firebase アプリ

Firebase プロジェクト内に作成するアプリです。Firebase プロジェクトには、いくつでも Android アプリや iOS アプリを含めることができます。プロジェクトに含まれているアプリはホーム画面に表示され、同じ設定を共有します。また、異なる設定も持っています(この点は後ほど詳しく説明します)。


Android Gradle ビルドタイプ

Android Gradle プラグインはビルド時にアプリの設定を行い、その際にビルドタイプが定義されます。ビルドタイプには、デフォルトで「debug」と「release」の 2 種類があります。この設定は buildTypes ブロックで行われており、必要に応じてビルドタイプを追加することもできます。debug タイプは日々のデプロイ用、release タイプはユーザーへの配布用の設定です。


Android Gradle ビルド フレーバー

ビルド時に Android アプリを設定する際に、オプションで「ビルド フレーバー」を割り当てることができます。これはビルドタイプとほぼ同じですが、ビルド フレーバーを使うと必要に応じてさらに細かい設定を行うことができます。たとえば、ほとんどの機能が同じで、アプリケーション ID や有効にする機能のみが異なる「無償」版と「有償」版の両方のアプリをビルドすることができます。


Android Gradle ビルド バリアント

ビルド バリアントは、ビルドタイプとビルド フレーバーの固有の組み合わせです。アプリのビルド設定では、タイプとフレーバーのそれぞれの組み合わせについて、必ずバリアントが 1 つだけ存在します。たとえば、debug と release というタイプを設定しており、「free」と「paid」というフレーバーを設定している場合、Android Gradle プラグインは「debug/free」、「debug/paid」、「release/free」、「release/paid」という組み合わせのバリアントを生成します。コードからビルドした APK は、必ず 1 つだけバリアントを持っています。


Android アプリケーション ID

アプリを一意に識別する文字列の識別子です。Play ストアで公開する際、他のアプリと重複しない一意の値になっている必要があります。通常は、「com.company.project」のように Java パッケージ名形式のフォーマットを使用します。


Firebase 対応のアプリを効果的に設定する際に重要になる考え方があります。それは、個別のデータ コレクションが必要になるアプリのビルド バリアントごとに固有のアプリケーション ID を割り当てることです。それには、最初にアプリの build.gradle を設定し、次に Firebase コンソールでミラーの設定を行います。しかし、アプリに最適な設定を決めるためには、プロジェクトとアプリの間で Firebase の各機能がどのように動作しているかについてもう少し知っておく必要があります。

Firebase 機能ごとのデータスコープ


Firebase の機能の中には、同じプロジェクト内のすべてのアプリ(Android、iOS、ウェブ)間で データを共有 するものもあります。これらの機能のデータの「スコープ」は、Firebase プロジェクト全体であると言え、次の機能が該当します。

また、Firebase の機能の中には、同じプロジェクト内のすべてのアプリで 独立してデータ を持つものもあります。これらの機能のスコープは、Firebase プロジェクトの個々のアプリであると言え、次の機能が該当します。

Analytics と Crash Reporting のダッシュボードの上部には、アプリのセレクターがあることにお気づきでしょう。ここから、データを参照したい(プロジェクトで作成されている)個々のアプリを選択できます。
アプリ セレクターが表示されている Analytics ダッシュボード

Firebase の機能の中には、ハイブリッドなスコープを持つものもあります。次の機能では、特定の操作の対象とするアプリの数を自由に選択できます。

Firebase Test Lab for Android は特殊なケースです。この機能には課金が有効になったプロジェクトが必要ですが、1 つのプロジェクトという制約はなく、任意の APK を対象にすることができます。そのため、無償プランで Firebase の開発を行いつつ有償プランの Test Lab で APK をテストしたい場合は、Test Lab 専用のまったく新しいプロジェクトを作成し、課金を有効にすることをお勧めします。Firebase 統合の有無に関わらず、このプロジェクトでどのようなアプリでもテストできます。

仕組みがわかったところで、現実的ないくつかの実例を見てみましょう。いくつかの設定用レシピも紹介します。この中の 1 つ、あるいはこの中の方法を組み合わせることによって、状況に最適な方式が見つかるでしょう。

小規模チームとシンプルなアプリ


個人デベロッパーや小規模なチームの場合、アプリはかなりシンプルなはずです。そのため、アナリティクスと障害レポートで日々のデバッグと公開リリースビルドを分けるだけで済みます。このケースでは、デバッグとリリースで別のアプリケーション ID を持つことができるようにアプリを設定すれば十分です。次のような簡単な Gradle 設定をするとよいでしょう。
    defaultConfig {
        applicationId "com.company.project"
        // etc...
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
        release {
            // etc...
        }
    }

この例では、リリースビルドに適用されるアプリケーション ID は「com.company.project」ですが、デバッグビルドのアプリケーション ID は「com.company.project.debug」になります。このような接尾語を使わなければならないということではありません。まったく新しい applicationId の値を指定することもできます。

次に、Firebase コンソールで 1 つのプロジェクトを作成し、そのプロジェクト内にそれぞれのビルドタイプに対応する 2 つのアプリを作ります。デバッグアプリではアプリケーション ID「com.company.project.debug」を使用し、リリースアプリでは「com.company.project」を使用します。SHA-1 ハッシュが必要な Firebase 機能を使用している場合は、各ビルドに署名する際に使う別々のキーが SHA-1 ハッシュにも反映されている必要があります。

1 つのプロジェクト内にあり、アプリ ID が異なるデバッグ用とリリース用の 2 つのアプリ

両方のアプリを作成できたら、コンソールから google-services.json ファイルをダウンロードしてアプリに配置します。このファイルの中を見てみると、両方のアプリが記述されていることがわかるでしょう。Google サービス プラグインは、各バリアントのビルドの際にその設定が使われたかを検出します。
      "client_info": {
        "mobilesdk_app_id": "...",
        "android_client_info": {
          "package_name": "com.company.project.debug"
        }
      },

      "client_info": {
        "mobilesdk_app_id": "...",
        "android_client_info": {
          "package_name": "com.company.project"
        }


google-services.json は、プロジェクト内のすべての Android アプリを含む


このプロジェクトが課金プランかどうかを知っておくことは重要です。課金は、 両方の アプリの帯域幅とストレージに対して行われます。そのため、開発中に大量のデータを取得すると、課金額が増加する可能性があります。課金額に驚いてしまうことがないように、[課金プラン] をよく理解しておいてください。

また、注意すべき重要な点は、この設定では、開発中も完全リリース版のアプリで実際のユーザーが使うものと同じデータを使用することです。Realtime Database のデータを破壊する予定だったり、開発中に Remote Config の値を実験する場合、この方法はあまり安全とは言えません。

大規模チームと安全な開発


ライブデータを使って開発を行うという先ほどのレシピは問題かもしれません。多くのメンバーを抱える大規模チームで安全でない形でデータを更新する場合や、本番データを破損させるリスクを防ぎたい場合には、複数のプロジェクトをセットアップして開発データを本番データから分離させる必要があります。実は、チーム内のひとりひとりが無償版の個々の「サンドボックス」プロジェクトを使い、他の人や課金に影響を与えずに安全な実験を行うこともできます。

このような環境は、build.gradle に特別な設定をしなくても実現でき、全員が同じアプリケーション ID を使いつつ、サンドボックス プロジェクト内にアプリを作成できます。ただし、これには署名を行うための一意なデバッグキーが必要です。Android SDK ツールは、SDK の各ユーザーに一意なデバッグキーを作成していますので、この点は通常は問題になりません。しかし、Firebase コンソールは、アプリケーション ID と SHA-1 キーのペアが重複したアプリの作成を許可しないことに注意する必要があります。このペアは、 すべて のアカウントの すべて のプロジェクトの すべて のアプリで一意でなければなりません。そのため、チームのメンバーがデバッグキーを共有している場合、この設定は動作しません。
Firebase コンソールはパッケージ名と SHA-1 の組み合わせの重複を許可しない

この仕組みはそれぞれのメンバーの環境を分離する際に便利ですが、一点だけ気をつけるべきことがあります。すべてのデベロッパーがそれぞれのプロジェクトを作ることになるため、いくつかの重複した設定を行わないとプロジェクトが正しく動作しない可能性もあります。たとえば、新しいプロジェクト用のデータベースには、あらかじめいくつかのデータを入れておかなければ利用開始できないかもしれません。また、正しいセキュリティ ルールも重複して設定する必要があります。Remote Configs にも適切な値を設定する必要があるかもしれません。Authentication にも同じような設定が必要になる場合があります。さらに、すべてのデベロッパーが自分のプロジェクト用に生成された google-services.json ファイルを使う必要があります。また、このファイルをソース管理システムにチェックインしては いけません 。これは、チームメンバー間での競合を避けるためです。

開発、QA、ステージング、本番の各環境の分離


複数の環境間でデータを分離する必要がある状況では、上記の大規模チーム向けの設定と同じ方法で設定するとよいでしょう。もちろん、各環境ごとに異なるプロジェクトを作成する必要があります。それぞれの環境は、同じアカウントで管理しても、別のアカウントで管理しても構いません。

ビルド対象の環境を簡単に選択できるように、それぞれの環境向けのアプリに対するビルド フレーバーを活用できます。たとえば、開発、QA、本番の各環境間でデータを分離させる場合、アプリの build.gradle の buildTypes ブロックの隣にある productFlavors ブロックに 3 つのビルド フレーバーを定義します。次の例をご覧ください。
    productFlavors {
        dev {
        }
        qa {
        }
        prod {
        }
    }

この場合、バリアントは別々に存在しますが、各バリアント間で異なるものはありません。バリアント間で同じアプリケーション ID が共有されますが、これは問題にはなりません。あるいは、ID を分けたい場合には、個別の ID を割り当てることもできます。どちらのケースも、フレーバー固有のディレクトリに各プロジェクトの google-services.json ファイルを入れておく必要があります。上記の各フレーバーが定義されている場合、Android Gradle プラグインはデフォルトで次の規則に基づいてディレクトリを配置します。
    app/
        src/
            main/
            dev/
                google-services.json (for dev only)
            qa/
                google-services.json (for qa only)
            prod/
                google-services.json (for prod only)

各フレーバーのディレクトリは、src ディレクトリ内にある通常プロジェクトのコードが格納されている main ディレクトリと隣り合う場所にあります。各フレーバー名がディレクトリ名となる点に注意してください。このような構造になっているため、各プロジェクト用の google-services.json を直接専用のディレクトリに入れることができます。これによって、アプリの「dev」フレーバーをビルドしたい場合、Android Studio のビルド バリアントを指定するウィンドウから「devDebug」を選択するか、Gradle のコマンドラインでそのバリアントのビルドタスクである「assembleDevDebug」を対象にすることができます。

ご質問がある場合


今回掲載した情報に該当しないアプリのビルドを行うという珍しい状況にある方は、遠慮なく firebase-talk Google Group から質問をお寄せください。緊急のサポートが必要な件については、Firebase Support サイトから問題をお送りください。また、私の Twitter アカウント CodingDoug もぜひフォローしてください。


Posted by Yoshifumi Yamaguchi - Developer Relations Team
Share on Twitter Share on Facebook



DevFest は、Google Developer Group(GDG)コミュニティによって世界各地で開かれるデベロッパー向けイベントです。参加者は AndroidFirebaseGoogle Cloud PlatformTensorFlow による機械学習、Webなどの Google のデベロッパー テクノロジーに関する技術情報、知識やアイデアを共有できます。

それぞれの DevFest は、主催するコミュニティとその地域のニーズに沿ったユニークな内容となり、日本では下記のイベント企画がされています。情報は追加、更新されていきますので、ブログ記事やツイッターをご確認ください。




DevFest Tokyo 2016
日時:016 年 10 月 9 日(日)、13:00 - 18:00(受付 12:30)
場所:東京電機大学 千住キャンパス
参加費:無料
定員:1,400 名(先着順)
主催:GDG 東京、Shibuya.apk、DroidKaigi、日本 Android の会、html5j、GTUG Girls、GCPUG、TensorFlow コミュニティ
協力:Google


DevFest Kansai 2016
日時:2016年11月27日(日)、11:00 - 18:30 (現在調整中)
場所:エムオーテックス新大阪ビル
定員:200 名
主催:GDG 京都、GDG 神戸、KyotoGAS、GCPUG 大阪、Kansai Users Group of Golang
協力:Google、エムオーテックス株式会社

DevFest Shikoku 2016 道後温泉ハッカソン
日時: 2016 年 11 月 12 日(土) 14:00 〜 13 日(日) 15:00
場所: 子規記念博物館(愛媛県松山市道後公園1-30)
参加費: 宿泊あり 4,000円
定員: 20名
主催: GDG 四国
協力: Google

Posted by Takuo Suzuki - Developer Relations Team
Share on Twitter Share on Facebook



Todd Kerpelman
デベロッパー アドボケート

Firebase Analytics の非常に強力な機能の 1 つが、BigQuery からの Analytics データの直接参照や分析できることです。Firebase アプリと BigQuery をリンクさせれば、生のサンプリングされていないアプリデータを毎日 BigQuery にエクスポートでき、データに対して強力なクエリをアドホックに実行したり、Firebase Analytics データと別のアナリティクス ライブラリのデータを組み合わせたり、カスタム レポーティング ツールを直接実行できるようになります。

しかし、この機能はデベロッパーに非常に人気がある一方、時にじれったく感じるような制限もあります。通常、日々のアナリティクス データが収集されて BigQuery テーブルにエクスポートされるまで、24 時間待たなければならないことです。これは、開発とテストという視点から考えると不便に映ることが多い制限で、アプリのデベロッパーの対応スピードが落ちてしまうことにもなります。もし最新の A/B テストの影響でユーザーがアプリを使わなくなってしまった場合、24 時間ではなく 20 分でそれがわかればすばらしいとは思いませんか?

そこで、うれしいことに、今週より、Firebase Analytics データがほぼリアルタイムで BigQuery から参照できるようになることをお知らせいたします。

以下で、その仕組みについて説明します。既に Firebase プロジェクトと BigQuery をリンクさせていれば、デフォルトで Firebase Analytics はできるだけ早く BigQuery にデータを送信するようになります。通常の appevents_ テーブルに加え、その日の受信するすべてのデータを集めた特殊な appevents_intraday_ テーブルができます。


この intraday テーブルは、自由に分析を行ったりクエリを実行したりでき、他の BigQuery アナリティクス テーブルとまったく同じように扱うことができます。このテーブルにないデータは、生涯価値(LTV)データとキャンペーン情報(traffic_source レコード)のみです。1 日が終わると[1]、このデータは永続テーブルである appevents_ ホームに移動し、古い intraday テーブルは自動的にクリーンアップされます。

もちろん、BigQuery の使用量とストレージの料金はそのまま適用されます。つまり、このメリットを受けるには、Firebase プロジェクトを Blaze プランにアップグレードする必要があるということです。しかし、BigQuery へのエクスポートは、今までアナリティクス ユーザーが多額をつぎ込まなければならなかった機能だったため、これは十分よい条件だと言えるでしょう。

BigQuery を初めて使う方は、こちらから詳しい情報をご覧いただき、使い始めることができます。BigQuery で取得した巨大なデータセットに対して高速にクエリを実行するのはとても楽しいものです!

[1] デベロッパーのタイムゾーンで判断しています。


Posted by Khanh LeViet - Developer Relations Team
Share on Twitter Share on Facebook



Todd Kerpelman
デベロッパー アドボケート

最新かつ最高のテクノロジーを導入した環境で、自身のアプリを正しく動作させることは非常に重要です。iOS 開発について言えば、近々リリースされる iOS 10 向けにアプリをサポートしようと考えているデベロッパーの方も多いと思います。

Firebase チームでは、iOS 10 が一般公開されてすぐに、デベロッパーの皆様が自身のアプリを iOS 10 上で実行できるように準備を進めています。本記事では、Firebase CocoaPod の最新バージョン(3.5.1)における変更点を改めて紹介します。あわせて、今後予定されている変更点のうち、iOS 10 向けの開発を始めるにあたり影響がある内容についてお伝えします。

Dynamic Links、Invites、App Indexing

最新版の Firebase ライブラリでは、iOS 10 向けのディープリンク機能が新たにサポートされています。自身のアプリで Dynamic Links、Firebase Invites、App Indexing などのディープリンクを活用する機能を使用している場合は、ライブラリを最新版に更新してください。これらの機能は、(コードを変更しなくても)アプリを再ビルドするだけで正しく動作するようになります。

Firebase Analytics

Firebase SDK の最新版では、検索機能と連動した AdWords 広告経由でのアプリのインストール状況を、より正確にトラックできるようになっています。この機能は Firebase SDK のバージョン 3.3.0 で追加済みなので、既にご存じの方もいると思いますが、今回はさらに iOS 10 向けのサポートを追加しています。上述のディープリンク機能の更新と同様に、新しいライブラリを用いてコードを再ビルドすると、自動的に新機能が有効になります。

Firebase Cloud Messaging

iOS 10 では通知関連の機能が大幅に進化しており、デベロッパー側で受信したユーザー通知を処理するための新たな方法も提供されています。具体的には、 application:didReceiveRemoteNotification などの古い UIApplicationDelegate メソッドの廃止に伴い、UNUserNotificationCenterDelegate プロトコルのメソッドで通知を処理するようになっています。

ただし、お気づきの方もいるかと思いますが、Firebase SDK の最新版では、まだ古い appDelegate メソッドを使用しています。新しい UNUserNotificationCenterDelegate プロトコルのメソッドについては、近々サポートを開始できるように努めています。ライブラリを更新した際はお知らせしますので、今後の配信情報をチェックしておいてください。

Firebase Auth と Xcode 8 に関するお知らせ

最新の iOS 10(この記事を書いている時点では ベータ版 6 まで)のシミュレータでは、キーチェーンに値が書き込めず、Firebase Auth がエラーを返すという問題が発生することが判明しています。なお、この問題による実機への影響はありません。

本件は、既に Apple のバグ トラッキング システムに報告済みですので、近いうちに解決されると見込まれますが、それまではシミュレータで Firebase Auth の試験を実施すると、エラーが発生する可能性があります。この問題を回避する方法として、Auth の試験は iOS 10 が搭載された実機で実施することをお勧めします。実機をお持ちでない場合は、 アプリの Capabilities セクションで Keychain Sharing を有効にしてください。 詳しくは StackOverflow の投稿をご覧ください。

Swift 3 対応

既にお気づきの方もいるかもしれませんが、ドキュメントのサンプルコードでは、まだ Swift 2.3 を使用しています。Swift 3 は現在も開発中であるため、バージョン 3.0 が正式にリリースされてから、ドキュメント内のサンプルコードを入れ替える予定です。

もちろん現段階で、Swift 3 でサンプルの動作を試すことも可能です。最新のサンプルコードをダウンロードして、Xcode の Swift 変換ツールでサンプルを変換すると、ご利用いただけます。また、近日中にサンプルアプリ用に Swift 3 の専用ブランチを作成する予定です。そちらのブランチを GitHub からチェックアウトすれば、変換処理をしなくてもソースコードをご覧いただけます。

フィードバックをお待ちしています

今回は、ベータ版のオペレーティング システム向けにライブラリをリリースしているため、厄介な問題が発生することが見込まれます。iOS 10 の新バージョン公開に伴い、さまざまな不具合が検出された際は、できるだけ迅速に改修するよう努めてまいります。皆様の方でも iOS 10 固有の問題を発見しましたら、ぜひお知らせください。まずは Google グループ をご活用ください。


Posted by Khanh LeViet - Developer Relations Team
Share on Twitter Share on Facebook


埋め込みウェブビューではなく、端末のブラウザを使用して OAuth リクエストを行うことにより、アプリのユーザビリティは大幅に向上します。ユーザーは端末で 1 度だけ Google にログインすればいいため、アプリでのログインのコンバージョン率や認証フローが改善されます。Android の Chrome Custom Tab や iOS の SFSafariViewController など、いくつかのオペレーティング システムで利用できる最新の「アプリ内ブラウザタブ」パターンを使うと、ブラウザベースの OAuth フローの UX をさらに改善できます。

逆に、OAuth に埋め込みブラウザを使用する古い方式では、端末の既存のログイン済みセッションを使うことはできないため、ユーザーはその都度 Google にログインする必要があります。ウェブビューの内容はアプリが検査したり変更したりできますが、ブラウザ内に表示されるコンテンツではそれができないため、端末のブラウザの方がセキュリティが高くなります。

この移行をサポートするため、皆様が利用できる最新のベスト プラクティスに基づくライブラリとサンプルを公開しています。

ネイティブ アプリの標準ベースの OAuth サポートに関するプロトコル レベルのドキュメントや、このトピックに関する現在の IETF のベスト プラクティスのドラフトもご覧ください。

バージョン 3.0 以前の iOS で使われているバージョンの Google Sign-In も、アプリ内ブラウザタブの現在の業界のベスト プラクティスに対応していないため、サポートを終了します。Google Sign-In を使用する場合は、最新のバージョンにアップデートし、セキュリティやユーザビリティを最新の状態にしてください。現在のところ、このポリシーによって iOS 8 の WebView のサポートが終了することはありませんが、今後、セキュリティ向上のために端末をアップグレードすることを促す通知がユーザーに表示される可能性があります。

ウェブビューでの Google への OAuth リクエストのサポート終了スケジュールは、次のようになっています。2016 年 10 月 20 日以降、有効な代替手段があるプラットフォームで、新しい OAuth クライアントがウェブビューを使用することを禁止し、段階的に既存の OAuth クライアントのユーザーに対して通知を表示します。2017 年 4 月 20 日に、有効な代替手段があるプラットフォーム上のすべての OAuth クライアントに対し、ウェブビューからの OAuth リクエストのブロックを開始します。

移行に関する質問がある方は、「google-oauth」タグをつけて Stack Overflow に投稿してください。



Posted by Eiji Kitamura - Developer Relations Team
Share on Twitter Share on Facebook