Local blog for Japanese speaking developers

Firebase を使って NativeScript + Angular 2 モバイルアプリを構築する

2017年1月17日火曜日


Jen Looper
Developer Advocate at ProgressSW

NativeScript、Firebase、Angular 2 という強力な組み合わせを活用すれば、アプリの構築を一気に加速させることができます。クリスマス休暇の期間中は、アプリの開発をスピードアップさせて、プレゼントを贈りたいという家族のニーズに応えなければならないため、特にその点が重要になります。ちょうどよいことに、Angular 2 ベースの NativeScript アプリで Firebase を使う方法のデモを皆さんにプレゼントすることができます(以下をご覧ください 🎁)。これは、Eddy Verbruggen 氏による有名な NativeScript-Firebase プラグインのいくつかのコンポーネントを使ったものです。


このチュートリアルでは、よく使われている次の 4 つの Firebase 機能を NativeScript アプリで使用する方法を説明します。4 つの機能には、ログインとユーザー登録の機能を提供する Authentication、リアルタイムにアップデートされるデータ ストレージの Realtime Database、リモートでアプリを変更できる Remote Config、写真を保存する Storage があります。説明するにあたって、以前に Ionic で書いた Giftler アプリを書き直すことにしました。

実際のプロジェクトで作業に着手する前に、ドキュメントに目を通し、以下の前提事項について確認することをお勧めします。

  • ローカルマシンに NativeScript がインストールされており、CLI が問題なく動作していることを確認します。
  • お好みの IDE で、NativeScript と Angular の開発環境を設定します。TypeScript が必要になるので、トランスパイル プロセスが動作することを確認しておきます。Visual Studio、Visual Studio Code、Jetbrains 対応の IDE などで利用できる優れた NativeScript プラグインがありますが、中でも Visual Studio Code には、開発を加速させる便利なスニペットがあります。
  • Firebase アカウントにログインし、コンソールを開きます。
  • Firebase コンソールで新しいプロジェクトを作成します。ここでは、「Giftler」という名前にしました。さらに、Firebase コンソールで iOS と Android のアプリを作成します。その際に、GoogleServices-Info.plist ファイルと google-services.json ファイルをダウンロードします。後ほど必要になるので、ファイルを配置した場所は覚えておいてください。


依存モジュールのインストール

Giftler は、認証が必要な NativeScript アプリのサンプルとして作成しました。このアプリでは、ユーザーがクリスマス休暇に受け取りたいギフトを、写真や説明とともに一覧表示できます。現時点で、このアプリには iOS 版と Android 版があり、以下の機能があります。

  • ログイン、ログアウト、ユーザー登録、および「パスワードを忘れた」場合の処理の実行
  • ユーザーによるリストへのギフト項目の登録
  • ユーザーによるリストからのギフト項目の削除
  • ユーザーによるリストの各ギフト項目の編集(説明や写真の追加)
  • バックエンドですぐに変更できる Firebase の Remote Config サービスによるメッセージング

それでは、Giftler のソースコードをフォークしましょう。これは、問題なく動作している完全版のアプリです。アプリをクローンできたら、アプリを作成した際にダウンロードした、現在の Firebase 関連のアプリのファイルを置き換えます。

  • Firebase からダウンロードした google.services.json ファイルを /app/App_Resources/Android folder に配置します。
  • 同様に、Firebase からダウンロードした GoogleService-Info.plist ファイルを /app/App_Resources/iOS folder に配置します。


これらのファイルは、アプリで Firebase を初期化し、関連する外部サービスに接続するために必要です。

次に、アプリのルートにある package.json を確認します。このファイルには、アプリで使用するプラグインが含まれています。ここでは、NativeScript に関連するプラグインに注目してください。

"nativescript-angular":"1.2.0",
"nativescript-camera": "^0.0.8",
"nativescript-iqkeyboardmanager": "^1.0.1",
"nativescript-plugin-firebase": "^3.8.4",
"nativescript-theme-core": "^1.0.2",


NativeScript-Angular プラグインは、Angular と NativeScript を統合するプラグインです。Camera プラグインを使うと、少しカメラを管理しやすくなります。IQKeyboardManager は iOS 専用のプラグインで、厄介な iOS のキーボードを管理してくれます。Theme プラグインは、スキンを完全に自作しなくてもデフォルトのスタイルをアプリに追加できるすばらしいプラグインです。最後に、このアプリでもっとも重要なのが Firebase プラグインです。

以上の依存モジュールを配置して、プラグインをインストールする準備ができたら、iOS と Android のそれぞれのコードが格納された platforms フォルダを作成し、Firebase プラグインやその他の npm ベースのプラグインを初期化して、アプリを構築できるようにします。NativeScript CLI を使ってクローンしたアプリのルートに移動し、tns run ios または tns run android を実行します。これによってプラグインをビルドするルーチンが開始されます。中でも、Firebase プラグインのさまざまなパーツのインストールが始まることが確認できるはずです。インストール スクリプトが実行されると、さまざまな Firebase サービスを統合するためのコンポーネントをインストールするかどうかの確認が表示されます。ここでは、Messaging とソーシャル認証を除くすべてを選択します。ここでの大きな特徴は、firebase.nativescript.json ファイルがアプリのルートにインストールされることです。そのため、今後プラグインの新しいパーツをインストールしたい場合、このファイルを編集するだけでプラグインを再インストールできます。


ここで、tns livesync ios --watch または tns livesync android --watch を実行し、エミュレータでアプリが起動して変更が監視されることを確認すると、アプリが実行されて新しくログインする準備ができていることがわかります。ただし、ログインを行う前に、Firebase コンソールの [Authentication] タブからメール / パスワードによるログインを有効にして、Firebase がこのタイプのログインを処理できるようにする必要があります。


この裏で何が起こっているかを確認するために、少しばかり内部の仕組みを見てみましょう。Firebase にログインするには、インストールした Firebase サービスを初期化しておく必要があります。app/main.ts には、いくつか興味深い点があります。

// this import should be first in order to load some required settings (like globals and reflect-metadata)
 import { platformNativeScriptDynamic } from "nativescript-angular/platform";

 import { AppModule } from "./app.module";
 import { BackendService } from "./services/backend.service"; 
 

 import firebase = require("nativescript-plugin-firebase"); 


 firebase.init({
   //persist should be set to false as otherwise numbers aren't returned during 
 livesync
  persist: false,
  storageBucket: 'gs://giftler-f48c4.appspot.com',
  onAuthStateChanged: (data: any) => {
    console.log(JSON.stringify(data))
    if (data.loggedIn) {
      BackendService.token = data.user.uid;
    }
    else {
      BackendService.token = "";
    }
   }
 }).then(
   function (instance) {
     console.log("firebase.init done");
   },
   function (error) {
     console.log("firebase.init error: " + error);
   }
   );
 platformNativeScriptDynamic().bootstrapModule(AppModule); 


最初に、プラグインから firebase をインポートし、.init() を呼び出します。次に storageBucket プロパティを編集し、Firebase コンソールの [Storage] タブに表示されている値を貼り付けます。

これで、お使いの Firebase アカウントに合わせてアプリがカスタマイズされ、アプリで新しいユーザーの登録とログインが可能になるはずです。必要に応じて、app/login/login.component.ts ファイルの user.email と password 変数を編集して、デフォルトのログイン認証情報を [email protected] からご自身のログインとパスワードに変更することもできます。

iOS と Android のログイン画面
注: iOS では、Xcode シミュレータを使うとすぐにアプリをエミュレートできます。ただし Android では、アプリをエミュレータにインストールするために、Google Services の有効化など、追加でいくつかの手順が必要になる場合があります。

コードの構造と認証

Angular 2 のデザイン パターンでは、コードをモジュール化する必要があります。そのため、以下のコード構造に従うものとします。

—login
  1. login.component.ts
  2. login.html
  3. login.module.ts
  4. login.routes.ts
—list …

—list-detail …

—models

  1. gift.model.ts
  2. user.model.ts
  3. index.ts
—services
  1. backend.service.ts
  2. firebase.service.ts
  3. utils.service.ts
  4. index.ts
app.component.ts

app.css

app.module.ts

app.routes.ts

auth-guard.service.ts

main.ts

Firebase の認証が Angular 2 の auth-guard.service と連携する方法に注目してください。前述のように、アプリの app/main.ts で Firebase が初期化されます。その際に、onAuthStateChanged 関数が呼び出されます。

onAuthStateChanged: (data: any) => { 
    console.log(JSON.stringify(data))
    if (data.loggedIn) {
      BackendService.token = data.user.uid;
    }
    else {
      BackendService.token = "";
    }
  }

アプリが起動する際に、Firebase から返されるデータを文字列化したものをコンソールで確認してください。そのユーザーに loggedIn フラグが立っている場合、Firebase から送り返された userId を token として設定します。NativeScript アプリケーション設定モジュールを使って、この userId を保存するかつ、これから作成するデータと関連付けます。このモジュールは、localStorage のような機能を持つモジュールです。このトークンとトークンを使う認証テストは app/services/backend.service.ts ファイルで管理されており、app/auth-guard.service.ts ファイルで利用できます。auth-guard ファイルは、アプリのログインおよびログアウト状態を適切に管理する方法を提供しています。

AuthGuard クラスは、Angular Router モジュールの CanActivate インターフェースを実装しています。

export class AuthGuard implements CanActivate {
  constructor(private router:Router) { } 

  canActivate() {
    if (BackendService.isLoggedIn()) {
      return true;
    }
    else {
      this.router.navigate(["/login"]);
      return false;
    }
  }


基本的には、前述のログイン ルーチンでトークンが設定され、かつ BackendService.isLoggedIn 関数が true を返す場合、アプリでデフォルトのルートであるウィッシュリストへのナビゲーションが許可されます。しかし、それ以外の場合、ユーザーはログイン画面に戻されます。

const listRoutes:Routes = [
  { path: "", component:ListComponent, canActivate: [AuthGuard] },
];

これで、Firebase を使う NativeScript アプリを初期化できました。次は、アプリにデータを読み込み、Firebase のすばらしいリアルタイム性を活用して、アップデートされるデータベースの内容を監視する方法について学んでゆきましょう。

リストの作成とダブルチェック

ウィッシュリストのベースとなっている app/list/list.html から説明します。ここには、テキスト項目と空のリストが表示されているはずです。では、サンタさんに欲しいものを伝えてみましょう。項目がデータベースに送信され、リアルタイムにリストに追加されます。これをどうやって実現しているかを見てみましょう。

app/list/list.component.ts では、最初にギフトのリストを保持するための監視可能オブジェクトを設定しています。 public gifts$: Observable; 次に、コンポーネントの初期化の際に、データベースからリストを読み込みます。

ngOnInit(){
  this.gifts$ = this.firebaseService.getMyWishList();
}


おもしろいのは firebaseService ファイルです。この関数では、リスナーを追加して Firebase Database の Gifts コレクションの変更を監視する監視可能オブジェクト rxjs を返しています。この方法に注目してください。

getMyWishList():Observable {
   return new Observable((observer: any) => { 
       let path = 'Gifts';
         let onValueEvent = (snapshot: any) => {
           this.ngZone.run(() => {
             let results = this.handleSnapshot(snapshot.value);
             console.log(JSON.stringify(results))
              observer.next(results);
           });
         };
         firebase.addValueEventListener(onValueEvent, `/${path}`);
     }).share(); 
   }


このクエリの結果は、次に示す handleSnapshot 関数で処理されます。この関数は、ユーザーがフィルタリングしたデータを _allItems 配列に設定しています。

handleSnapshot(data: any) {
    //empty array, then refill and filter 
    this._allItems = [];
    if (data) {
      for (let id in data) {
        let result = (Object).assign({id: id}, data[id]);
        if(BackendService.token === result.UID){
          this._allItems.push(result);
        }
      }
      this.publishUpdates();
    }
    return this._allItems;
 }


最後に、publishUpdates が呼び出されます。この関数は、新しい項目が先頭に表示されるように、日付でデータを並び替えています。

publishUpdates() {
    // here, we sort must emit a *new* value (immutability!)
    this._allItems.sort(function(a, b){
         if(a.date < b.date) return -1;
         if(a.date > b.date) return 1;
       return 0;
    })
    this.items.next([...this._allItems]);
  }


監視可能オブジェクト $gifts にデータが設定されると、要素の編集や削除を行うたびにリスナーが呼ばれ、フロントエンドが適切にアップデートされます。getMyWishList メソッド内の onValueEvent 関数で ngZone が使われていることに注意してください。これによって、非同期に行われるデータのアップデートに応じて UI が適切にアップデートされます。NativeScript アプリの ngZone の概要については、こちらをご覧ください。

メッセージのリモート設定


もう 1 つの優れた Firebase サービスに「Remote Config」があります。これは、Firebase のバックエンドからアプリをアップデートできる機能です。Remote Config を使うと、アプリの機能のオン、オフを切り替えたり、UI を変更したりできます。ここでは、サンタさんからメッセージを送る機能を追加してみましょう。

app/list/list.html には、次のメッセージ ボックスがあります。 <Label class="gold card" textWrap="true" [text]="message$ | async"></Label> 監視可能オブジェクト message$ は、データリストとほぼ同じ方法で組み込まれていますが、ここではアプリが新しく初期化されるたびに変更が適用されます。

ngOnInit(){
  this.message$ = this.firebaseService.getMyMessage();
}


秘密は、次に示すサービスレイヤ(app/services/firebase.service.ts)にあります。
getMyMessage():Observable{
    return new Observable((observer:any) => {
      firebase.getRemoteConfig({ 
      developerMode: false,
      cacheExpirationSeconds: 300,
      properties: [{
      key: "message",
      default:"Happy Holidays!"
    }]
  }).then(
        function (result) {
          console.log("Fetched at " + result.lastFetch + (result.throttled ? " (throttled)" : "")); 
          for (let entry in result.properties)
            {
              observer.next(result.properties[entry]);
            }
          }
       );
     }).share();
 }



好きなだけ新しいメッセージを発行可能

注: アプリから必要のない高頻度で Remote Config の値を取得すると、Remote Config の利用が制限されてしまう場合がありますので、慎重に開発してください。

写真を撮る



このプロジェクトのおもしろいところは、選んだプレゼントの写真を撮って Firebase Storage に格納できる点でしょう。前述のように、この部分には Camera プラグインを使いました。これでハードウェアの管理が少し楽になります。最初に、app/list-detail/list-detail.component.ts の ngOnInit() メソッドでパーミッション セットを取得し、アプリがカメラデバイスにアクセスできるようにします。

ngOnInit() {
   camera.requestPermissions();
   ...
  }

ユーザーが詳細画面の [Photo] ボタンをクリックすると、イベント チェーンが始まります。最初に呼ばれるのは次のコードです。

takePhoto() {
  let options = {
            width:300,
            height:300,
            keepAspectRatio: true,
            saveToGallery: true
         };
     camera.takePicture(options)
          .then(imageAsset => {
              imageSource.fromAsset(imageAsset).then(res => {
                  this.image = res;
                  //save the source image to a file, then send that file path to firebase
                  this.saveToFile(this.image);
              })
          }).catch(function (err) {
              console.log("Error -> " + err.message);
          });
}


カメラで写真が撮影され、その写真が imageAsset として保存されて画面に表示されます。このイメージはファイルとしてローカルに保存されます。その際に、日付のタイムスタンプに従った名前が付けられます。また、今後の利用に備えて、パスも保存されます。

saveToFile(res){
  let imgsrc = res;
        this.imagePath =
this.utilsService.documentsPath(`photo-${Date.now()}.png`);
        imgsrc.saveToFile(this.imagePath, enums.ImageFormat.png); 
}


[Save] ボタンが押されると、イメージはローカルパス経由で Firebase に送信され、ストレージ モジュール内に保存されます。アプリに返される Firebase のフルパスは、/Gifts データベース コレクションに保存されます。

editGift(id: string){
  if(this.image){
    //upload the file, then save all
    this.firebaseService.uploadFile(this.imagePath).then((uploadedFile: any) => 
{
          this.uploadedImageName = uploadedFile.name;
          //get downloadURL and store it as a full path;
this.firebaseService.getDownloadUrl(this.uploadedImageName).then((downloadUrl: string) => {
this.firebaseService.editGift(id,this.description,downloadUrl).then((result:any) => { 
               alert(result)
             }, (error: any) => {
                 alert(error);
             });
           })
          }, (error: any) => {
            alert('File upload error: ' + error);
          });
        }
        else {
          //just edit the description
          this.firebaseService.editDescription(id,this.description).then((result:any) => {
               alert(result)
            }, (error: any) => {
               alert(error);
            });
          }
        }


このイベント チェーンは一見複雑そうですが、最終的に実行されるのは、Firebase サービス ファイルの中の数行です。

uploadFile(localPath: string, file?: any): Promise {
      let filename = this.utils.getFilename(localPath);
      let remotePath = `${filename}`;
      return firebase.uploadFile({
        remoteFullPath: remotePath,
        localFullPath: localPath,
        onProgress: function(status) {
            console.log("Uploaded fraction: " + status.fractionCompleted);
            console.log("Percentage complete: " + status.percentageCompleted);
        }
      });
  }
  getDownloadUrl(remoteFilePath: string): Promise {
      return firebase.getDownloadUrl({
     remoteFullPath: remoteFilePath})
      .then(
        function (url:string) {
          return url;
        },
        function (errorMessage:any) {
          console.log(errorMessage);
        });
}
editGift(id:string, description: string, imagepath: string){
    this.publishUpdates();
    return firebase.update("/Gifts/"+id+"",{
        description: description,
        imagepath: imagepath})
      .then(
        function (result:any) {
          return 'You have successfully edited this gift!';
        },
        function (errorMessage:any) {
          console.log(errorMessage);
        });
  }


最終的な結果では、ウィッシュリストに表示するギフトの写真と説明の両方がうまく取得できています。これでもうサンタさんは、カイリーのどのアイライナーを買えばいいのかわからないという言い訳はできません。強力な NativeScript と Angular を組み合わせれば、数分で iOS と Android のネイティブ アプリを作ることができます。これに Firebase を追加すれば、アプリのユーザー、イメージ、データを保存する強力な機能を利用でき、さらに端末間でリアルタイムにデータをアップデートすることも可能になります。すばらしいと思いませんか。このアプリは、次のようになります。



ここまで、充実したウィッシュリスト管理アプリの作成に向けて順調に進んできました。しかし、サンタさんに願いごとを伝える最高の方法はまだ模索中と言えるでしょう。次のステップとしては、Mailgun のメールとの統合やプッシュ通知の利用が考えられます。それまでの間、すばらしいクリスマス休暇をお過ごしください。皆さんが Firebase を利用してすてきな NativeScript アプリを作れるようにお祈りします。

NativeScript についてさらに詳しく学びたい方は、http://www.nativescript.org をご覧ください。質問がある方は、こちらから NativeScript の Slack チャンネルに参加してください。

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

ラベル


  • .app 1
  • .dev 1
  • #11WeeksOfAndroid 13
  • #11WeeksOfAndroid Android TV 1
  • #Android11 3
  • #DevFest16 1
  • #DevFest17 1
  • #DevFest18 1
  • #DevFest19 1
  • #DevFest20 1
  • #DevFest21 1
  • #DevFest22 1
  • #DevFest23 1
  • #hack4jp 3
  • 11 weeks of Android 2
  • A MESSAGE FROM OUR CEO 1
  • A/B Testing 1
  • A4A 4
  • Accelerator 6
  • Accessibility 1
  • accuracy 1
  • Actions on Google 16
  • Activation Atlas 1
  • address validation API 1
  • Addy Osmani 1
  • ADK 2
  • AdMob 32
  • Ads 73
  • Ads API 143
  • ads query language 2
  • ads scripts 2
  • ads search 1
  • advanced markers 1
  • Advanced Protection Program 3
  • AdWords API 25
  • adwords scripts 2
  • aerial view api 1
  • Agency 1
  • AI 22
  • AI Agent Summit 1
  • AIY 3
  • AIY Vision Kit 2
  • ALPN 1
  • AMP 120
  • AMP Cache 9
  • AMP Camp 2
  • AMP CSS 1
  • AMP Extension 1
  • AMP Fest 1
  • AMP for Email 4
  • AMP Optimizer 1
  • AMP Packager 1
  • AMP Playground 1
  • AMP Plugin 1
  • AMP SSR 1
  • AMP Story 4
  • AMP Toolbox 1
  • amp-bind 1
  • amp.dev 1
  • AMPHTML Ads 1
  • Analytics 9
  • Andorid 12
  • Android 403
  • Android 10 1
  • Android 11 20
  • Android 11 Compatibility 1
  • Android 11 final release 1
  • Android 11 meetups 1
  • Android 9 1
  • android api 1
  • Android App Bundle 1
  • Android App Development 23
  • Android Architecture 1
  • Android Architecture Components 1
  • Android Auto 1
  • Android Design Support Library 1
  • Android Developer 14
  • Android Developer Story 4
  • Android Developers 13
  • Android Enterprise 6
  • Android for cars 2
  • Android Go 1
  • Android Jetpack 6
  • Android N 18
  • Android O 14
  • Android Open Source Project 1
  • Android P 7
  • Android Pay 1
  • android privacy 1
  • Android Q 13
  • Android Ready SE Alliance 1
  • android security 6
  • Android Security Year in Review 1
  • Android StrongBox 1
  • Android Studio 47
  • Android Studio 4.1 1
  • android study jam 1
  • Android Support Library 6
  • Android Things 15
  • Android Tools 2
  • Android TV 11
  • Android Vitals 4
  • Android Wear 29
  • android11 6
  • androidmarket 3
  • androidstudio 1
  • AndroidX 6
  • Angular 2
  • Angular 2 2
  • AngularJS 2
  • Announcements 2
  • Anthos 2
  • antmicro 1
  • AoG 1
  • aosp 1
  • API 28
  • APIExpert 45
  • apk 2
  • APM 1
  • app 3
  • App Action 1
  • App Bundle 2
  • app check 1
  • app engine 24
  • App Indexing 7
  • App Invites 6
  • App Maker 2
  • App modernization 1
  • AppCompat 2
  • Apps Flutter eBay 1
  • Apps Script 12
  • AppSheet 1
  • aprilfool 4
  • AR 3
  • Architecture Components 7
  • ARCore 3
  • ArtTech 1
  • asset-based extensions 2
  • assets 1
  • Associate Android Developer Certificate 1
  • Attribution Reporting 1
  • Audio 7
  • Auth Code 1
  • Authentication 9
  • AuthSub 2
  • Autofill 5
  • AutoML 1
  • Autotrack 2
  • award 1
  • Awareness API 1
  • basemap 1
  • basic-card 1
  • Beacons 6
  • bento 2
  • BERT 1
  • Best Practices 1
  • beta 4
  • Better Ads Standards 3
  • BigQuery 10
  • Billing 1
  • Biometrics 1
  • BLE 4
  • Blink 1
  • Blockly 1
  • blogger 1
  • BodyPix 1
  • bootcamp 1
  • Brillo 1
  • Brotli 2
  • Budou 1
  • budoux 1
  • Buildbetterapps 2
  • Business and Leadership 1
  • C++ 1
  • Calendar 3
  • call ads 1
  • campaign 2
  • campaignsharedset 1
  • Campus 1
  • Canvas 1
  • Cardboard 4
  • Career 1
  • Case Studies 1
  • Case Study 3
  • CCPA 1
  • CDS 2020 3
  • CDS Recap 2020 3
  • Certificate 8
  • changestatus 1
  • chrome 261
  • chrome 98 1
  • Chrome Apps 1
  • Chrome Custom Tab 4
  • Chrome Dev Summit 5
  • chrome extension 14
  • Chrome for Android 2
  • Chrome for iOS 3
  • Chrome OS 10
  • Chrome Root Program 1
  • Chrome Root Store 1
  • Chrome Tech Talk Night 4
  • chrome103 1
  • chrome104 1
  • chrome108 1
  • chrome90 1
  • Chromebook 5
  • Chromecast 7
  • chromewebstore 9
  • Chromium 20
  • CLI 1
  • ClientLogin 3
  • Closure Compiler 1
  • Cloud 29
  • Cloud AI Platform 2
  • Cloud Firestore 5
  • Cloud Functions 9
  • Cloud IoT Device SDK 1
  • cloud messaging 1
  • Cloud ML Summit 1
  • Cloud Next 19
  • Cloud OnAir 5
  • Cloud OnBoard 4
  • Cloud PubSub 1
  • Cloud Run 1
  • Cloud Storage 1
  • Cloud Study Jams 3
  • Cloud Summit 1
  • Cloud Test Lab 2
  • Cloudflare 1
  • CNN 1
  • Coalition for Better Ads 2
  • CocoaPods 1
  • code review 1
  • codejam 5
  • codelab 5
  • Codepen 1
  • Colaboratory 1
  • Common Criteria 1
  • Community 7
  • compatibility 1
  • Compose 1
  • compose camp 1
  • compute engine 3
  • consent 1
  • Contests 1
  • Context 1
  • controls 1
  • Conversation API 1
  • conversations 2
  • conversion 1
  • Cookie 10
  • Coral 3
  • core web vitals 1
  • COVID-19 2
  • Crash Reporting 2
  • Crashlytics 3
  • cryptography 1
  • Custom Element 1
  • Custom Model 1
  • CWV 2
  • dark theme 1
  • Dart 2
  • data retention 1
  • DataCenter 1
  • datacloudsummit 1
  • Daydream 4
  • deck.gl 2
  • Deep Learning 4
  • Delegation 1
  • Demo Party 1
  • Design Patterns 1
  • Design Sprint 3
  • DesignBytes 1
  • Designer 1
  • DevArt 3
  • DevBytes 6
  • Developer 15
  • Developer Console 4
  • Developer Library 1
  • Developer Preview 6
  • Developer Relations 3
  • Developer Review 1
  • Developer Student Club 1
  • DEVELOPERS 1
  • Developers Story 4
  • DevFest 12
  • DevFestX 3
  • DevOps 1
  • devtools 4
  • Dialogflow 1
  • Differential privacy 2
  • Digital Asset Links 1
  • Digital Goods API 1
  • directions api 1
  • DirectShare 1
  • Discover 1
  • distance matrix api 1
  • DNS-over-HTTPS 4
  • Domain 1
  • Doodle 1
  • DoubleClick 4
  • Doze モード 1
  • drive 2
  • DSA 1
  • DSC 1
  • DX 1
  • Dynamic Links 3
  • EarlGrey 1
  • Easter Egg 1
  • ECMAScript 2015 1
  • Eddystone 4
  • Edge 1
  • egypt 1
  • encoder 1
  • Encryption 1
  • English 2
  • environment api 1
  • Envoy 1
  • error 1
  • ES2015 1
  • ES2016 1
  • ES6 2
  • ES7 1
  • eta 1
  • Event 7
  • events 3
  • Explore 1
  • extensions 1
  • external 1
  • Featured 25
  • Feed 2
  • feed-based extensions 3
  • feeds 1
  • FIDO 7
  • filter 1
  • final release 1
  • Firebase 123
  • Firebase Admin SDK 6
  • Firebase Analytics 10
  • Firebase Auth 4
  • Firebase Cloud Messaging 10
  • Firebase Crashlytics 2
  • Firebase Database 5
  • firebase for games 1
  • Firebase Libraries 1
  • Firebase Notifications 1
  • Firebase Performance 3
  • Firebase Remote Config 6
  • firebase summit 1
  • Flash 1
  • FLEDGE 1
  • FLoC 2
  • Flutter 8
  • Flutter App Development 1
  • flutter3 1
  • font 3
  • fraud 1
  • G Suite 19
  • game 43
  • Game Developers Conference 2018 1
  • Game Developers Conference 2019 1
  • Game Development 1
  • gaming 1
  • gaql 8
  • Gboard 2
  • gc_datacloud 1
  • GCCN 1
  • GCP 17
  • GCPUG 1
  • GDC 1
  • GDD11JP 56
  • GDD2010JP 23
  • GDE 2
  • GDG 23
  • GDG Cloud 1
  • gdgoc 2
  • gdsc 5
  • Gemini 6
  • Gemma 2
  • generative AI 4
  • Geo 55
  • Get Inspired 1
  • Gingerbread 1
  • GLIDE 5
  • global foundries 1
  • Gmail 6
  • Gmail API 3
  • Go 1
  • Go Checksum Database 1
  • golang 5
  • goo.gl 1
  • Google 8
  • Google account 1
  • Google Analytics 4
  • Google API 2
  • Google Apps 14
  • Google Apps Script 4
  • Google Assistant 13
  • Google Assistant SDK 2
  • Google Binary Transparency 1
  • Google Cast 8
  • Google Chat 3
  • Google Cloud 50
  • Google Cloud Day 10
  • google cloud innovators 2
  • Google Cloud INSIDE Digital 2
  • Google Cloud INSIDE Games & Apps 9
  • Google Cloud INSIDE Media 1
  • Google Cloud INSIDE Retail 3
  • Google Cloud Messaging 11
  • google cloud next 4
  • google cloud next tokyo 12
  • Google Cloud Platform 16
  • Google Code-in 1
  • Google Dev Library 1
  • Google Developer Experts 2
  • google developer groups 1
  • google developer student clubs 1
  • Google Developers Academy 1
  • Google Developers live 5
  • Google Developers Summit 2
  • Google Drive 6
  • Google Earth 1
  • Google Fit 2
  • Google for Games 3
  • Google for Mobile 2
  • Google for Startups 8
  • Google for Work 1
  • Google I/O 27
  • Google I/O 2024 3
  • Google Identity Services 6
  • Google Impact Challenge 1
  • Google Maps 72
  • Google Maps Platform 92
  • Google Meet 1
  • Google ML Summit 2
  • Google Open Source Peer Bonus 1
  • Google Pay 6
  • Google Photo 1
  • Google Play 148
  • Google Play App Safety 1
  • Google Play Billing 1
  • Google Play Console 15
  • Google Play developer distribution agreement 1
  • Google Play Developer Policies 2
  • Google Play Game Services 10
  • Google Play Instant 1
  • Google Play Services 23
  • Google Play Store 1
  • Google Play アプリ署名 1
  • Google Plus 14
  • Google Search 8
  • Google Sheets API 3
  • Google Sign-In 17
  • Google Slides API 5
  • Google Summer of Code 1
  • Google Tag Manager 1
  • Google Tensor 1
  • Google Trust Services 3
  • Google マップ 4
  • google_ads_api_v6 1
  • Google+ 2
  • Googleapps 10
  • GoogleCloud 5
  • GoogleCloudDay 5
  • GoogleCloudInside 1
  • googlecloudlearn 1
  • googlecloudnext 2
  • GoogleGames 1
  • GoogleI/O 31
  • GoogleLabs 1
  • GooglePlay 3
  • GoogleTV 1
  • GPS 1
  • Gradle 1
  • Growth Academy 1
  • gRPC 2
  • GTUG 5
  • GWT 2
  • hack4jp 2
  • hackathon 7
  • handson 1
  • Hangouts Chat 3
  • hardware 2
  • Hosting 3
  • hotel 1
  • How-To Guide 1
  • HTML5 17
  • HTML5Rocks 1
  • HTTP/2 5
  • HTTPS 19
  • I/O Extended 8
  • ID Token 1
  • Identity 18
  • identity check 1
  • Identity Toolkit 1
  • IGF2010 4
  • IGF2020 2
  • Ignite 4
  • Imagen 2 1
  • IME 12
  • Indie Game 7
  • Indie Games Festival 7
  • Indie Games Festival 2018 2
  • Indie Games Festival 2019 12
  • Indie Games Festival 2020 7
  • Industry Trends 1
  • Inevitable ja Night 30
  • Influence 1
  • innovators hive 2
  • Insights 1
  • Instagram 1
  • Instant Apps 6
  • intern 2
  • Invites 1
  • IO19 3
  • iOS 22
  • IoT 7
  • IPv6 1
  • Issue Tracker 2
  • IWD 1
  • Japanese 6
  • Japanese Developer 1
  • Japanese Input 1
  • java 1
  • JavaScript 13
  • Jetpack 5
  • Jetpack Compose 6
  • Journeys 1
  • K-12 1
  • Kaggle 1
  • Key Transparency 1
  • Knowledge Graph 1
  • Kotlin 25
  • Kotlin Android Extensions 1
  • kotlin api 1
  • Kotlin Beginners 3
  • Kotlin Vocabulary 2
  • Kubernetes 4
  • l10n 8
  • latest 18
  • latest news 1
  • launch 1
  • LaunchPad 2
  • Learn 2
  • lifull 1
  • Lighthouse 1
  • LINE 1
  • Local AI 1
  • Location 1
  • Lollipop 10
  • Machine Learning 32
  • MAD Skills 2
  • MADSkills 2
  • Maker Faire Tokyo 1
  • maps compose 1
  • maps embed api 1
  • Maps JavaScript API 6
  • maps on air 1
  • maps sdk 2
  • maps transportation 1
  • Marshmallow 10
  • Material 1
  • Material Design 31
  • MDL 2
  • MDN 1
  • MediaPipe 1
  • Messaging 1
  • metrics 1
  • MIDI 2
  • migration 1
  • mikan 1
  • Mixed Contents 4
  • ML 3
  • ML Kit 12
  • mlops 1
  • Mobile 16
  • Mobile Bootcamp 4
  • mobile optimized maps 1
  • Mobile Sites certification 1
  • Mobile Vision 4
  • mod_pagespeed 1
  • Model Maker 1
  • monetization 2
  • monetize 3
  • Mozc 15
  • Music 1
  • NativeDriver 2
  • NativeScript 1
  • Navigation 1
  • NBU 1
  • ndk 3
  • Nearby 5
  • News 1
  • Next Extended 1
  • Next Tokyo 4
  • Nexus 2
  • Nexus S 1
  • NFC 1
  • NIST 1
  • Node.js 3
  • notifications 2
  • Noto CJK 1
  • Now in Android 13
  • NPAPI 2
  • NPN 1
  • oauth 17
  • officehour 1
  • One Tap 2
  • online security 2
  • open silicon 2
  • open source 9
  • OpenAI 1
  • opencensus 1
  • opencloudsummit 1
  • OpenGL 4
  • OpenID 3
  • OpenID Connect 4
  • OpenSocial 1
  • opensource 20
  • OpenTitan 1
  • Optimization 1
  • OSV 1
  • p-max 3
  • Page Experience 1
  • passkey 3
  • Password Manager 4
  • Payment 8
  • Payment Handler API 1
  • Payment Request API 2
  • PDF 1
  • PEM 33
  • people 2
  • People API 3
  • Performance 16
  • Performance budget 1
  • performance max 2
  • Performance Monitoring 1
  • performance report 1
  • permissions 1
  • personalization 1
  • PersonFinder 1
  • Phishing 2
  • phone 1
  • photorealistic 3d tiles 1
  • Physical Web 3
  • Pi 1
  • Pixel 5
  • Place Picker 1
  • placements 1
  • places api 1
  • places SDK 1
  • Platform Stability 1
  • Play Billing 2
  • Play Billing Library 2
  • Play Console 2
  • Player Analytics 4
  • Playtime 2017 1
  • Policy 8
  • policy compliance 2
  • policy violations 2
  • polylines 1
  • Polymer 7
  • pricing 1
  • privacy 15
  • Privacy Sandbox 22
  • Progressive Web Apps 14
  • project hosting 1
  • Promise 2
  • Promo code 1
  • Protocol Buffers 1
  • PRPL 1
  • publicdata 1
  • Push API 1
  • Push Notification 6
  • PWA 4
  • Python 3
  • query builder 8
  • query validator 1
  • QUIC 2
  • quick builder 1
  • quick start widget 1
  • QWIKLABS 3
  • RAIL 1
  • raspberry pi 1
  • React 1
  • React Native 2
  • reactive programming 1
  • Realtime Database 9
  • Recap Live Japan 2019 3
  • reCaptcha 1
  • Redux 1
  • release 7
  • Remote Config 4
  • Remote Display API 1
  • Reporting API 1
  • Requirements 1
  • Resonance Audio 1
  • resource type 1
  • Rewarded Video Ads 2
  • RKP 1
  • rmf 2
  • routes api 3
  • RSS 1
  • Run on OS Login 1
  • Runtime Permission 1
  • Rust 2
  • Safe Browsing 4
  • safety 1
  • Sample Code 2
  • Santa Tracker 1
  • SBOM 1
  • schedule 1
  • schema 2
  • schema.org 1
  • Scorecards 1
  • script 2
  • SDG 1
  • sdk 1
  • search central 1
  • secur 1
  • Secure Element 1
  • security 96
  • selfie 1
  • Service Worker 4
  • SHA-1 1
  • Sigstore 4
  • silicon 3
  • Site Isolation 1
  • sketchup 1
  • skywater 1
  • SLSA 1
  • smart displays 1
  • smart home 1
  • smart shopping campaign 1
  • SmartLock for Passwords 5
  • social 4
  • Social Good 1
  • Social Media 1
  • software development 1
  • solution challenge 2
  • Solve 1
  • SPDY 3
  • speak2tweet 1
  • speaker 1
  • Spectre 2
  • speedometer 1
  • Spreadsheet 3
  • ssc 1
  • ssd 1
  • SSR 1
  • stable release 1
  • startup 7
  • Storage 3
  • store sales direct 1
  • story 2
  • streetview 3
  • Study Jams 12
  • subscriptions 5
  • sunset 10
  • Swift 2
  • SwiftShader 1
  • Symantec 1
  • tag 1
  • tapple 1
  • Task 4
  • Team Drive 1
  • techtalk 13
  • TensorFlow 43
  • TensorFlow Federated 1
  • TensorFlow Lite 8
  • TensorFlow Object Detection API 1
  • TensorFlow Probability 2
  • TensorFlow.js 4
  • test 4
  • Test Lab 6
  • TF Certificate 2
  • TFX 1
  • The Fast and the Curious 13
  • Titan M2 1
  • Titan Security Key 1
  • TLS 4
  • Topics 1
  • ToS 1
  • trace 1
  • Transliteration 1
  • Transparency 1
  • Trust 1
  • Trusted Web Activity 1
  • Trusty OS 1
  • TrustZone 1
  • Twitter 1
  • UA-CH 1
  • Udacity 20
  • Unity 3
  • update 1
  • usecase 1
  • User Agent string 2
  • UX 5
  • v10 2
  • v10.1 1
  • v11 1
  • v13 1
  • v15 1
  • v19 1
  • v3 1
  • v4 1
  • v5 1
  • v6.1 1
  • v7 2
  • V8 5
  • v9 1
  • valuetrack 1
  • Verifiable Design 1
  • vertex ai 1
  • Vision AI 1
  • VP9 1
  • VR 11
  • Vulkan 2
  • wafer 1
  • Watch Face 2
  • wave 2
  • Wear OS 3
  • Weave 1
  • Web 38
  • Web Animations 1
  • Web Components 9
  • Web Manifest 2
  • Web Packaging 3
  • Web Stories 3
  • Web Story 3
  • Web Vitals 7
  • web.dev 1
  • WebAssembly 6
  • WebAuthn 1
  • WebGL 5
  • Webhook 1
  • WebM 1
  • WebMusic 5
  • WebRTC 1
  • WebView 1
  • Windows 1
  • Women in Gaming 1
  • Women Techmakers 1
  • Women Techmakers Scholars Program 1
  • WomenDeveloperAcademy 1
  • Wordpress 2
  • workmanager 1
  • WTM 8
  • Xcode 1
  • YouTube 18
  • YouTube API 1
  • youtube select 1
  • インタビュー 1
  • コードサンプル 1
  • サプライ チェーン 1
  • プライバシー 1
  • 機械学習 3
  • 言論の自由 1
  • 節電 3
  • 定期購入 1
  • 東日本大震災 9
  • 日本語入力 41


ブログ アーカイブ


  •     2025
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2024
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2023
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2022
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2021
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2020
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2019
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2018
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2017
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2016
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2015
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
  •     2014
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2013
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2012
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2011
    • 12月
    • 11月
    • 10月
    • 9月
    • 8月
    • 7月
    • 6月
    • 5月
    • 4月
    • 3月
    • 2月
    • 1月
  •     2010
    • 12月
    • 11月

Feed


"プロダクトに関するご意見はプロダクトフォーラムにお願いします"
  • Google
  • Privacy
  • Terms