Belohnen Sie Empfehlungen

Eine der effektivsten Möglichkeiten, neue Benutzer zu gewinnen, sind Benutzerempfehlungen. Sie können dynamische Links zusammen mit Realtime Database und Cloud Functions for Firebase verwenden, um Ihre Benutzer zu ermutigen, ihre Freunde einzuladen, indem Sie sowohl dem Referrer als auch dem Empfänger In-App-Belohnungen für erfolgreiche Empfehlungen anbieten.

Hauptvorteile

  • Beschleunigen Sie das Wachstum, indem Sie Ihren Benutzern einen Anreiz bieten, ihre Freunde einzuladen.
  • Einladungslinks funktionieren plattformübergreifend.
  • Neue Benutzer, die Ihre App zum ersten Mal öffnen, erhalten ein First-Run-Erlebnis, das Sie für sie anpassen. Beispielsweise können Sie sie automatisch mit dem Freund verbinden, der sie eingeladen hat.
  • Verzögern Sie optional die Gewährung von Belohnungen, bis neue Benutzer eine Einführungsaufgabe abgeschlossen haben, z. B. das Abschließen eines Tutorials.

So fangen Sie an!

Richten Sie Firebase und das Dynamic Links SDK ein

Richten Sie ein neues Firebase-Projekt ein und installieren Sie das Dynamic Links SDK in Ihrer App. ( iOS , Android , C++ , Unity ). Durch die Installation des Dynamic Links SDK kann Firebase Daten über den Dynamic Link an die App weitergeben, auch nachdem der Benutzer die App installiert hat. Ohne das SDK gibt es keine Möglichkeit, einen Benutzer nach der Installation mit einem Klick vor der Installation zu verbinden.

Um eine Einladung zu erstellen, erstellen Sie zunächst den Link, den der Empfänger öffnet, um die Einladung anzunehmen. Später fügen Sie diesen Link in den Einladungstext ein. Wenn ein Empfänger der Einladung Ihre App installiert, indem er den Link öffnet, kann er ein angepasstes First-Run-Erlebnis erhalten, einschließlich des Erhalts einer In-App-Belohnung.

Dieser Einladungslink ist ein dynamischer Link mit einem link , der angibt, dass er von Ihrem bestehenden Benutzer stammt.

Es gibt viele Möglichkeiten, wie Sie diese link -Payloads formatieren und in Ihre App einbinden können. Eine einfache Möglichkeit besteht darin, die Benutzerkonto-ID des Absenders in einem Abfrageparameter wie im folgenden Beispiel anzugeben:

https://mygame.example.com/?invitedby=SENDER_UID

Um dann dynamische Links zu erstellen , die für die Aufnahme in eine Einladung geeignet sind, können Sie die Dynamic Link Builder API verwenden:

Schnell

Hinweis: Dieses Firebase-Produkt ist auf macOS-, Mac Catalyst-, tvOS- oder watchOS-Zielen nicht verfügbar.
guard let uid = Auth.auth().currentUser?.uid else { return }
let link = URL(string: "https://mygame.example.com/?invitedby=\(uid)")
let referralLink = DynamicLinkComponents(link: link!, domain: "example.page.link")

referralLink.iOSParameters = DynamicLinkIOSParameters(bundleID: "com.example.ios")
referralLink.iOSParameters?.minimumAppVersion = "1.0.1"
referralLink.iOSParameters?.appStoreID = "123456789"

referralLink.androidParameters = DynamicLinkAndroidParameters(packageName: "com.example.android")
referralLink.androidParameters?.minimumVersion = 125

referralLink.shorten { (shortURL, warnings, error) in
  if let error = error {
    print(error.localizedDescription)
    return
  }
  self.invitationUrl = shortURL
}

Java

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String uid = user.getUid();
String link = "https://mygame.example.com/?invitedby=" + uid;
FirebaseDynamicLinks.getInstance().createDynamicLink()
        .setLink(Uri.parse(link))
        .setDomainUriPrefix("https://example.page.link")
        .setAndroidParameters(
                new DynamicLink.AndroidParameters.Builder("com.example.android")
                        .setMinimumVersion(125)
                        .build())
        .setIosParameters(
                new DynamicLink.IosParameters.Builder("com.example.ios")
                        .setAppStoreId("123456789")
                        .setMinimumVersion("1.0.1")
                        .build())
        .buildShortDynamicLink()
        .addOnSuccessListener(new OnSuccessListener<ShortDynamicLink>() {
            @Override
            public void onSuccess(ShortDynamicLink shortDynamicLink) {
                mInvitationUrl = shortDynamicLink.getShortLink();
                // ...
            }
        });

Kotlin+KTX

val user = Firebase.auth.currentUser!!
val uid = user.uid
val invitationLink = "https://mygame.example.com/?invitedby=$uid"
Firebase.dynamicLinks.shortLinkAsync {
    link = Uri.parse(invitationLink)
    domainUriPrefix = "https://example.page.link"
    androidParameters("com.example.android") {
        minimumVersion = 125
    }
    iosParameters("com.example.ios") {
        appStoreId = "123456789"
        minimumVersion = "1.0.1"
    }
}.addOnSuccessListener { shortDynamicLink ->
    mInvitationUrl = shortDynamicLink.shortLink
    // ...
}

Verschicke die Einladungen

Nachdem Sie den Link erstellt haben, können Sie ihn in eine Einladung einfügen. Die Einladung kann eine E-Mail, eine SMS-Nachricht oder ein anderes Medium sein, je nachdem, was für Ihre App und Ihr Publikum am besten geeignet ist.

So senden Sie beispielsweise eine E-Mail-Einladung:

Schnell

Hinweis: Dieses Firebase-Produkt ist auf macOS-, Mac Catalyst-, tvOS- oder watchOS-Zielen nicht verfügbar.
guard let referrerName = Auth.auth().currentUser?.displayName else { return }
let subject = "\(referrerName) wants you to play MyExampleGame!"
let invitationLink = invitationUrl?.absoluteString
let msg = "<p>Let's play MyExampleGame together! Use my <a href=\"\(invitationLink)\">referrer link</a>!</p>"

if !MFMailComposeViewController.canSendMail() {
  // Device can't send email
  return
}
let mailer = MFMailComposeViewController()
mailer.mailComposeDelegate = self
mailer.setSubject(subject)
mailer.setMessageBody(msg, isHTML: true)
myView.present(mailer, animated: true, completion: nil)

Java

String referrerName = FirebaseAuth.getInstance().getCurrentUser().getDisplayName();
String subject = String.format("%s wants you to play MyExampleGame!", referrerName);
String invitationLink = mInvitationUrl.toString();
String msg = "Let's play MyExampleGame together! Use my referrer link: "
        + invitationLink;
String msgHtml = String.format("<p>Let's play MyExampleGame together! Use my "
        + "<a href=\"%s\">referrer link</a>!</p>", invitationLink);

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_TEXT, msg);
intent.putExtra(Intent.EXTRA_HTML_TEXT, msgHtml);
if (intent.resolveActivity(getPackageManager()) != null) {
    startActivity(intent);
}

Kotlin+KTX

val referrerName = Firebase.auth.currentUser?.displayName
val subject = String.format("%s wants you to play MyExampleGame!", referrerName)
val invitationLink = mInvitationUrl.toString()
val msg = "Let's play MyExampleGame together! Use my referrer link: $invitationLink"
val msgHtml = String.format("<p>Let's play MyExampleGame together! Use my " +
        "<a href=\"%s\">referrer link</a>!</p>", invitationLink)

val intent = Intent(Intent.ACTION_SENDTO).apply {
    data = Uri.parse("mailto:") // only email apps should handle this
    putExtra(Intent.EXTRA_SUBJECT, subject)
    putExtra(Intent.EXTRA_TEXT, msg)
    putExtra(Intent.EXTRA_HTML_TEXT, msgHtml)
}
intent.resolveActivity(packageManager)?.let {
    startActivity(intent)
}

Abrufen von Empfehlungsinformationen in Ihrer App

Wenn der Einladungsempfänger den Empfehlungslink öffnet, wird er zum App Store oder Play Store weitergeleitet, um Ihre App zu installieren, falls sie noch nicht installiert ist. Wenn sie Ihre App dann zum ersten Mal öffnen, können Sie die Empfehlungsinformationen abrufen, die Sie in den dynamischen Link aufgenommen haben, und sie verwenden, um die Prämie anzuwenden.

Normalerweise möchten Sie Empfehlungsprämien erst gewähren, nachdem sich der Einladungsempfänger angemeldet hat, oder sogar erst, nachdem der neue Benutzer eine Aufgabe abgeschlossen hat. Bis die Prämienkriterien erfüllt sind, müssen Sie die Prämieninformationen, die Sie über den dynamischen Link erhalten haben, im Auge behalten.

Eine Möglichkeit, diese Informationen zu verfolgen, besteht darin, den Benutzer anonym anzumelden und die Daten im Datensatz der Echtzeitdatenbank des anonymen Kontos zu speichern. Wenn sich der Empfänger anmeldet und das anonyme Konto in ein dauerhaftes Konto umgewandelt wird, hat das neue Konto dieselbe UID wie das anonyme Konto und hat folglich Zugriff auf die Prämieninformationen.

So speichern Sie beispielsweise die UID des Referrers, nachdem der Empfänger Ihre App geöffnet hat:

Schnell

Hinweis: Dieses Firebase-Produkt ist auf macOS-, Mac Catalyst-, tvOS- oder watchOS-Zielen nicht verfügbar.
struct MyApplication: App {

  var body: some Scene {
    WindowGroup {
      VStack {
        Text("Example text")
      }
      .onOpenURL { url in
        if DynamicLinks.dynamicLinks()?.shouldHandleDynamicLink(fromCustomSchemeURL: url) ?? false {
        let dynamicLink = DynamicLinks.dynamicLinks()?.dynamicLink(fromCustomSchemeURL: url)
        handleDynamicLink(dynamicLink)
      }
      // Handle incoming URL with other methods as necessary
      // ...
      }
    }
  }
}

func handleDynamicLink(_ dynamicLink: DynamicLink?) {
  guard let dynamicLink = dynamicLink else { return false }
  guard let deepLink = dynamicLink.url else { return false }
  let queryItems = URLComponents(url: deepLink, resolvingAgainstBaseURL: true)?.queryItems
  let invitedBy = queryItems?.filter({(item) in item.name == "invitedby"}).first?.value
  let user = Auth.auth().currentUser
  // If the user isn't signed in and the app was opened via an invitation
  // link, sign in the user anonymously and record the referrer UID in the
  // user's RTDB record.
  if user == nil && invitedBy != nil {
    Auth.auth().signInAnonymously() { (user, error) in
      if let user = user {
        let userRecord = Database.database().reference().child("users").child(user.uid)
        userRecord.child("referred_by").setValue(invitedBy)
        if dynamicLink.matchConfidence == .weak {
          // If the Dynamic Link has a weak match confidence, it is possible
          // that the current device isn't the same device on which the invitation
          // link was originally opened. The way you handle this situation
          // depends on your app, but in general, you should avoid exposing
          // personal information, such as the referrer's email address, to
          // the user.
        }
      }
    }
  }
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // ...

    FirebaseDynamicLinks.getInstance()
            .getDynamicLink(getIntent())
            .addOnSuccessListener(this, new OnSuccessListener<PendingDynamicLinkData>() {
                @Override
                public void onSuccess(PendingDynamicLinkData pendingDynamicLinkData) {
                    // Get deep link from result (may be null if no link is found)
                    Uri deepLink = null;
                    if (pendingDynamicLinkData != null) {
                        deepLink = pendingDynamicLinkData.getLink();
                    }
                    //
                    // If the user isn't signed in and the pending Dynamic Link is
                    // an invitation, sign in the user anonymously, and record the
                    // referrer's UID.
                    //
                    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                    if (user == null
                            && deepLink != null
                            && deepLink.getBooleanQueryParameter("invitedby", false)) {
                        String referrerUid = deepLink.getQueryParameter("invitedby");
                        createAnonymousAccountWithReferrerInfo(referrerUid);
                    }
                }
            });
}

private void createAnonymousAccountWithReferrerInfo(final String referrerUid) {
    FirebaseAuth.getInstance()
            .signInAnonymously()
            .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                @Override
                public void onSuccess(AuthResult authResult) {
                    // Keep track of the referrer in the RTDB. Database calls
                    // will depend on the structure of your app's RTDB.
                    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                    DatabaseReference userRecord =
                            FirebaseDatabase.getInstance().getReference()
                                    .child("users")
                                    .child(user.getUid());
                    userRecord.child("referred_by").setValue(referrerUid);
                }
            });
}

Kotlin+KTX

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

    // ...

    Firebase.dynamicLinks
            .getDynamicLink(intent)
            .addOnSuccessListener(this) { pendingDynamicLinkData ->
                // Get deep link from result (may be null if no link is found)
                var deepLink: Uri? = null
                if (pendingDynamicLinkData != null) {
                    deepLink = pendingDynamicLinkData.link
                }
                //
                // If the user isn't signed in and the pending Dynamic Link is
                // an invitation, sign in the user anonymously, and record the
                // referrer's UID.
                //
                val user = Firebase.auth.currentUser
                if (user == null &&
                        deepLink != null &&
                        deepLink.getBooleanQueryParameter("invitedby", false)) {
                    val referrerUid = deepLink.getQueryParameter("invitedby")
                    createAnonymousAccountWithReferrerInfo(referrerUid)
                }
            }
}

private fun createAnonymousAccountWithReferrerInfo(referrerUid: String?) {
    Firebase.auth
            .signInAnonymously()
            .addOnSuccessListener {
                // Keep track of the referrer in the RTDB. Database calls
                // will depend on the structure of your app's RTDB.
                val user = Firebase.auth.currentUser
                val userRecord = Firebase.database.reference
                        .child("users")
                        .child(user!!.uid)
                userRecord.child("referred_by").setValue(referrerUid)
            }
}

Wenn sich der Einladungsempfänger dann entscheidet, ein Konto zu erstellen, können Sie die Empfehlungsinformationen aus dem anonymen Konto in das neue Konto des Einladungsempfängers übertragen.

Rufen Sie zuerst ein AuthCredential -Objekt ab, indem Sie die Anmeldemethode verwenden, die der Eingeladene verwenden möchte. So melden Sie sich beispielsweise mit einer E-Mail-Adresse und einem Passwort an:

Schnell

Hinweis: Dieses Firebase-Produkt ist auf macOS-, Mac Catalyst-, tvOS- oder watchOS-Zielen nicht verfügbar.
let credential = EmailAuthProvider.credential(withEmail: email, password: password)

Java

AuthCredential credential = EmailAuthProvider.getCredential(email, password);

Kotlin+KTX

val credential = EmailAuthProvider.getCredential(email, password)

Verknüpfen Sie dann diese Anmeldeinformationen mit dem anonymen Konto:

Schnell

Hinweis: Dieses Firebase-Produkt ist auf macOS-, Mac Catalyst-, tvOS- oder watchOS-Zielen nicht verfügbar.
if let user = Auth.auth().currentUser {
  user.link(with: credential) { (user, error) in
    // Complete any post sign-up tasks here.
  }
}

Java

FirebaseAuth.getInstance().getCurrentUser()
        .linkWithCredential(credential)
        .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
            @Override
            public void onSuccess(AuthResult authResult) {
                // Complete any post sign-up tasks here.
            }
        });

Kotlin+KTX

Firebase.auth.currentUser!!
        .linkWithCredential(credential)
        .addOnSuccessListener {
            // Complete any post sign-up tasks here.
        }

Das neue, dauerhafte Konto hat Zugriff auf alle Prämiendaten, die Sie dem anonymen Konto hinzugefügt haben.

Gewähren Sie dem Empfehler und dem Empfänger Belohnungen

Nachdem Sie die Einladungsdaten aus dem dynamischen Link abgerufen und gespeichert haben, können Sie dem Empfehler und dem Empfänger die Empfehlungsprämien gewähren, wenn die von Ihnen gewünschten Kriterien erfüllt sind.

Obwohl Sie von Ihrer Client-App aus in die Echtzeitdatenbank schreiben können, möchten Sie häufig nur Lesezugriff auf Daten wie In-App-Währung aus Ihren Apps zulassen und Schreibvorgänge nur von Ihrem Backend aus durchführen. Dieses Back-End kann jedes System sein, das das Firebase Admin SDK ausführen kann, aber es ist oft am einfachsten, Cloud Functions zu verwenden, um diese Aufgaben auszuführen.

Angenommen, Sie haben ein Spiel und möchten dem Empfänger eine Belohnung in Spielwährung gewähren, nachdem sich der Empfänger angemeldet hat, und dem Referrer, nachdem der Empfänger Level 5 erreicht hat.

Um die Belohnung für die Anmeldung zu gewähren, stellen Sie eine Funktion bereit, die auf die Erstellung eines bestimmten Echtzeitdatenbankschlüssels wartet und die Belohnung gewährt, wenn dies der Fall ist. Zum Beispiel:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.grantSignupReward = functions.database.ref('/users/{uid}/last_signin_at')
    .onCreate(event => {
      var uid = event.params.uid;
      admin.database().ref(`users/${uid}/referred_by`)
        .once('value').then(function(data) {
          var referred_by_somebody = data.val();
          if (referred_by_somebody) {
            var moneyRef = admin.database()
                .ref(`/users/${uid}/inventory/pieces_of_eight`);
            moneyRef.transaction(function (current_value) {
              return (current_value || 0) + 50;
            });
          }
        });
    });

Wenn sich dann ein neuer Benutzer anmeldet, lösen Sie diese Funktion aus, indem Sie den Realtime Database-Schlüssel erstellen. Lösen Sie beispielsweise die Funktion im Erfolgs-Listener von linkWithCredential aus, den Sie im vorherigen Schritt erstellt haben:

Schnell

Hinweis: Dieses Firebase-Produkt ist auf macOS-, Mac Catalyst-, tvOS- oder watchOS-Zielen nicht verfügbar.
if let user = Auth.auth().currentUser {
  user.link(with: credential) { (user, error) in
    // Complete any post sign-up tasks here.

    // Trigger the sign-up reward function by creating the "last_signin_at" field.
    // (If this is a value you want to track, you would also update this field in
    // the success listeners of your Firebase Authentication signIn calls.)
    if let user = user {
      let userRecord = Database.database().reference().child("users").child(user.uid)
      userRecord.child("last_signin_at").setValue(ServerValue.timestamp())
    }
  }
}

Java

FirebaseAuth.getInstance().getCurrentUser()
        .linkWithCredential(credential)
        .addOnSuccessListener(new OnSuccessListener<AuthResult>() {
            @Override
            public void onSuccess(AuthResult authResult) {
                // Complete any post sign-up tasks here.

                // Trigger the sign-up reward function by creating the
                // "last_signin_at" field. (If this is a value you want to track,
                // you would also update this field in the success listeners of
                // your Firebase Authentication signIn calls.)
                FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                DatabaseReference userRecord =
                        FirebaseDatabase.getInstance().getReference()
                                .child("users")
                                .child(user.getUid());
                userRecord.child("last_signin_at").setValue(ServerValue.TIMESTAMP);
            }
        });

Kotlin+KTX

Firebase.auth.currentUser!!
        .linkWithCredential(credential)
        .addOnSuccessListener {
            // Complete any post sign-up tasks here.

            // Trigger the sign-up reward function by creating the
            // "last_signin_at" field. (If this is a value you want to track,
            // you would also update this field in the success listeners of
            // your Firebase Authentication signIn calls.)
            val user = Firebase.auth.currentUser!!
            val userRecord = Firebase.database.reference
                    .child("users")
                    .child(user.uid)
            userRecord.child("last_signin_at").setValue(ServerValue.TIMESTAMP)
        }

Um dem Referrer eine Belohnung zu gewähren, wenn der Empfänger Level 5 erreicht, stellen Sie eine Funktion bereit, die auf Änderungen am level -Feld in Ihren Benutzerdatensätzen achtet. Wenn ein Benutzer von Level 4 auf Level 5 gegangen ist und der Benutzer einen Referrer aufgezeichnet hat, gewähren Sie die Belohnung:

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.rewardReferrals = functions.database.ref('/users/{uid}/level')
    .onUpdate(event => {
      var level = event.data.val();
      var prev_level = event.data.previous.val();
      if (prev_level == 4 && level == 5) {
        var referrerRef = event.data.ref.parent.child('referred_by');
        return referrerRef.once('value').then(function(data) {
          var referrerUid = data.val();
          if (referrerUid) {
            var moneyRef = admin.database()
                .ref(`/users/${referrerUid}/inventory/pieces_of_eight`);
            return moneyRef.transaction(function (current_value) {
              return (current_value || 0) + 50;
            });
          }
        });
      }
    });

Sowohl der Empfehler als auch Ihr neuer Benutzer haben jetzt ihre Belohnungen erhalten.