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 bağlantıları oluştur
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
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
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
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
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
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
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ı.