Antes de comenzar
- 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.
- 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.
- Agrega Firebase a tu proyecto de Android.
- 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étodo | Canales | Descripció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.