Flutter iOS 音声メモアプリ開発(9)Firebaseのメッセージ機能

プロダクトとしてアプリを公開した後に、利用者に対してメッセージを送りたい場合があります。例えばバージョンアップのお知らせや、サービス変更のお知らせなどです。

FirebaseのMessaging機能を使うとそれが実現できそうなので、公開前に実装しておきたいと思います。

Firebaseへのアプリの登録

FirebaseのプロジェクトにiOSアプリを登録します。

登録するプロジェクトのIDと、iOSアプリのバンドルIDとを確認しておきます。

ターミナルから、以下のflutterfireコマンドでアプリを追加します。

dart pub global activate flutterfire_cli

flutterfire configure --project=<Your Project ID> --ios-bundle-id=<Your Bundle ID>

// FirebaseのProjectIDは、Project名とは異なるので注意
// ios のバンドルIDは省略可能だが後で変更不可なのでここで入れておく
// バンドルIDはアンダースコア(_)を含むとエラーになるので注意

プロジェクトにアプリが追加されると以下の2つのファイルが自動で生成されますので、確認しておきます。

  • lib/firebase_option.dart
  • iOS/Runner/GoogleService-info.plist 

次に、Firebaseの機能を使うためのfirebase_coreパッケージをインストールします。

flutter pub add firebase_core

main.dartに以下のコードを追加してFirebaseの機能を利用できるようにします。

import 'package:firebase_core/firebase_core.dart';   // firebase_coreをインポート
import 'firebase_options.dart';                                       // flutterfireコマンドで作成されたファイルをインポート

// ...

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  runApp(const MyApp());
}

Firebase Messaginigの利用

Firebase messagingには、Cloud MessageとIn-App messageの2種類あります。前者は通知として実装され、アプリの使用に関わらず、端末上に通知されます。一方後者は、アプリ起動時に表示されるメッセージとなります。

ここでは、後者のIn-App messageについて試してみます。

GoogleCloud APIの有効化

Google Cloudからアプリを登録したプロジェクトを開き、<APIとサービス>ー<有効なAPIとサービス>から”Firebase In-App Messaging API”を検索し、有効にします。

※FirebaseのプロジェクトとGoogle Cloudのプロジェクトは同じものです。

Flutterプロジェクトでのパッケージインポート

firebase_in_app_messageingパッケージをインストールし、main.dartにインポートします。

flutter pub add firebase_in_app_messaging

import 'package:firebase_in_app_messaging/firebase_in_app_messaging.dart';

これで、In-App-Messagingを受け取る準備ができました。

Firebase コンソールからメッセージの作成

メッセージの作成はFirebaseコンソールから行います。

In-App-Messagingの作成

FirebaseのサイドメニューエンゲージメントからMessagingを選択し、「最初のキャンペーンを作成」をクリックしてメッセージを作成します。

メッセージの種類ではFirebase In-APPメッセージを選択します。

メッセージのレイアウトを選択して、メッセージの内容を入力します。

画面表示のテストはこの段階で行なっておきます。公開してしまってからではテストはできません。

デバイスのプレビュー画面にある「デバイスでテスト」をクリックして、インストールIDを入力します。インストールIDの確認の仕方は以下に記載があります。

この方法以外にもflutterのfirebase_app_installationsパッケージを使って、以下のコードを実行させるとID取得することができます。

import 'package:firebase_app_installations/firebase_app_installations.dart';

void getFID() async {
  String id = await FirebaseInstallations.instance.getId();
  print('id : $id');
}

このコードを対象となるアプリに埋め込んで、デバッグモードで表示させることができます。

この後、Firebaseコンソールの設定で、表示させる対象ユーザや表示させるスケジュールを入力して公開すると設定は完了です。

このメッセージは1日に1回しか配信されませんので、すぐに通知が来ることはありません。

Xcode Push Notification

実際にアプリのアーカイブをApp Store Connectのビルドに追加すると、以下のメッセージが届きました。

ITMS-90078: Missing Push Notification Entitlement - Your app appears to register with the Apple Push Notification service, but the app signature's entitlements do not include the 'aps-environment' entitlement. If your app uses the Apple Push Notification service, make sure your App ID is enabled for Push Notification in the Provisioning Portal, and resubmit after signing your app with a Distribution provisioning profile that includes the 'aps-environment' entitlement. Xcode does not automatically copy the aps-environment entitlement from provisioning profiles at build time. This behavior is intentional. To use this entitlement, either enable Push Notifications in the project editor's Capabilities pane, or manually add the entitlement to your entitlements file. For more information, see

このメッセージは、flutterで開発したアプリをApp Store Connectに追加する際に、push通知を使用していなくても出されることがあるようです。

その場合は、無視しても良いとのことですが、今回は通知を使っていますので、対処しておきます。

Xcodeで、以下の画面を開いて、+CapabilitiesからPush Notificationsを探して追加します。

これで対処は完了です。再度、App Store Connectにビルドを追加してもこのメッセージは届きません。