یکی از مؤثرترین راهها برای ترغیب کاربران جدید برای نصب برنامه، این است که کاربران خود را قادر میسازید تا محتوای برنامه شما را با دوستان خود به اشتراک بگذارند. با پیوندهای پویا، میتوانید یک تجربه اشتراکگذاری کاربر به کاربر عالی ایجاد کنید: کاربرانی که توصیههای محتوایی را از دوستان خود دریافت میکنند، میتوانند روی یک پیوند کلیک کرده و مستقیماً به محتوای اشتراکگذاری شده در برنامه شما منتقل شوند، حتی اگر مجبور به رفتن به برنامه باشند. فروشگاه یا Google Play Store ابتدا برنامه خود را نصب کنید.
با ترکیب چسبندگی ارجاعهای کاربر و تداوم پیوندهای پویا، میتوانید ویژگیهای اشتراکگذاری و ارجاع کاربر به کاربر را ایجاد کنید که کاربران جدیدی را با جذب مستقیم آنها به محتوای برنامه خود یا ارائه تبلیغاتی ایجاد کنید که به نفع ارجاعکننده و ارجاعدهنده است. .
مزایای کلیدی
- کاربران جدیدی که برای اولین بار برنامه شما را باز می کنند، یک تجربه سفارشی برای اولین بار دریافت می کنند که بر اساس آنچه دوستشان می خواهد با آنها به اشتراک بگذارد، متنی است. به عنوان مثال، می توانید محتوایی را که با آنها به اشتراک گذاشته شده است نمایش دهید یا به طور خودکار آنها را با دوستی که آنها را دعوت کرده است وصل کنید.
- به اشتراک گذاری محتوا با دوستان خود در سراسر پلتفرم ها برای کاربران آسان می شود، خواه دوستان برنامه شما را نصب کرده باشند یا نه.
در اینجا نحوه شروع به کار آمده است!
Firebase و Dynamic Links SDK را راه اندازی کنید
یک پروژه Firebase جدید راه اندازی کنید و Dynamic Links SDK را در برنامه خود نصب کنید.
نصب Dynamic Links SDK به Firebase اجازه می دهد تا داده های مربوط به Dynamic Link را به برنامه منتقل کند، از جمله پس از نصب برنامه توسط کاربر.
ایجاد لینک های پویا
اکنون زمان تنظیم لینک هایی است که کاربران می توانند برای دوستان خود ارسال کنند. اگر دوستان کاربران شما هنوز برنامه را نصب نکرده اند نگران نباشید. داینامیک لینک ها می توانند از آن برای شما مراقبت کنند.
برای هر عنصر محتوایی که میخواهید قابل اشتراکگذاری باشد، یک پیوند پویا ایجاد کنید .
هنگامی که پیوند پویا را ایجاد می کنید، باید یک URL HTTP یا HTTPS به عنوان پارامتر link
ارائه کنید که برای شناسایی محتوایی که به اشتراک می گذارید استفاده می شود. اگر وب سایتی با محتوای مشابه دارید، باید از URL های وب سایت خود استفاده کنید. این اطمینان حاصل می کند که این پیوندها در پلتفرمی که از پیوندهای پویا پشتیبانی نمی کند، مانند مرورگر دسکتاپ، به درستی ارائه می شوند. به عنوان مثال:
https://example.page.link/?link=https://www.example.com/content?item%3D1234&apn=com.example.android&ibi=com.example.ios&isi=12345
همچنین میتوانید با افزودن پارامترهای رمزگذاریشده با URL، اطلاعات بیشتری را به محموله داده اضافه کنید - برای مثال، برای نشان دادن اینکه پیوند برای یک کاربر خاص در نظر گرفته شده است، مثلاً در دعوتنامه بازی.
https://example.page.link/?link=https://www.example.com/invitation?gameid%3D1234%26referrer%3D555&apn=com.example.android&ibi=com.example.ios&isi=12345
قبل از اینکه این پیوندها را به اشتراک بگذارید، ممکن است بخواهید از API کوتاه کننده URL پیوندهای دینامیک Firebase برای ایجاد URL های دوستانه تر استفاده کنید. یک پیوند پویا کوتاه مانند مثال زیر است:
https://example.page.link/WXYZ
از هر پیوندی که استفاده می کنید، وقتی کاربران پیوند پویا را در دستگاه خود باز می کنند، برنامه مشخص شده توسط پارامتر apn
(در اندروید) یا پارامترهای ibi
و isi
(در iOS) کاربران را برای نصب برنامه به Play Store یا App Store می برد. اگر قبلاً نصب نشده باشد سپس، هنگامی که برنامه نصب و باز شد، URL مشخص شده در پارامتر "لینک" به برنامه منتقل می شود.
دکمه های "اشتراک گذاری" را که پیوندهای پویا ارسال می کنند اضافه کنید
ابتدا به این مثال ساده از یک برنامه چت مبتنی بر اتاق مانند Hangouts نگاهی بیندازید که پیوندهایی را برای دعوت افراد به اتاق های گفتگو ایجاد می کند.
iOS


اندروید


سریع
func generateContentLink() -> URL { let baseURL = URL(string: "https://your-custom-name.page.link")! let domain = "https://your-app.page.link" let linkBuilder = DynamicLinkComponents(link: baseURL, domainURIPrefix: domain) linkBuilder?.iOSParameters = DynamicLinkIOSParameters(bundleID: "com.your.bundleID") linkBuilder?.androidParameters = DynamicLinkAndroidParameters(packageName: "com.your.packageName") // Fall back to the base url if we can't generate a dynamic link. return linkBuilder?.link ?? baseURL }
هدف-C
- (NSURL *)generateContentLink { NSURL *baseURL = [NSURL URLWithString:@"https://your-custom-name.page.link"]; NSString *domain = @"https://your-app.page.link"; FIRDynamicLinkComponents *builder = [[FIRDynamicLinkComponents alloc] initWithLink:baseURL domainURIPrefix:domain]; builder.iOSParameters = [FIRDynamicLinkIOSParameters parametersWithBundleID:@"com.your.bundleID"]; builder.androidParameters = [FIRDynamicLinkAndroidParameters parametersWithPackageName:@"com.your.packageName"]; // Fall back to the base url if we can't generate a dynamic link. return builder.link ?: baseURL; }
Kotlin+KTX
fun generateContentLink(): Uri { val baseUrl = Uri.parse("https://your-custom-name.page.link") val domain = "https://your-app.page.link" val link = FirebaseDynamicLinks.getInstance() .createDynamicLink() .setLink(baseUrl) .setDomainUriPrefix(domain) .setIosParameters(DynamicLink.IosParameters.Builder("com.your.bundleid").build()) .setAndroidParameters(DynamicLink.AndroidParameters.Builder("com.your.packageName").build()) .buildDynamicLink() return link.uri }
Java
public static Uri generateContentLink() { Uri baseUrl = Uri.parse("https://your-custom-name.page.link"); String domain = "https://your-app.page.link"; DynamicLink link = FirebaseDynamicLinks.getInstance() .createDynamicLink() .setLink(baseUrl) .setDomainUriPrefix(domain) .setIosParameters(new DynamicLink.IosParameters.Builder("com.your.bundleid").build()) .setAndroidParameters(new DynamicLink.AndroidParameters.Builder("com.your.packageName").build()) .buildDynamicLink(); return link.getUri(); }
هنگامی که یک پیوند پویا دارید، می توانید یک دکمه اشتراک گذاری به رابط کاربری خود اضافه کنید که جریان اشتراک گذاری پلت فرم استاندارد را راه اندازی می کند:
سریع
lazy private var shareController: UIActivityViewController = { let activities: [Any] = [ "Learn how to share content via Firebase", URL(string: "https://firebase.google.com")! ] let controller = UIActivityViewController(activityItems: activities, applicationActivities: nil) return controller }() @IBAction func shareButtonPressed(_ sender: Any) { let inviteController = UIStoryboard(name: "Main", bundle: nil) .instantiateViewController(withIdentifier: "InviteViewController") self.navigationController?.pushViewController(inviteController, animated: true) }
هدف-C
- (UIActivityViewController *)shareController { if (_shareController == nil) { NSArray *activities = @[ @"Learn how to share content via Firebase", [NSURL URLWithString:@"https://firebase.google.com"] ]; UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:activities applicationActivities:nil]; _shareController = controller; } return _shareController; } - (IBAction)shareLinkButtonPressed:(UIView *)sender { if (![sender isKindOfClass:[UIView class]]) { return; } self.shareController.popoverPresentationController.sourceView = sender; [self presentViewController:self.shareController animated:YES completion:nil]; }
Kotlin+KTX
private fun onShareClicked() { val link = DynamicLinksUtil.generateContentLink() val intent = Intent(Intent.ACTION_SEND) intent.type = "text/plain" intent.putExtra(Intent.EXTRA_TEXT, link.toString()) startActivity(Intent.createChooser(intent, "Share Link")) }
Java
private void onShareClicked() { Uri link = DynamicLinksUtil.generateContentLink(); Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, link.toString()); startActivity(Intent.createChooser(intent, "Share Link")); }
در این مثال، رابط کاربری اشتراکگذاری پیشفرض بهطور خودکار فهرستی از برنامهها را برای اشتراکگذاری پیوند ارائه میکند، بنابراین چیزی است که میتوانید تنها با چند خط کد در برنامه خود تنظیم کنید.
به جای اینکه کاربر مخاطبین را انتخاب کند و پیام را در برنامه شما بنویسد، این اقدامات به برنامه ای که از گفتگوی اشتراک گذاری انتخاب می کند واگذار می شود. علاوه بر این، واگذاری اشتراکگذاری به برنامههای دیگر به این معنی است که شما مجبور نیستید از کاربر مجوزهای مخاطبین را بخواهید و به کاربران اجازه میدهد از فهرست مخاطبین گسترده در برنامه انتخابی خود انتخاب کنند. برای تسهیل بهتر اشتراکگذاری اجتماعی، میتوانید ابردادههای پیشنمایش رسانههای اجتماعی را به پیوند پویا خود اضافه کنید که همراه با پیوند در کانالهای اجتماعی اصلی نمایش داده میشود.
با این حال، گاهی اوقات فقط ارسال یک لینک بدون متن برای یک ارجاع قانع کننده کافی نیست. با همراه کردن پیوند با یک پیام کوتاه و، در صورت امکان، ارائه غنی تر، کاربران می توانند ارزش پیشنهادی ارجاع را هنگام دریافت آن درک کنند:
iOS


اندروید


اگرچه این پیچیده تر از نمونه قبلی است، رویکرد کمابیش یکسان خواهد بود. در این صفحه یک گرافیک بزرگ با پیشنهاد ارزش دعوت و دکمههایی برای اشتراکگذاری در کانالهای اجتماعی اصلی وجود دارد. مقداری افزونگی در این جریان رابط کاربری وجود دارد—بعضی از کانالهای اشتراکگذاری به صورت جداگانه ارائه میشوند تا امکان سفارشیسازی پیامهای خاص کانال را فراهم کنند، مانند افزودن خط موضوع به دعوتهای ایمیل. در این منوی دعوت، ما:
- ایمیل، پیام متنی، و دکمه های اشتراک لینک را کپی کنید و پیام های آنها را به طور مناسب سفارشی کنید. ایمیل شامل یک موضوع میشود و میتواند شامل یک متن طولانیتر با شکستههای خط، تصاویر و فضای خالی باشد. متن باید دارای بدنه کوتاهتر با شکاف خط، اما فضای خالی کم و بدون تصویر باشد. و کپی لینک باید فقط لینک را کپی کند و هیچ چیز دیگری.
- از رابط کاربری اشتراکگذاری سیستم برای هر چیز دیگری از جمله یک پیام دعوت کوتاه برای همراهی پیوند استفاده کنید.
- پیوند عمیق از طریق طرح URL یا پیوند جهانی به برنامه دیگری که منطق ویژه ای برای رسیدگی به دعوت نامه های برنامه شما دارد. این خارج از شراکت بین سازمان شما و برنامه دیگر کار نمی کند و احتمالاً برای سازمان های کوچکتر گزینه ای نیست. گفته می شود، برخی از برنامه ها ممکن است به صورت عمومی رفتار پیوند جهانی/عمیق خود را مستند کنند. ما یک نسخه ساختگی از این را در نمونه خود پیاده سازی می کنیم.
ابتدا یک نوع محتوای دعوت تعریف کنید، که فقط اطلاعات موجود در یک دعوتنامه را محصور می کند و هیچ عملکردی ندارد. به این ترتیب، میتوانید با انواع دادهها شروع کنید و در مورد کد خود از نظر اینکه چگونه آن دادهها را در کنار هم قرار میدهد فکر کنید.
سریع
/// The content within an invite, with optional fields to accommodate all presenters. /// This type could be modified to also include an image, for sending invites over email. struct InviteContent { /// The subject of the message. Not used for invites without subjects, like text message invites. var subject: String? /// The body of the message. Indispensable content should go here. var body: String? /// The URL containing the invite. In link-copy cases, only this field will be used. var link: URL }
هدف-C
/// The content within an invite, with optional fields to accommodate all presenters. /// This type could be modified to also include an image, for sending invites over email. @interface InviteContent : NSObject <NSCopying> /// The subject of the message. Not used for invites without subjects, like text message invites. @property (nonatomic, readonly, nullable) NSString *subject; /// The body of the message. Indispensable content should go here. @property (nonatomic, readonly, nullable) NSString *body; /// The URL containing the invite. In link-copy cases, only this field will be used. @property (nonatomic, readonly) NSURL *link; - (instancetype)initWithSubject:(nullable NSString *)subject body:(nullable NSString *)body link:(NSURL *)link NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE; @end
Kotlin+KTX
/** * The content of an invitation, with optional fields to accommodate all presenters. * This type could be modified to also include an image, for sending invites over email. */ data class InviteContent( /** The subject of the message. Not used for invites without subjects, like SMS. */ val subject: String?, /** The body of the message. Indispensable content should go here. */ val body: String?, /** The URL containing the link to invite. In link-copy cases, only this field will be used. */ val link: Uri )
Java
/** * The content of an invitation, with optional fields to accommodate all presenters. * This type could be modified to also include an image, for sending invites over email. */ public class InviteContent { /** * The subject of the message. Not used for invites without subjects, like SMS. **/ @Nullable public final String subject; /** * The body of the message. Indispensable content should go here. **/ @Nullable public final String body; /** * The URL containing the link to invite. In link-copy cases, only this field will be used. **/ @NonNull public final Uri link; public InviteContent(@Nullable String subject, @Nullable String body, @NonNull Uri link) { // ... } }
تنها داده مورد نیاز در اینجا URL است که بدون آن نمی توانید کاربران را به برنامه خود دعوت کنید. سایر بخشهای داده به وضوح در جهت ارسال ایمیلها ساختار یافتهاند، که در برخی موارد دیگر آنها را کمی ناخوشایند میکند - هنگام ارسال دعوت نامه از طریق متن، تار همراه پیوند ممکن است شبیه به موضوع ایمیل خوانده شود، اما هنگام اشتراکگذاری در رسانههای اجتماعی لینک همراه متن ممکن است بیشتر شبیه یک متن ایمیل باشد. باید خودتان این مورد را آزمایش کنید تا بهترین تعادل را برای برنامه خود بیابید، و اگر مطمئن نیستید، همیشه میتوانید از سرویسی مانند Remote Config استفاده کنید تا به شما اجازه دهد پس از راهاندازی برنامه، مقادیر متن را تغییر دهید.
سریع
/// A type responsible for presenting an invite given using a specific method /// given the content of the invite. protocol InvitePresenter { /// The name of the presenter. User-visible. var name: String { get } /// An icon representing the invite method. User-visible. var icon: UIImage? { get } /// Whether or not the presenter's method is available. iOS devices that aren't phones /// may not be able to send texts, for example. var isAvailable: Bool { get } /// The content of the invite. Some of the content type's fields may be unused. var content: InviteContent { get } /// Designated initializer. init(content: InviteContent, presentingController: UIViewController) /// This method should cause the presenter to present the invite and then handle any actions /// required to complete the invite flow. func sendInvite() }
هدف-C
/// A type responsible for presenting an invite given using a specific method /// given the content of the invite. @protocol InvitePresenter <NSObject> /// The name of the presenter. User-visible. @property (nonatomic, readonly) NSString *name; /// An icon representing the invite method. User-visible. @property (nonatomic, readonly, nullable) UIImage *icon; /// Whether or not the presenter's method is available. iOS devices that aren't phones /// may not be able to send texts, for example. @property (nonatomic, readonly) BOOL isAvailable; /// The content of the invite. Some of the content type's fields may be unused. @property (nonatomic, readonly) InviteContent *content; /// Designated initializer. - (instancetype)initWithContent:(InviteContent *)content presentingViewController:(UIViewController *)controller; /// This method should cause the presenter to present the invite and then handle any actions /// required to complete the invite flow. - (void)sendInvite; @end
Kotlin+KTX
/** * Presents the invite using a specific method, such as email or social. */ open class InvitePresenter( /** The user-visible name of the invite method, like 'Email' or 'SMS' */ val name: String, /** An icon representing the invite method. */ @param:DrawableRes @field:DrawableRes val icon: Int, /** Whether or not the method is available on this device. For example, SMS is phone only. */ val isAvailable: Boolean, /** The Content of the invitation */ val content: InviteContent ) { /** * Send the invitation using the specified method. */ open fun sendInvite(context: Context) { // ... } }
Java
/** * Presents the invite using a specific method, such as email or social. */ public class InvitePresenter { /** * The user-visible name of the invite method, like 'Email' or 'SMS' **/ public final String name; /** * An icon representing the invite method. **/ @DrawableRes public final int icon; /** * Whether or not the method is available on this device. For example, SMS is phone only. **/ public final boolean isAvailable; /** * The Content of the invitation **/ public final InviteContent content; public InvitePresenter(String name, @DrawableRes int icon, boolean isAvailable, InviteContent content) { // ... } /** * Send the invitation using the specified method. */ public void sendInvite(Context context) { // ... } }
اکنون تنها چیزی که باقی مانده است این است که این را به یک مؤلفه رابط کاربری انتخابی خود وصل کنید. برای اجرای کامل این جریان دعوت، نمونههایی را در GitHub برای iOS و Android مشاهده کنید.
اینها همه روش هایی هستند که کاربران شما را قادر می سازد برای دوستان خود دعوت نامه ارسال کنند که سبک ترین راه حل دعوت است. بسیاری از برنامههای محبوب نیز دعوتنامهها را با ارسال ایمیل از طریق باطن خود ارسال میکنند، که نیازمند یکپارچهسازی یک سرویس ارسال نامه است، اما تعدادی از مزایایی را ارائه میدهد که در غیر این صورت تنها با چند اشکال جزئی در دسترس نیستند.
طرفداران:
- ایمیلهایی با نشانهگذاری پیچیده را فعال میکند که کاربر قبل از ارسال نمیتواند آنها را اصلاح کند.
- ردیابی/تجزیه و تحلیل دقیقتر را فعال میکند (یعنی ارسال موفقیتها و شکستها در باطن شما).
معایب:
- ایمیلها بیشتر بهعنوان هرزنامه علامتگذاری میشوند
- نیاز به ادغام با یک سرویس تحویل ایمیل دارد
- به مجوزهای مخاطبین درون برنامه ای نیاز دارد
به طور کلی، ارسال دعوت نامه ها از طریق سرویس تحویل ایمیل شما، تجربه دعوتی سازگارتر و بالقوه غنی تری را به قیمت تطبیق پذیری فراهم می کند.
محتوای پیوند شده را در برنامه خود باز کنید
در نهایت، باید پیوندی را که به برنامه شما ارسال شده است دریافت کنید تا بتوانید محتوای پیوند شده را به گیرنده نمایش دهید. این کار با استفاده از Dynamic Links SDK آسان است:
iOS
در iOS، با اجرای متد application:continueUserActivity:restorationHandler:
پیوند پویا را دریافت می کنید. در کنترل کننده بازیابی، می توانید با فراخوانی handleUniversalLink:completion:
پیوند پویا را دریافت کنید. اگر یک پیوند پویا به برنامه شما ارسال شده است، می توانید آن را از ویژگی url
FIRDynamicLink
دریافت کنید. مثلا:
هدف-C
[[FIRDynamicLinks dynamicLinks]
handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink * _Nullable dynamicLink,
NSError * _Nullable error) {
NSString *link = dynamicLink.url;
BOOL strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong;
// ...
}];
سریع
FIRDynamicLinks.dynamicLinks()?.handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
let link = dynamicLink.url
let strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong
// ...
}
علاوه بر این، باید dynamicLinkFromCustomSchemeURL:
را در application:openURL:options:
برای دریافت پیوندهای پویا که به عنوان URL طرح سفارشی به برنامه شما ارسال می شود، فراخوانی کنید. مثلا:
هدف-C
FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
if (dynamicLink) {
NSString *link = dynamicLink.url;
BOOL strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong;
// ...
return YES;
}
سریع
let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
if let dynamicLink = dynamicLink {
let link = dynamicLink.url
let strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong
// ...
return true
}
اکنون که مقدار پارامتر link
را دارید، می توانید محتوای پیوند شده را به گیرنده نمایش دهید یا داده های مشخص شده توسط پارامتر را به روش دیگری پردازش کنید. یک کتابخانه مسیریابی URL مانند JLRoutes می تواند به این کار کمک کند.
اگر پیوندی را دریافت میکنید که برای یک گیرنده خاص در نظر گرفته شده است، قبل از اجرای هر منطق خاص کاربر، اطمینان حاصل کنید که اطمینان از مطابقت پیوند پویا strong
است.
اندروید
در اندروید، از متد getDynamicLink()
برای دریافت داده از Dynamic Link استفاده می کنید:
Kotlin+KTX
Firebase.dynamicLinks .getDynamicLink(intent) .addOnCompleteListener { task -> if (!task.isSuccessful) { // Handle error // ... } val invite = FirebaseAppInvite.getInvitation(task.result) if (invite != null) { // Handle invite // ... } }
Java
FirebaseDynamicLinks.getInstance() .getDynamicLink(getIntent()) .addOnCompleteListener(new OnCompleteListener<PendingDynamicLinkData>() { @Override public void onComplete(@NonNull Task<PendingDynamicLinkData> task) { if (!task.isSuccessful()) { // Handle error // ... } FirebaseAppInvite invite = FirebaseAppInvite.getInvitation(task.getResult()); if (invite != null) { // Handle invite // ... } } });
اکنون که مقدار پارامتر link
را دارید، می توانید محتوای پیوند شده را به گیرنده نمایش دهید یا داده های مشخص شده توسط پارامتر را به روش دیگری پردازش کنید. یک کتابخانه مسیریابی URL می تواند به این کار کمک کند.