Google is committed to advancing racial equity for Black communities. See how.
Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Belohnungsempfehlungen

Eine der effektivsten Möglichkeiten, neue Benutzer zu gewinnen, sind Benutzerempfehlungen. Sie können dynamische Links zusammen mit Echtzeitdatenbank- und Cloud-Funktionen für Firebase verwenden , um Ihre Benutzer zu ermutigen, ihre Freunde einzuladen, indem Sie In-App-Belohnungen für erfolgreiche Verweise sowohl an den Verweiser als auch auf den Empfänger 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 eine erste Erfahrung, die Sie für sie anpassen. Sie können sie beispielsweise 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 Ausfüllen eines Lernprogramms.

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 werden Sie diesen Link in den Text der Einladung aufnehmen. Wenn ein Empfänger der Einladung Ihre App durch Öffnen des Links installiert, kann er eine angepasste Erfahrung beim ersten Start erhalten, einschließlich des Erhalts einer In-App-Belohnung.

Diese Einladung Link ist ein Dynamic Link mit einem link Parameterwert, es ist aus Ihrem vorhandenen Benutzer anzeigt.

Es gibt viele Möglichkeiten , wie Sie diese formatieren link Parameter Nutzlasten und sie in Ihrer Anwendung binden. 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 dynamische Links zu erstellen, die für die Aufnahme in eine Einladung geeignet sind, können Sie die Dynamic Link Builder-API verwenden:

iOS (Swift)

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 aufnehmen. 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:

iOS (Swift)

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

Rufen Sie Empfehlungsinformationen in Ihrer App ab

Wenn der Einladungsempfänger den Empfehlungslink öffnet, wird er zum App Store oder Play Store geleitet, um Ihre App zu installieren, sofern diese noch nicht installiert ist. Wenn sie Ihre App zum ersten Mal öffnen, können Sie die im dynamischen Link enthaltenen Empfehlungsinformationen abrufen und zum Anwenden der Belohnung verwenden.

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 Belohnungskriterien erfüllt sind, müssen Sie die Belohnungsinformationen verfolgen, die Sie vom dynamischen Link erhalten haben.

Eine Möglichkeit, diese Informationen im Auge zu behalten, besteht darin, sich anonym beim Benutzer anzumelden und die Daten im Echtzeitdatenbankdatensatz des anonymen Kontos zu speichern. Wenn sich der Empfänger anmeldet und das anonyme Konto in ein permanentes Konto umgewandelt wird, hat das neue Konto dieselbe UID wie das anonyme Konto und hat daher Zugriff auf die Prämieninformationen.

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

iOS (Swift)

func application(_ app: UIApplication, open url: URL, options:
    [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
  if let isDynamicLink = DynamicLinks.dynamicLinks()?.shouldHandleDynamicLink(fromCustomSchemeURL: url),
      isDynamicLink {
    let dynamicLink = DynamicLinks.dynamicLinks()?.dynamicLink(fromCustomSchemeURL: url)
    return handleDynamicLink(dynamicLink)
  }
  // Handle incoming URL with other methods as necessary
  // ...
  return false
}

@available(iOS 8.0, *)
func application(_ application: UIApplication,
    continue userActivity: NSUserActivity,
    restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
  guard let dynamicLinks = DynamicLinks.dynamicLinks() else { return false }
  let handled = dynamicLinks.handleUniversalLink(userActivity.webpageURL!) { (dynamicLink, error) in
    if (dynamicLink != nil) && !(error != nil) {
      self.handleDynamicLink(dynamicLink)
    }
  }
  if !handled {
    // Handle incoming URL with other methods as necessary
    // ...
  }
  return handled
}

func handleDynamicLink(_ dynamicLink: DynamicLink?) -> Bool {
  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.
        }
      }
    }
  }
  return true
}

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 der Einladungsempfänger dann beschließt, ein Konto zu erstellen, können Sie die Verweisinformationen vom anonymen Konto auf das neue Konto des Einladungsempfängers übertragen.

AuthCredential Sie zunächst ein AuthCredential Objekt mit der AuthCredential , die der eingeladene AuthCredential verwenden möchte. So melden Sie sich beispielsweise mit einer E-Mail-Adresse und einem Passwort an:

iOS (Swift)

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 diesen Berechtigungsnachweis dann mit dem anonymen Konto:

iOS (Swift)

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, permanente Konto hat Zugriff auf alle Prämiendaten, die Sie dem anonymen Konto hinzugefügt haben.

Gewähren Sie dem Überweiser und dem Empfänger Belohnungen

Nachdem Sie die Einladungsdaten vom dynamischen Link abgerufen und gespeichert haben, können Sie dem Empfehlungsgeber und dem Empfänger die Empfehlungsprämien gewähren, sobald die 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 die In-App-Währung Ihrer Apps zulassen und Schreibvorgänge nur von Ihrem Backend aus ausführen. Dieses Backend kann jedes System sein, auf dem das Firebase Admin SDK ausgeführt werden kann. Es ist jedoch häufig am einfachsten, Cloud-Funktionen zum Ausführen dieser Aufgaben zu verwenden.

Angenommen, Sie haben ein Spiel und möchten dem Empfänger nach der Anmeldung des Empfängers und dem Überweiser nach Erreichen der Stufe 5 eine Belohnung in Spielwährung gewähren.

Um die Belohnung für die Anmeldung zu gewähren, stellen Sie eine Funktion bereit, die darauf wartet, dass ein bestimmter Echtzeitdatenbankschlüssel erstellt wird, und die Belohnung gewährt, wenn dies der Fall ist. Beispielsweise:

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 ein neuer Benutzer anmeldet, lösen Sie diese Funktion aus, indem Sie den Echtzeitdatenbankschlüssel erstellen. linkWithCredential Sie beispielsweise die Funktion im linkWithCredential , die Sie im vorherigen Schritt erstellt haben:

iOS (Swift)

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 nach Änderungen am level in Ihren Benutzerdatensätzen sucht. Wenn ein Benutzer von Stufe 4 auf Stufe 5 gewechselt ist und der Benutzer einen Überweiser registriert 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 Referrer als auch Ihr neuer Benutzer haben jetzt ihre Belohnungen erhalten.