【Firebase】Firebase FunctionsのHTTPリクエストによるトリガーをアプリから呼び出す方法

2020年3月5日 | 広報・PR・イベント運営担当

Firebase Cloud Functions には、HTTP リクエストでトリガーできる関数があります。

そこで、筆者が試してみた解決策についてご紹介します。
(※ 学習の途中経過のご紹介のため、内容の正確性については検証が十分ではありませんのでご了承ください。)

Firebase Cloud Functions には、HTTP リクエストでトリガーできる関数があります。
基本的には下記のような形をしています。

 

const functions = require(‘firebase-functions’);

exports.helloWorld = functions.https.onRequest((request, response) =>
{
response.send(“Hello from Firebase!”);
});

この関数をアプリから呼び出したい場合に、簡単にできる仕組みが SDK に用意されています。
公式のドキュメントはこちらです。

まず、Function ですが、onRequest ではなく onCall というトリガーを使います。
例えば、下記のようになります。

 

const functions = require(‘firebase-functions’);

exports.testDemo = functions.https.onCall((data, context) =>
{
return { foo : data.foo };
});

これを、Firebase のサーバにデプロイします。
すると、Firebase コンソールの Functions の画面にデプロイした関数が表示されます。
この関数はアプリから呼び出すもののため、ブラウザで URL を開くとエラーが表示されます。
これを Android アプリから呼び出すには、まず、アプリレベルの build.gradle に下記の依存関係を追加します。

 

implementation ‘com.google.firebase:firebase-functions:19.0.2’

そして、下記のように実装します。

 

FirebaseFunctions functions = FirebaseFunctions.getInstance();

Map<String, Object> data = new HashMap<>();
data.put(“foo”, “bar”);

Task<HttpsCallableResult> task = functions.getHttpsCallable(“testDemo”).call(data);

task.addOnCompleteListener(new OnCompleteListener<HttpsCallableResult>() {
@Override
public void onComplete(@NonNull Task<HttpsCallableResult> task) {
if (task.isSuccessful()) {
HttpsCallableResult result = task.getResult();
Map map = (Map)result.getData();
Log.d(TAG, “Call function success ” + map);
} else {
Log.d(TAG, “Call function failure”, task.getException());
}
}
});

ローカルエミュレータで動作している Functions を呼び出すこともできます。
ローカルエミュレータは下記のコマンドで起動します。

 

$ firebase emulators:start –only functions

先程のアプリのコードの先頭付近を下記のように変更します。

 

FirebaseFunctions functions = FirebaseFunctions.getInstance();

functions.useFunctionsEmulator(“http://10.0.2.2:5001”);

ただし、このアプリを実行した場合、関数を呼び出したところで下記のようなエラーが出ます。

 

java.net.UnknownServiceException: CLEARTEXT communication to 10.0.2.2 not permitted by network security policy

Android 9 以降では、HTTP 通信が無効になっているために発生するエラーです。
これの修正方法はネットにもたくさんの情報が出ていますので、今回は割愛します。

その代わりに、useFunctionsEmulator(“http://10.0.2.2:5001”) の部分を useFunctionsEmulator(“localhost:5001”) に変更した場合のエラーについてご紹介します。
下記のようなエラーです。

 

java.net.ConnectException: failed to connect to localhost/127.0.0.1 (port 5001) from /127.0.0.1 (port ) after 10000ms: isConnected failed: ECONNREFUSED (Connection refused)

どうも localhost を指定することはできないようです。
その代わり、特別に用意されたアドレス 10.0.2.2 を使う必要があるようです。

(※ 学習の途中経過のご紹介のため、内容の正確性については検証が十分ではありませんのでご了承ください。)

 

いかがでしたか?

イー・エージェンシーでは、Google アナリティクス 360 やサポートをご契約のお客様を対象に、Google アナリティクス for Firebase の導入支援を行っております。

また、アプリとWebのクロスプラットフォーム分析ができるGoogle アナリティクス 4 プロパティ(GA4)の導入支援も行っております。

まずは下記よりお気軽にお問い合わせください。

Google アナリティクス for Firebase ・Google アナリティクス 4 プロパティ(GA4) の導入に関するお問い合わせはこちら

PICK UP

広報・PR・イベント運営担当

ライター

おもてなしを科学するイー・エージェンシーでは、クロスデバイス分析によるユーザー単位の分析やオンラインオフラインを横断した分析など次世代の分析をサポート。また分析データを元にしたABテスト支援から、EC領域での購買、行動データを活用したレコメンドシステムなどを提供。 お問い合わせはこちらにどうぞ。

お問い合わせ

サービスに関するご相談は
こちらよりお気軽にお問い合わせください。

e-Agencyの様々な情報をFacebookでお届けします!