Ir para o console

Enviar e receber Firebase Invites do seu app para Android

Antes de começar

  1. Caso você ainda não tenha conectado o app ao projeto do Firebase, faça isso no Firebase console. Quando estiver fazendo isso, lembre-se de especificar a chave de assinatura SHA-1.
  2. Se você ainda não ativou o Firebase Dynamic Links, abra a seção "Dynamic Links" no Firebase console e aceite os temos de serviço, se solicitado. Como o Firebase invites tem o Firebase Dynamic Links como base, é preciso ativar o Firebase Dynamic Links para usar o Firebase invites.
  3. Adicione o Firebase ao seu projeto do Android.
  4. Adicione a dependência do Firebase invites ao seu arquivo build.gradle no nível do app:
    implementation 'com.google.firebase:firebase-invites:17.0.0'
    

Enviar convites

Para começar, crie um Intent usando a classe AppInviteInvitation.IntentBuilder:

Java

private void onInviteClicked() {
    Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
            .setMessage(getString(R.string.invitation_message))
            .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link)))
            .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image)))
            .setCallToActionText(getString(R.string.invitation_cta))
            .build();
    startActivityForResult(intent, REQUEST_INVITE);
}

Kotlin

private fun onInviteClicked() {
    val intent = AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
            .setMessage(getString(R.string.invitation_message))
            .setDeepLink(Uri.parse(getString(R.string.invitation_deep_link)))
            .setCustomImage(Uri.parse(getString(R.string.invitation_custom_image)))
            .setCallToActionText(getString(R.string.invitation_cta))
            .build()
    startActivityForResult(intent, REQUEST_INVITE)
}

Personalizar o convite

Quando você cria o Intent do convite, precisa especificar o título da caixa de diálogo e a mensagem do convite a enviar. É possível personalizar a imagem e o URL do link direto enviados no convite, como no exemplo acima, bem como especificar o HTML para enviar convites de e-mail avançados, o que é recomendado. Veja Firebase invites: práticas recomendadas.

MétodoCanaisDescrição
setMessage E-mail e SMS Define a mensagem padrão enviada com os convites. Esta mensagem pode ser editada pelo remetente na caixa de diálogo do convite. Ela não pode exceder 100 caracteres.
setDeepLink E-mail e SMS Configura o link no app que é enviado com os convites. Especifique o link para compartilhar conteúdo específico com o destinatário ou para proporcionar uma experiência personalizada quando um usuário abre o app a partir de um convite.
setCustomImage E-mail Define o URL de uma imagem personalizada a ser incluída nos convites por e-mail. A imagem deve ser quadrada e com cerca de 600x600 pixels. A imagem não pode ser maior do que 4.000x4.000 pixels.
setCallToActionText E-mail Define o texto da Call-to-Action do botão renderizado nos convites por e-mail. O texto não pode exceder 32 caracteres.
setEmailHtmlContent E-mail Recomendado: define o conteúdo de um convite por e-mail. Configure este método para enviar convites HTML avançados por e-mail. O HTML deve incluir a string do marcador de posição %%APPINVITE_LINK_PLACEHOLDER%%, que é substituída pelo URL que o destinatário abre para aceitar o convite. Quando você especifica mensagems de e-mail personalizadas, os métodos setDescription, setCustomImage e setCallToActionText não têm efeito.
setEmailSubject E-mail Necessário caso setEmailHtmlContent seja usado. Define a linha de assunto dos convites por e-mail.

Caso você tenha uma versão para iOS do seu app e queira enviar um convite que possa ser aberto tanto no iOS quanto no Android, transfira o ID do cliente do OAuth 2.0 do seu aplicativo iOS ao setOtherPlatformsTargetApplication ao criar o intent de convite. O ID do cliente do app iOS é encontrado no arquivo GoogleService-Info.plist que você salvou do Console do Firebase. Por exemplo:

Java

Intent intent = new AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
        // ...
        .setOtherPlatformsTargetApplication(
                AppInviteInvitation.IntentBuilder.PlatformMode.PROJECT_PLATFORM_IOS,
                IOS_APP_CLIENT_ID)
        // ...
        .build();

Kotlin

val intent = AppInviteInvitation.IntentBuilder(getString(R.string.invitation_title))
        // ...
        .setOtherPlatformsTargetApplication(
                AppInviteInvitation.IntentBuilder.PlatformMode.PROJECT_PLATFORM_IOS,
                IOS_APP_CLIENT_ID)
        // ...
        .build()

Iniciar o intent AppInviteInvitation abre o seletor de contatos, no qual usuário seleciona os contatos a convidar. Os convites são enviados por e-mail ou SMS. Depois que o usuário escolhe os contatos e envia os convites, o app recebe uma chamada de retorno para onActivityResult:

Java

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Log.d(TAG, "onActivityResult: requestCode=" + requestCode + ", resultCode=" + resultCode);

    if (requestCode == REQUEST_INVITE) {
        if (resultCode == RESULT_OK) {
            // Get the invitation IDs of all sent messages
            String[] ids = AppInviteInvitation.getInvitationIds(resultCode, data);
            for (String id : ids) {
                Log.d(TAG, "onActivityResult: sent invitation " + id);
            }
        } else {
            // Sending failed or it was canceled, show failure message to the user
            // ...
        }
    }
}

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    Log.d(TAG, "onActivityResult: requestCode=$requestCode, resultCode=$resultCode")

    if (requestCode == REQUEST_INVITE) {
        if (resultCode == Activity.RESULT_OK) {
            // Get the invitation IDs of all sent messages
            val ids = AppInviteInvitation.getInvitationIds(resultCode, data!!)
            for (id in ids) {
                Log.d(TAG, "onActivityResult: sent invitation $id")
            }
        } else {
            // Sending failed or it was canceled, show failure message to the user
            // ...
        }
    }
}

Receber convites

Quando um usuário recebe um convite mas ainda não instalou o app, ele tem a opção de instalá-lo a partir da Google Play Store. Quando o app está instalado, ele inicia e recebe o URL para o conteúdo dele, caso tenha sido enviado. Para receber o URL referente ao conteúdo do app, chame o método getDynamicLink:

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    // Check for App Invite invitations and launch deep-link activity if possible.
    // Requires that an Activity is registered in AndroidManifest.xml to handle
    // deep-link URLs.
    FirebaseDynamicLinks.getInstance().getDynamicLink(getIntent())
            .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
                @Override
                public void onSuccess(PendingDynamicLinkData data) {
                    if (data == null) {
                        Log.d(TAG, "getInvitation: no data");
                        return;
                    }

                    // Get the deep link
                    Uri deepLink = data.getLink();

                    // Extract invite
                    FirebaseAppInvite invite = FirebaseAppInvite.getInvitation(data);
                    if (invite != null) {
                        String invitationId = invite.getInvitationId();
                    }

                    // Handle the deep link
                    // ...
                }
            })
            .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "getDynamicLink:onFailure", e);
                }
            });
}

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    // Check for App Invite invitations and launch deep-link activity if possible.
    // Requires that an Activity is registered in AndroidManifest.xml to handle
    // deep-link URLs.
    FirebaseDynamicLinks.getInstance().getDynamicLink(intent)
            .addOnSuccessListener(this, OnSuccessListener { data ->
                if (data == null) {
                    Log.d(TAG, "getInvitation: no data")
                    return@OnSuccessListener
                }

                // Get the deep link
                val deepLink = data.link

                // Extract invite
                val invite = FirebaseAppInvite.getInvitation(data)
                val invitationId = invite.invitationId

                // Handle the deep link
                // ...
            })
            .addOnFailureListener(this) { e -> Log.w(TAG, "getDynamicLink:onFailure", e) }
}

Chame o getDynamicLink() em todas as atividades iniciadas pelo link, mesmo que ele esteja disponível no intent usando getIntent().getData(). O link e o código do convite são recuperados chamando getDynamicLink(), que limpa esses dados para que eles sejam processados apenas uma vez pelo app.

Normalmente, o getDynamicLink() é chamado na atividade principal e em qualquer atividade iniciada por filtros de intent que correspondam ao link.