iOS アプリから Firebase Invites を送受信する

前提条件

Firebase Invites は iOS 8 以降で動作します。アプリで iOS 7 をターゲットに設定することもできますが、アプリが実行されているのが iOS 8 以降ではない場合、すべての Firebase Invites SDK の呼び出しは行われません。

準備

  1. アプリを Firebase プロジェクトに接続していない場合は、Firebase console で接続します。
  2. Firebase Dynamic Links を有効にしていない場合は、Firebase console から [Dynamic Links] セクションを開き、表示される利用規約に同意して、有効にします。Firebase Invites は Firebase Dynamic Links 上に構築されているため、Firebase Invites を使用するには Firebase Dynamic Links を有効にする必要があります。
  3. Firebase を iOS プロジェクトに追加しますPodfile で次のポッドを指定します。
    pod 'Firebase/Invites'
  4. Firebase モジュールを UIApplicationDelegate サブクラスにインポートします。

    Objective-C

    @import Firebase;
    

    Swift

    import Firebase
    
  5. FIRApp 共有インスタンスを設定します。通常はアプリケーションの application:didFinishLaunchingWithOptions: メソッドを使用します。

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    

    Swift

    // Use Firebase library to configure APIs
    FIRApp.configure()
    
  6. Xcode では、プロジェクトの Info.plist を編集し、キー NSContactsUsageDescription(「Privacy - Contacts Usage Description」)を使用してプロパティを追加し、アプリでの連絡先データの使用方法を記述する値を追加します。たとえば、「MyRecipeApp uses your contacts to make it easy to share recipes with your friends.」と入力します。
  7. アプリで Google ログインを実装します。招待状を送信するには、自分の Google アカウントでログインする必要があります。

受信したアプリ招待状を処理する

アプリを設定したら、次に受信したアプリ招待状を処理できるようにする必要があります。

ユーザーが iOS 端末で受信したアプリ招待状を選択した時点でそのアプリがまだインストールされていない場合は、iTunes App Store ページからインストールするように選択できます。ユーザーがアプリのユーザーとして定着し、長期に渡って使用してくれる可能性を高めるため、ユーザーがアプリをはじめて開くときは、個人に合わせたオンボーディング プロセスを提供することが重要です。 そのために、Invites SDK にはユーザーが受信したアプリ招待に関連付けられるディープリンクと招待 ID が用意されています。

Objective-C

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Use Firebase library to configure APIs
  [FIRApp configure];
  return YES;
}
- (BOOL)application:(nonnull UIApplication *)application
            openURL:(nonnull NSURL *)url
            options:(nonnull NSDictionary<NSString *, id> *)options {
  return [self application:application
                   openURL:url
         sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  // Handle App Invite requests
  FIRReceivedInvite *invite =
      [FIRInvites handleURL:url sourceApplication:sourceApplication annotation:annotation];
  if (invite) {
    NSString *matchType =
        (invite.matchType == FIRReceivedInviteMatchTypeWeak) ? @"Weak" : @"Strong";
    NSString *message =
        [NSString stringWithFormat:@"Deep link from %@ \nInvite ID: %@\nApp URL: %@\nMatch Type:%@",
                                   sourceApplication, invite.inviteId, invite.deepLink, matchType];

    [[[UIAlertView alloc] initWithTitle:@"Deep-link Data"
                                message:message
                               delegate:nil
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil] show];

    return YES;
  }

  return [[GIDSignIn sharedInstance] handleURL:url
                             sourceApplication:sourceApplication
                                    annotation:annotation];
}

Swift

func application(_ application: UIApplication,
  didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
  // Use Firebase library to configure APIs
  FIRApp.configure()
  return true
}
@available(iOS 9.0, *)
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
  -> Bool {
    return self.application(application, open: url, sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String, annotation: "")
}

func application(_ application: UIApplication,
  open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    if let invite = FIRInvites.handle(url, sourceApplication:sourceApplication, annotation:annotation) as? FIRReceivedInvite {
      let matchType =
          (invite.matchType == .weak) ? "Weak" : "Strong"
      print("Invite received from: \(sourceApplication) Deeplink: \(invite.deepLink)," +
          "Id: \(invite.inviteId), Type: \(matchType)")
      return true
    }

    return GIDSignIn.sharedInstance().handle(url, sourceApplication: sourceApplication, annotation: annotation)
}

ユーザーがアプリ招待を送信できるようにする

アプリで受信した招待を処理できるようになったら、次はアプリからユーザーの連絡先に招待状を送信できるようにします。

ユーザーは、招待を送信する前に Google アカウントでログインする必要があります。

招待状を送信するには、まず FIRInviteDelegate プロトコルを実装していることを宣言します。

Objective-C

@interface ViewController ()<FIRInviteDelegate>

Swift

class ViewController: UIViewController, FIRInviteDelegate {
  // ...

次に、招待状の送信ボタンをアプリに追加します。このボタンはメインメニューのオプションとして追加するか、ユーザーが特定のコンテンツを招待状と一緒に送信できるように、ディープリンク可能なコンテンツの横に追加します。詳しくは、「Firebase Invites: おすすめの方法」をご覧ください。

ユーザーが招待状の送信ボタンをタップしたら招待状ダイアログが開くようにします。

Objective-C

- (IBAction)inviteTapped:(id)sender {
  _inviteDialog = [FIRInvites inviteDialog];
  [_inviteDialog setInviteDelegate:self];

  // NOTE: You must have the App Store ID set in your developer console project
  // in order for invitations to successfully be sent.
  NSString *message =
      [NSString stringWithFormat:@"Try this out!\n -%@",
                                 [GIDSignIn sharedInstance].currentUser.profile.name];

  // A message hint for the dialog. Note this manifests differently depending on the
  // received invation type. For example, in an email invite this appears as the subject.
  [_inviteDialog setMessage:message];

  // Title for the dialog, this is what the user sees before sending the invites.
  [_inviteDialog setTitle:@"Invites Example"];
  [_inviteDialog setDeepLink:@"app_url"];
  [_inviteDialog setCallToActionText:@"Install!"];
  [_inviteDialog setCustomImage:@"https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png"];
  [_inviteDialog open];
}

Swift

@IBAction func inviteTapped(_ sender: AnyObject) {
  if let invite = FIRInvites.inviteDialog() {
    invite.setInviteDelegate(self)

    // NOTE: You must have the App Store ID set in your developer console project
    // in order for invitations to successfully be sent.

    // A message hint for the dialog. Note this manifests differently depending on the
    // received invation type. For example, in an email invite this appears as the subject.
    invite.setMessage("Try this out!\n -\(GIDSignIn.sharedInstance().currentUser.profile.name)")
    // Title for the dialog, this is what the user sees before sending the invites.
    invite.setTitle("Invites Example")
    invite.setDeepLink("app_url")
    invite.setCallToActionText("Install!")
    invite.setCustomImage("https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png")
    invite.open()
  }
}

招待状をカスタマイズする

招待状ダイアログを作成するときは、招待状ダイアログのタイトルと送信する招待メッセージを指定する必要があります。 また、上記の例に示すように、招待状で送信する画像とディープリンク URL をカスタマイズできます。

メソッドチャネル説明
setTitle メールと SMS 必須: 招待状ダイアログのタイトルを設定します。
setMessage メールと SMS 必須: 招待 SMS のデフォルトのテキストと招待メールのデフォルトの件名を設定します。送信者は招待ダイアログでこのメッセージを編集できます。100 文字以内で指定してください。
setDeepLink メールと SMS 招待状で送信されるアプリへのリンクを設定します。特定のコンテンツを受信者と共有する場合、またはユーザーが招待状からアプリを開くときの動作をカスタマイズする場合は、これを設定します。
setDescription メール 招待メールに含めるアプリの説明を設定します。 1,000 文字以内で指定してください。
setCustomImage メール 招待メールに含めるカスタム画像の URL を設定します。画像は 600×600 ピクセル程度の正方形にする必要があります。画像は 4,000×4,000 ピクセル以内のサイズにしてください。
setCallToActionText メール 招待メールに表示するボタンに表示する、行動を促すフレーズのテキストを設定します。32 文字以内で指定してください。

アプリに Android バージョンがあり、iOS に加えて Android でも開くことができる招待状を送信する場合は、招待状を開く前に setOtherPlatformsTargetApplication:targetApplication を呼び出します。次に例を示します。

Objective-C

FIRInvitesTargetApplication *targetApplication = [[FIRInvitesTargetApplication alloc] init];
targetApplication.androidClientID = self.androidClientIDLabel.text;
[inviteBuilder setOtherPlatformsTargetApplication:targetApplication];

Swift

let targetApplication = FIRInvitesTargetApplication.alloc().init()
targetApplication.androidClientID = self.androidClientIDLabel.text
inviteBuilder.setOtherPlatformsTargetApplication(targetApplication)

inviteTapped メソッドによって、ユーザーが招待する連絡先を選択できる連絡先選択ツールが開きます。ユーザーが招待状を送信すると、アプリは inviteFinishedWithInvitations メソッドへのコールバックを受信します。

Objective-C

- (void)inviteFinishedWithInvitations:(NSArray *)invitationIds error:(NSError *)error {
  NSString *message =
      error ? error.localizedDescription
            : [NSString stringWithFormat:@"%lu invites sent", (unsigned long)invitationIds.count];
  [[[UIAlertView alloc] initWithTitle:@"Done"
                              message:message
                             delegate:nil
                    cancelButtonTitle:@"OK"
                    otherButtonTitles:nil] show];
}

Swift

func inviteFinished(withInvitations invitationIds: [Any], error: Error?) {
  if let error = error {
    print("Failed: " + error.localizedDescription)
  } else {
    print("Invitations sent")
  }
}

フィードバックを送信...