Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Kullanıcı tavsiyelerini ödüllendirerek yeni kullanıcılar edinin

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Yeni kullanıcılar edinmenin en etkili yollarından biri, kullanıcı yönlendirmeleridir. Hem yönlendirene hem de alıcıya başarılı yönlendirmeler için uygulama içi ödüller sunarak kullanıcılarınızı arkadaşlarını davet etmeye teşvik etmek için Realtime Database ve Cloud Functions for Firebase ile birlikte Dinamik Bağlantıları kullanabilirsiniz.

Önemli avantajlar

  • Kullanıcılarınıza arkadaşlarını davet etmeleri için bir teşvik sağlayarak büyümeyi hızlandırın.
  • Davet bağlantıları platformlar arasında çalışır.
  • Uygulamanızı ilk kez açan yeni kullanıcılar, onlar için özelleştirdiğiniz bir ilk çalıştırma deneyimi elde eder. Örneğin, onları davet eden arkadaşınızla otomatik olarak bağlayabilirsiniz.
  • İsteğe bağlı olarak, yeni kullanıcılar bir öğreticiyi tamamlamak gibi bazı başlangıç ​​görevlerini tamamlayana kadar ödül vermeyi erteleyin.

İşte nasıl başlayacağınız!

Firebase ve Dinamik Bağlantılar SDK'sını kurun

Yeni bir Firebase projesi kurun ve Dynamic Links SDK'yı uygulamanıza yükleyin. ( iOS , Android , C++ , Birlik ). Dynamic Links SDK'nın yüklenmesi, Firebase'in, kullanıcının uygulamayı yükledikten sonra da dahil olmak üzere Dynamic Link hakkındaki verileri uygulamaya iletmesine olanak tanır. SDK olmadan, yükleme sonrası bir kullanıcıyı yükleme öncesi tıklamayla bağlamanın bir yolu yoktur.

Davetiye oluşturmak için öncelikle alıcının daveti kabul etmek üzere açtığı bağlantıyı oluşturun. Daha sonra bu bağlantıyı davetiye metnine ekleyeceksiniz. Davetiyenin alıcısı, bağlantıyı açarak uygulamanızı yüklediğinde, uygulama içi ödül almak da dahil olmak üzere özelleştirilmiş bir ilk çalıştırma deneyimi elde edebilir.

Bu davet bağlantısı, mevcut kullanıcınızdan geldiğini belirten bir link parametresi değerine sahip bir Dinamik Bağlantıdır.

Bu link parametresi yüklerini biçimlendirmenin ve bunları uygulamanıza bağlamanın birçok yolu vardır. Basit bir yol, gönderenin kullanıcı hesabı kimliğini aşağıdaki örnekteki gibi bir sorgu parametresinde belirtmektir:

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

Ardından, bir davete dahil edilmeye uygun Dinamik Bağlantılar oluşturmak için Dinamik Bağlantı Oluşturucu API'sini kullanabilirsiniz:

Süratli

Not: Bu Firebase ürünü, macOS, Mac Catalyst, tvOS veya watchOS hedeflerinde mevcut değildir.
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
}

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
    // ...
}

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();
                // ...
            }
        });

Davetiyeleri gönder

Artık bağlantıyı oluşturduğunuza göre, onu bir davete dahil edebilirsiniz. Davet, uygulamanız ve hedef kitleniz için neyin en uygun olduğuna bağlı olarak bir e-posta, SMS mesajı veya başka herhangi bir ortam olabilir.

Örneğin, bir e-posta davetiyesi göndermek için:

Süratli

Not: Bu Firebase ürünü, macOS, Mac Catalyst, tvOS veya watchOS hedeflerinde mevcut değildir.
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)

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

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

Uygulamanızdaki yönlendirme bilgilerini alın

Davet alıcısı tavsiye bağlantısını açtığında, henüz yüklü değilse uygulamanızı yüklemesi için App Store veya Play Store'a yönlendirilir. Ardından, uygulamanızı ilk kez açtıklarında, Dynamic Link'e eklediğiniz yönlendirme bilgilerini alabilir ve ödülü uygulamak için kullanabilirsiniz.

Genellikle, yönlendirme ödüllerini yalnızca davet alıcısı kaydolduktan sonra veya hatta yalnızca yeni kullanıcı bazı görevleri tamamladıktan sonra vermek istersiniz. Ödül kriterleri sağlanana kadar Dynamic Link'ten aldığınız ödül bilgilerini takip etmeniz gerekmektedir.

Bu bilgileri takip etmenin bir yolu, kullanıcıyı anonim olarak oturum açmak ve verileri anonim hesabın Gerçek Zamanlı Veritabanı kaydında depolamaktır. Alıcı kaydolduğunda ve anonim hesap kalıcı bir hesaba dönüştürüldüğünde, yeni hesap anonim hesapla aynı UID'ye sahip olacak ve sonuç olarak ödül bilgilerine erişebilecektir.

Örneğin, alıcı uygulamanızı açtıktan sonra yönlendirenin UID'sini kaydetmek için:

Süratli

Not: Bu Firebase ürünü, macOS, Mac Catalyst, tvOS veya watchOS hedeflerinde mevcut değildir.
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.
        }
      }
    }
  }
}

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

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

Ardından, davet alıcısı bir hesap oluşturmaya karar verdiğinde, yönlendirme bilgilerini anonim hesaptan davet alıcısının yeni hesabına taşıyabilirsiniz.

İlk olarak, davetlinin kullanmak istediği oturum açma yöntemini kullanarak bir AuthCredential nesnesi alın. Örneğin, bir e-posta adresi ve şifre ile oturum açmak için:

Süratli

Not: Bu Firebase ürünü, macOS, Mac Catalyst, tvOS veya watchOS hedeflerinde mevcut değildir.
let credential = EmailAuthProvider.credential(withEmail: email, password: password)

Kotlin+KTX

val credential = EmailAuthProvider.getCredential(email, password)

Java

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

Ardından, bu kimlik bilgisini anonim hesaba bağlayın:

Süratli

Not: Bu Firebase ürünü, macOS, Mac Catalyst, tvOS veya watchOS hedeflerinde mevcut değildir.
if let user = Auth.auth().currentUser {
  user.link(with: credential) { (user, error) in
    // Complete any post sign-up tasks here.
  }
}

Kotlin+KTX

Firebase.auth.currentUser!!
        .linkWithCredential(credential)
        .addOnSuccessListener {
            // 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.
            }
        });

Yeni, kalıcı hesap, anonim hesaba eklediğiniz tüm ödül verilerine erişebilir.

Yönlendirene ve alıcıya ödüller verin

Dinamik Bağlantı'dan davet verilerini alıp kaydettiğinize göre, istediğiniz kriterler karşılandığında yönlendirene ve alıcıya yönlendirme ödülleri verebilirsiniz.

İstemci uygulamanızdan Gerçek Zamanlı Veritabanına yazabilmenize rağmen, genellikle uygulamalarınızdan uygulama içi para birimi gibi verilere yalnızca okuma erişimine izin vermek ve yazma işlemlerini yalnızca arka ucunuzdan gerçekleştirmek isteyeceksiniz. Bu arka uç, Firebase Admin SDK'yı çalıştırabilen herhangi bir sistem olabilir, ancak bu görevleri gerçekleştirmek için genellikle en kolayı Cloud Functions'ı kullanmaktır.

Örneğin, bir oyununuz olduğunu ve alıcı kaydolduktan sonra alıcıya ve alıcı 5. seviyeye ulaştıktan sonra yönlendirene oyun içi para ödülü vermek istediğinizi varsayalım.

Kaydolma karşılığında ödül vermek için, belirli bir Gerçek Zamanlı Veritabanı anahtarının oluşturulmasını izleyen ve oluşturulduğunda ödülü veren bir işlevi devreye alın. Örneğin:

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

Ardından, yeni bir kullanıcı kaydolduğunda, Gerçek Zamanlı Veritabanı anahtarını oluşturarak bu işlevi tetikleyin. Örneğin, önceki adımda oluşturduğunuz linkWithCredential başarı dinleyicisindeki işlevi tetikleyin:

Süratli

Not: Bu Firebase ürünü, macOS, Mac Catalyst, tvOS veya watchOS hedeflerinde mevcut değildir.
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())
    }
  }
}

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

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

Alıcı 5. seviyeye ulaştığında yönlendirene bir ödül vermek için, kullanıcı kayıtlarınızdaki level alanındaki değişiklikleri izleyen bir işlev kullanın. Bir kullanıcı 4. seviyeden 5. seviyeye geçtiyse ve kullanıcının kayıtlı bir yönlendiricisi varsa şu ödülü verin:

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

Hem yönlendiren hem de yeni kullanıcınız artık ödüllerini aldı.