Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

Ödül tavsiyeleri

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ı tavsiyeleridir. 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.

Temel faydalar

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

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

Firebase ve Dynamic Links SDK'sını kurun

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

Davet oluşturmak için önce alıcının daveti kabul etmek için açtığı bağlantıyı oluşturun. Daha sonra bu bağlantıyı davet metnine ekleyeceksiniz. Davetiyenin alıcısı bağlantıyı açarak uygulamanızı yüklediğinde, uygulama içi ödül de 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 gösteren bir link parametre 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 örnekte olduğu 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
}

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

Davetiyeleri gönder

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

Örneğin, bir e-posta daveti 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)

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

Uygulamanızda yönlendirme bilgilerini alın

Davet alıcısı yönlendirme bağlantısını açtığında, uygulamanız yüklü değilse uygulamanızı yüklemek için App Store veya Play Store'a yönlendirilecektir. Ardından, uygulamanızı ilk kez açtıklarında, Dinamik Bağlantı'ya eklediğiniz yönlendirme bilgilerini alabilir ve ödülü uygulamak için kullanabilirsiniz.

Genellikle, yalnızca davetiye alıcısı kaydolduktan sonra veya hatta yalnızca yeni kullanıcı bazı görevleri tamamladıktan sonra tavsiye ödülleri vermek istersiniz. Ödül kriterleri karşılanana kadar Dynamic Link'ten aldığınız ödül bilgilerini takip etmeniz gerekiyor.

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şebilecek.

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

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

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

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

Java

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

Kotlin+KTX

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

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

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

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

Artık Dynamic Link'ten davet verilerini alıp kaydettiğinize göre, yönlendirme ödüllerini, istediğiniz kriterler karşılandığında yönlendirene ve alıcıya 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 yalnızca arka ucunuzdan yazma işlemleri 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 Bulut İşlevlerini kullanmak genellikle en kolay yoldur.

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

Kaydolma ödülünü 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şlev dağıtı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, Realtime Database 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())
    }
  }
}

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

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 dağıtın. Bir kullanıcı 4. seviyeden 5. seviyeye geçtiyse ve kullanıcının kayıtlı bir yönlendireni varsa, ö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ı.