获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

با پاداش دادن به ارجاعات کاربران، کاربران جدید دریافت کنید

یکی از موثرترین راه ها برای جذب کاربران جدید، ارجاع کاربران است. می‌توانید از پیوندهای پویا به همراه پایگاه داده بیدرنگ و توابع ابری برای Firebase استفاده کنید تا با ارائه جوایز درون‌برنامه‌ای برای ارجاع‌های موفق هم به ارجاع‌دهنده و هم به گیرنده، کاربران خود را تشویق کنید تا دوستان خود را دعوت کنند.

مزایای کلیدی

  • با ایجاد انگیزه برای کاربران خود برای دعوت از دوستان خود، رشد را تسریع کنید.
  • پیوندهای دعوت در سراسر پلتفرم ها کار می کنند.
  • کاربران جدیدی که برای اولین بار برنامه شما را باز می‌کنند، اولین تجربه‌ای را دریافت می‌کنند که شما برای آنها سفارشی می‌کنید. به عنوان مثال، می توانید به طور خودکار آنها را با دوستی که آنها را دعوت کرده است وصل کنید.
  • به صورت اختیاری اعطای جوایز را تا زمانی که کاربران جدید برخی از کارهای مقدماتی مانند تکمیل یک آموزش را انجام دهند به تأخیر بیاندازید.

در اینجا نحوه شروع به کار آمده است!

Firebase و Dynamic Links SDK را راه اندازی کنید

یک پروژه Firebase جدید راه اندازی کنید و Dynamic Links SDK را در برنامه خود نصب کنید. ( iOS ، Android ، C++ ، Unity ). نصب Dynamic Links SDK به Firebase اجازه می دهد تا داده های مربوط به Dynamic Link را به برنامه منتقل کند، از جمله پس از نصب برنامه توسط کاربر. بدون SDK، هیچ راهی برای اتصال کاربر پس از نصب با یک کلیک از پیش نصب وجود ندارد.

برای ایجاد دعوت نامه، ابتدا پیوندی را ایجاد کنید که گیرنده برای پذیرش دعوت باز می کند. بعداً این لینک را در متن دعوتنامه قرار می دهید. هنگامی که گیرنده دعوت با باز کردن پیوند، برنامه شما را نصب می‌کند، می‌تواند تجربه‌ای سفارشی‌شده برای اولین بار، از جمله دریافت جایزه درون‌برنامه، دریافت کند.

این پیوند دعوت یک پیوند پویا با مقدار پارامتر link است که نشان می دهد از کاربر فعلی شما است.

راه های زیادی وجود دارد که می توانید این بارهای پارامتر link را قالب بندی کرده و آنها را به برنامه خود متصل کنید. یک راه ساده این است که شناسه حساب کاربری فرستنده را در یک پارامتر query مانند مثال زیر مشخص کنید:

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

سپس، برای ایجاد پیوندهای پویا مناسب برای گنجاندن در یک دعوت، می‌توانید از Dynamic Link Builder API استفاده کنید:

سریع

توجه: این محصول Firebase در اهداف macOS، Mac Catalyst، tvOS یا watchOS در دسترس نیست.
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
    // ...
}

دعوت نامه ها را ارسال کنید

اکنون که پیوند را ایجاد کرده اید، می توانید آن را در یک دعوت نامه قرار دهید. بسته به اینکه چه چیزی برای اپلیکیشن و مخاطب شما مناسب‌تر است، دعوت‌نامه می‌تواند یک ایمیل، پیام کوتاه یا هر رسانه دیگری باشد.

به عنوان مثال، برای ارسال یک دعوت نامه ایمیل:

سریع

توجه: این محصول Firebase در اهداف macOS، Mac Catalyst، tvOS یا watchOS در دسترس نیست.
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)
}

اطلاعات ارجاع را در برنامه خود بازیابی کنید

هنگامی که گیرنده دعوت پیوند ارجاع را باز می کند، به App Store یا Play Store هدایت می شود تا اگر برنامه شما قبلاً نصب نشده باشد، آن را نصب کنند. سپس، هنگامی که آنها برای اولین بار برنامه شما را باز می کنند، می توانید اطلاعات ارجاعی را که در Dynamic Link درج کرده اید بازیابی کنید و از آن برای اعمال پاداش استفاده کنید.

معمولاً، شما می خواهید فقط پس از ثبت نام گیرنده دعوت، یا حتی تنها پس از انجام برخی کارها توسط کاربر جدید، جوایز ارجاع اعطا کنید. تا زمانی که معیارهای پاداش برآورده شوند، باید اطلاعات پاداشی را که از پیوند پویا دریافت کرده اید، پیگیری کنید.

یکی از راه‌های پیگیری این اطلاعات این است که کاربر به‌صورت ناشناس وارد سیستم شوید و داده‌ها را در رکورد پایگاه داده بیدرنگ حساب ناشناس ذخیره کنید. هنگامی که گیرنده ثبت نام می کند و حساب ناشناس به یک حساب دائمی تبدیل می شود، حساب جدید دارای همان UID حساب ناشناس خواهد بود و در نتیجه به اطلاعات پاداش دسترسی خواهد داشت.

به عنوان مثال، برای ذخیره UID ارجاع دهنده پس از باز کردن برنامه توسط گیرنده:

سریع

توجه: این محصول Firebase در اهداف macOS، Mac Catalyst، tvOS یا watchOS در دسترس نیست.
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 را با استفاده از روش ورود به سیستمی که دعوت شده می خواهد استفاده کند، دریافت کنید. به عنوان مثال، برای ورود با آدرس ایمیل و رمز عبور:

سریع

توجه: این محصول Firebase در اهداف macOS، Mac Catalyst، tvOS یا watchOS در دسترس نیست.
let credential = EmailAuthProvider.credential(withEmail: email, password: password)

Java

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

Kotlin+KTX

val credential = EmailAuthProvider.getCredential(email, password)

سپس، این اعتبار را به حساب ناشناس پیوند دهید:

سریع

توجه: این محصول Firebase در اهداف macOS، Mac Catalyst، tvOS یا watchOS در دسترس نیست.
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.
        }

حساب جدید و دائمی به تمام داده های پاداشی که به حساب ناشناس اضافه کرده اید دسترسی دارد.

به ارجاع دهنده و گیرنده پاداش اعطا کنید

اکنون که داده‌های دعوت را از پیوند پویا بازیابی و ذخیره کرده‌اید، می‌توانید هر زمان که معیارهای مورد نیاز شما برآورده شد، پاداش ارجاع را به ارجاع‌دهنده و گیرنده اعطا کنید.

اگرچه می‌توانید از برنامه مشتری خود در پایگاه داده بیدرنگ بنویسید، اما اغلب می‌خواهید فقط به داده‌هایی مانند ارز درون برنامه‌ای از برنامه‌هایتان دسترسی خواندنی داشته باشید و عملیات نوشتن را فقط از قسمت پشتیبان خود انجام دهید. این پشتیبان می‌تواند هر سیستمی باشد که قادر به اجرای Firebase Admin SDK باشد، اما استفاده از توابع Cloud برای انجام این وظایف اغلب ساده‌ترین کار است.

به عنوان مثال، فرض کنید یک بازی دارید و می‌خواهید پس از ثبت نام گیرنده، یک ارز درون بازی به گیرنده و پس از رسیدن گیرنده به سطح 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;
            });
          }
        });
    });

سپس، هنگامی که یک کاربر جدید ثبت نام کرد، این عملکرد را با ایجاد کلید Realtime Database فعال کنید. به عنوان مثال، تابع را در linkWithCredential 's success listener که در مرحله قبل ایجاد کردید، فعال کنید:

سریع

توجه: این محصول Firebase در اهداف macOS، Mac Catalyst، tvOS یا watchOS در دسترس نیست.
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;
            });
          }
        });
      }
    });

هم ارجاع دهنده و هم کاربر جدید شما اکنون پاداش های خود را دریافت کرده اند.