Ödül tavsiyeleri

Yeni kullanıcılar edinmenin en etkili yollarından biri, kullanıcı tavsiyeleridir. Sen birlikte Dynamic Linkler kullanabilirsiniz Gerçek Zamanlı Veritabanı ve Firebase için Bulut Fonksiyonlar yönlendirenden ve alıcı hem de başarılı tavsiyeler için uygulama içi ödülleri sunarak kendi arkadaşlarını davet etmek için kullanıcıları teşvik etmek.

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 ++ , Birlik ). 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 iletmesine 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ı bir ile Dynamic Link olan link bu verileri mevcut kullanıcıdan olduğunu gösterir değeri parametresi.

Bu biçimlendirebilirsiniz birçok yolu vardır link parametre yükleri ve uygulamanızda içine kravat. Bir basit bir yolu aşağıdaki örnekte olduğu gibi bir sorgu parametresinde gönderenin kullanıcı hesabı kimliğini belirtmektir:

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

Sonra, Dinamik Linkler oluşturmak Dinamik Bağlantı Oluşturucu API kullanabilirsiniz, davetiye dahil edilmesi uygun:

Süratli

Not: Bu Firebase ürün MacOS Mac Catalyst, tvOS veya watchos hedefler üzerinde kullanılamaz.
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 davetiyesi göndermek için:

Süratli

Not: Bu Firebase ürün MacOS Mac Catalyst, tvOS veya watchos hedefler üzerinde kullanılamaz.
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ı bir görevi 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 hedefler üzerinde kullanılamaz.
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)
            }
}

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, bir olsun AuthCredential oturum açma davetli kullanmak isteyen yöntemle kullanarak nesneyi. Ö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 hedefler üzerinde kullanılamaz.
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 hedefler üzerinde kullanılamaz.
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, işlev tetikleyen linkWithCredential önceki adımda oluşturulan başarısı dinleyici,:

Süratli

Not: Bu Firebase ürün MacOS Mac Catalyst, tvOS veya watchos hedefler üzerinde kullanılamaz.
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ı ulaştığında 5 düzeyinde iken yönlendireni bir ödül vermek için, değişiklikler için saatler bir işlev dağıtmak level kullanıcı kayıtlarında alanında. 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ı.