नए उपयोगकर्ता प्राप्त करने के सबसे प्रभावी तरीकों में से एक उपयोगकर्ता रेफ़रल के माध्यम से है। आप फ़ायरबेस के लिए रीयलटाइम डेटाबेस और क्लाउड फ़ंक्शंस के साथ डायनामिक लिंक का उपयोग कर सकते हैं ताकि रेफ़रलकर्ता और प्राप्तकर्ता दोनों को सफल रेफ़रल के लिए इन-ऐप पुरस्कार प्रदान करके अपने उपयोगकर्ताओं को अपने दोस्तों को आमंत्रित करने के लिए प्रोत्साहित किया जा सके।
महत्त्वपूर्ण फायदे
- अपने उपयोगकर्ताओं को अपने दोस्तों को आमंत्रित करने के लिए प्रोत्साहन प्रदान करके विकास में तेजी लाएं।
- आमंत्रण लिंक सभी प्लेटफार्मों पर काम करते हैं।
- आपके ऐप को पहली बार खोलने वाले नए उपयोगकर्ताओं को पहली बार चलाने का अनुभव मिलता है जिसे आप उनके लिए अनुकूलित करते हैं। उदाहरण के लिए, आप उन्हें स्वचालित रूप से उस मित्र से कनेक्ट कर सकते हैं जिसने उन्हें आमंत्रित किया था।
- वैकल्पिक रूप से पुरस्कार देने में तब तक देरी करें जब तक कि नए उपयोगकर्ता कुछ परिचयात्मक कार्य पूरा नहीं कर लेते, जैसे कि एक ट्यूटोरियल पूरा करना।
यहां बताया गया है कि शुरुआत कैसे करें!
फायरबेस और डायनेमिक लिंक एसडीके सेट करें
एक नया फायरबेस प्रोजेक्ट सेट करें और अपने ऐप में डायनामिक लिंक एसडीके इंस्टॉल करें। ( आईओएस , एंड्रॉइड , सी ++ , यूनिटी )। डायनामिक लिंक एसडीके स्थापित करने से फायरबेस ऐप को डायनामिक लिंक के बारे में डेटा पास करने की अनुमति देता है, जिसमें उपयोगकर्ता द्वारा ऐप इंस्टॉल करने के बाद भी शामिल है। एसडीके के बिना, पोस्ट-इंस्टॉल उपयोगकर्ता को प्री-इंस्टॉल क्लिक से जोड़ने का कोई तरीका नहीं है।
आमंत्रण लिंक बनाएं
आमंत्रण बनाने के लिए, पहले वह लिंक बनाएं जिसे प्राप्तकर्ता आमंत्रण स्वीकार करने के लिए खोलता है. बाद में, आप इस लिंक को आमंत्रण के टेक्स्ट में शामिल करेंगे। जब आमंत्रण प्राप्तकर्ता लिंक को खोलकर आपके ऐप को इंस्टॉल करता है, तो वे इन-ऐप इनाम प्राप्त करने सहित एक कस्टमाइज़्ड फर्स्ट-रन अनुभव प्राप्त कर सकते हैं।
यह आमंत्रण लिंक एक link
पैरामीटर मान वाला एक डायनामिक लिंक है जो इंगित करता है कि यह आपके मौजूदा उपयोगकर्ता से है।
ऐसे कई तरीके हैं जिनसे आप इन link
पैरामीटर पेलोड को प्रारूपित कर सकते हैं और उन्हें अपने ऐप में जोड़ सकते हैं। एक आसान तरीका है प्रेषक के उपयोगकर्ता खाता आईडी को क्वेरी पैरामीटर में निर्दिष्ट करना जैसे निम्न उदाहरण में:
https://mygame.example.com/?invitedby=SENDER_UID
फिर, आमंत्रण में शामिल करने के लिए उपयुक्त डायनामिक लिंक बनाने के लिए, आप डायनामिक लिंक बिल्डर API का उपयोग कर सकते हैं:
तीव्र
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 // ... }
आमंत्रण भेजें
अब जब आपने लिंक बना लिया है, तो आप इसे आमंत्रण में शामिल कर सकते हैं। आमंत्रण एक ईमेल, एसएमएस संदेश या कोई अन्य माध्यम हो सकता है, जो इस बात पर निर्भर करता है कि आपके ऐप और दर्शकों के लिए सबसे उपयुक्त क्या है।
उदाहरण के लिए, ईमेल आमंत्रण भेजने के लिए:
तीव्र
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) }
अपने ऐप में रेफ़रल जानकारी पुनर्प्राप्त करें
जब आमंत्रण प्राप्तकर्ता रेफ़रल लिंक खोलता है, तो उन्हें आपके ऐप को इंस्टॉल करने के लिए ऐप स्टोर या प्ले स्टोर पर निर्देशित किया जाएगा यदि यह पहले से इंस्टॉल नहीं है। फिर, जब वे पहली बार आपका ऐप खोलते हैं, तो आप डायनामिक लिंक में शामिल रेफ़रल जानकारी को पुनः प्राप्त कर सकते हैं और इनाम को लागू करने के लिए इसका इस्तेमाल कर सकते हैं।
आम तौर पर, आप केवल आमंत्रण प्राप्तकर्ता के साइन अप करने के बाद या नए उपयोगकर्ता द्वारा कुछ कार्य पूरा करने के बाद ही रेफ़रल पुरस्कार देना चाहते हैं। जब तक इनाम के मानदंड पूरे नहीं हो जाते, तब तक आपको डायनामिक लिंक से मिली इनाम की जानकारी पर नज़र रखनी होगी।
इस जानकारी का ट्रैक रखने का एक तरीका उपयोगकर्ता को गुमनाम रूप से साइन इन करना है और डेटा को अनाम खाते के रीयलटाइम डेटाबेस रिकॉर्ड में संग्रहीत करना है। जब प्राप्तकर्ता साइन अप करता है और अनाम खाते को स्थायी खाते में बदल दिया जाता है, तो नए खाते में अनाम खाते के समान यूआईडी होगा, और इसके परिणामस्वरूप, इनाम की जानकारी तक पहुंच होगी।
उदाहरण के लिए, प्राप्तकर्ता द्वारा आपका ऐप खोलने के बाद रेफ़रलकर्ता का UID सहेजने के लिए:
तीव्र
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) } }
फिर, जब आमंत्रण प्राप्तकर्ता खाता बनाने का निर्णय लेता है, तो आप अनाम खाते से आमंत्रण प्राप्तकर्ता के नए खाते में रेफ़रल जानकारी ले जा सकते हैं।
सबसे पहले, आमंत्रित व्यक्ति द्वारा उपयोग की जाने वाली साइन-इन विधि का उपयोग करके एक AuthCredential
ऑब्जेक्ट प्राप्त करें। उदाहरण के लिए, किसी ईमेल पते और पासवर्ड से साइन-इन करने के लिए:
तीव्र
let credential = EmailAuthProvider.credential(withEmail: email, password: password)
Java
AuthCredential credential = EmailAuthProvider.getCredential(email, password);
Kotlin+KTX
val credential = EmailAuthProvider.getCredential(email, password)
फिर, इस क्रेडेंशियल को अनाम खाते से लिंक करें:
तीव्र
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. }
नए, स्थायी, खाते के पास आपके द्वारा अनाम खाते में जोड़े गए सभी पुरस्कार डेटा तक पहुंच है।
रेफ़रलकर्ता और प्राप्तकर्ता को पुरस्कार प्रदान करें
अब जब आपने डायनेमिक लिंक से आमंत्रण डेटा पुनर्प्राप्त कर लिया है और सहेज लिया है, तो आप रेफ़रलकर्ता और प्राप्तकर्ता को रेफ़रल पुरस्कार प्रदान कर सकते हैं जब भी आप जिस मानदंड की आवश्यकता चाहते हैं उसे पूरा किया गया हो।
यद्यपि आप अपने क्लाइंट ऐप से रीयलटाइम डेटाबेस को लिख सकते हैं, आप अक्सर अपने ऐप्स से इन-ऐप मुद्रा जैसे डेटा तक केवल पढ़ने की पहुंच की अनुमति देना चाहते हैं, और केवल अपने बैकएंड से लेखन संचालन करना चाहते हैं। यह बैकएंड फायरबेस एडमिन एसडीके चलाने में सक्षम कोई भी सिस्टम हो सकता है, लेकिन इन कार्यों को करने के लिए क्लाउड फ़ंक्शंस का उपयोग करना अक्सर आसान होता है।
उदाहरण के लिए, मान लें कि आपके पास एक गेम है और आप प्राप्तकर्ता को साइन अप करने के बाद प्राप्तकर्ता को इन-गेम मुद्रा का इनाम देना चाहते हैं, और प्राप्तकर्ता के स्तर 5 तक पहुंचने के बाद रेफ़रलकर्ता को।
साइन अप करने के लिए इनाम देने के लिए, एक ऐसा फ़ंक्शन तैनात करें जो एक विशिष्ट रीयलटाइम डेटाबेस कुंजी बनाए जाने के लिए देखता है, और जब यह होता है तो इनाम देता है। उदाहरण के लिए:
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;
});
}
});
});
फिर, जब कोई नया उपयोगकर्ता साइन अप करता है, तो रीयलटाइम डेटाबेस कुंजी बनाकर इस फ़ंक्शन को ट्रिगर करें। उदाहरण के लिए, linkWithCredential
के सफलता श्रोता में फ़ंक्शन को ट्रिगर करें, जिसे आपने पिछले चरण में बनाया था:
तीव्र
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) }
प्राप्तकर्ता के स्तर 5 पर पहुंचने पर रेफ़रलकर्ता को पुरस्कार देने के लिए, एक फ़ंक्शन परिनियोजित करें जो आपके उपयोगकर्ता रिकॉर्ड में level
फ़ील्ड में परिवर्तनों को देखता है। यदि कोई उपयोगकर्ता स्तर 4 से स्तर 5 तक चला गया है, और उपयोगकर्ता के पास रेफ़रलकर्ता रिकॉर्ड किया गया है, तो पुरस्कार प्रदान करें:
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;
});
}
});
}
});
रेफ़रलकर्ता और आपके नए उपयोगकर्ता दोनों को अब उनके पुरस्कार प्राप्त हो गए हैं।