Ir a la consola

Envía y recibe Firebase Invites desde tu app para Android

Antes de comenzar

  1. Si aún no conectaste la app al proyecto de Firebase, puedes hacerlo desde Firebase console. Cuando lo hagas, asegúrate de especificar tu clave de firma SHA-1.
  2. Si aún no habilitaste Firebase Dynamic Links, puedes hacerlo desde Firebase console. Para ello, abre la sección Dynamic Links y acepta las condiciones del servicio, si se te solicita que lo hagas. Firebase Invites se basa en Firebase Dynamic Links, por lo que debes habilitar Firebase Dynamic Links para usar Firebase Invites.
  3. Agrega Firebase a tu proyecto de Android.
  4. Agrega la dependencia para Firebase Invites a tu archivo build.gradle de nivel de app:
    implementation 'com.google.firebase:firebase-invites:17.0.0'
    

Envía invitaciones

Primero, compila un Intent mediante la clase 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)
}

Personaliza la invitación

Cuando crees el Intent de la invitación, tendrás que especificar el título del diálogo de la invitación y el mensaje que se enviará. También puedes personalizar la imagen y la URL de vínculo directo que se envía en la invitación, como en el ejemplo anterior, y puedes especificar HTML para enviar notificaciones enriquecidas por correo electrónico, lo cual es recomendable. Consulta las recomendaciones de Firebase Invites.

MétodoCanalesDescripción
setMessage Correo electrónico y SMS Configura el mensaje predeterminado que se envía con las invitaciones. El remitente puede editar este mensaje en el diálogo de la invitación. El texto no debe superar los 100 caracteres.
setDeepLink Correo electrónico y SMS Configura el vínculo a la app que se envía con las invitaciones. Precisa esta información para compartir contenido específico con el destinatario o para ofrecer una experiencia personalizada cuando un usuario abra la app desde una invitación.
setCustomImage Correo electrónico Establece la URL de una imagen personalizada que se incluirá en las invitaciones por correo electrónico. La imagen debe ser cuadrada y medir, aproximadamente, 600 x 600 píxeles. La imagen no puede superar los 4,000 x 4,000 píxeles.
setCallToActionText Correo electrónico Establece el texto del llamado a la acción del botón que aparece en las invitaciones por correo electrónico. El texto no debe superar los 32 caracteres.
setEmailHtmlContent Correo electrónico Recomendado: Configura el contenido de una invitación por correo electrónico. Configúralo para enviar invitaciones HTML enriquecidas por correo electrónico. Tu HTML debe incluir la string de marcador de posición %%APPINVITE_LINK_PLACEHOLDER%%, que se reemplaza con la URL que abre el destinatario para aceptar la invitación. Cuando especificas mensajes de correo electrónico personalizados, los métodos setDescription, setCustomImage y setCallToActionText no tienen efecto.
setEmailSubject Correo electrónico Obligatorio si se usa setEmailHtmlContent. Configura la línea de asunto de las invitaciones por correo electrónico.

Si tu app tiene una versión para iOS y quieres enviar una invitación que se pueda abrir tanto en Android como en iOS, pasa el ID de cliente de OAuth 2.0 de tu app para iOS a setOtherPlatformsTargetApplication cuando compiles el intent de la invitación. Puedes encontrar el ID de cliente de tu app para iOS en el archivo GoogleService-Info.plist que descargaste desde Firebase console. Por ejemplo:

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()

Cuando se inicia el intent AppInviteInvitation, se abre una ventana de selección de contactos para que el usuario elija a quiénes enviarles una invitación. Las invitaciones se envían por correo electrónico o por SMS. Una vez que el usuario elige los contactos y envía la invitación, la app recibe una devolución de llamada a 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
            // ...
        }
    }
}

Recibe invitaciones

Cuando un usuario recibe una invitación, si aún no instaló la app, podrá hacerlo desde Google Play Store. Una vez instalada la app (o si ya estaba en el dispositivo), esta se inicia y comienza a recibir la URL de contenido, si es que enviaste una. Para recibir la URL del contenido de tu app, llama al 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) }
}

Debes llamar a getDynamicLink() en cada una de las actividades que pueda iniciar el vínculo, aunque esté disponible en el intent mediante el método getIntent().getData(). Llamar a getDynamicLink() recupera el vínculo y el ID de la invitación, y borra esos datos para que la app los procese solo una vez.

Generalmente, se llama a getDynamicLink() en la actividad principal y en las actividades iniciadas por los filtros de intent que coinciden con el vínculo.