אחת הדרכים היעילות ביותר לגרום למשתמשים חדשים להתקין את האפליקציה שלך היא לאפשר למשתמשים שלך לשתף תוכן מהאפליקציה שלך עם חבריהם. עם קישורים דינמיים, אתה יכול ליצור חווית שיתוף נהדרת בין משתמש למשתמש: משתמשים שמקבלים המלצות תוכן מחבריהם יכולים ללחוץ על קישור ולהעביר אותם ישירות לתוכן המשותף באפליקציה שלך, גם אם הם צריכים לעבור לאפליקציה חנות או חנות Google Play כדי להתקין תחילה את האפליקציה שלך.
על ידי שילוב של הדביקות של הפניות משתמשים והתמדה של קישורים דינמיים, אתה יכול ליצור תכונות שיתוף והפניה ממשתמש למשתמש שמביאות משתמשים חדשים על ידי משיכתם ישירות לתוכן האפליקציה שלך או הגשת מבצעים שיועילו הדדית למפנה והמופנה. .
יתרונות מרכזיים
- משתמשים חדשים שפותחים את האפליקציה שלך בפעם הראשונה מקבלים חוויית הפעלה ראשונה מותאמת אישית, המותאמת להקשר על סמך מה שחבר שלהם רצה לשתף איתם. לדוגמה, אתה יכול להציג את התוכן ששותף איתם, או לחבר אותם אוטומטית עם החבר שהזמין אותם.
- מקל על משתמשים לשתף תוכן עם חבריהם בפלטפורמות, בין אם החברים שלהם התקינו את האפליקציה שלך ובין אם לאו.
הנה איך להתחיל!
הגדר את Firebase ואת ה-SDK של Dynamic Links
הגדר פרויקט Firebase חדש והתקן את ה-SDK של Dynamic Links באפליקציה שלך.
התקנת ה-SDK של Dynamic Links מאפשרת ל-Firebase להעביר נתונים על הקישור הדינמי לאפליקציה, כולל לאחר שהמשתמש מתקין את האפליקציה.
צור קישורים דינמיים
עכשיו הגיע הזמן להגדיר את הקישורים שמשתמשים יכולים לשלוח לחבריהם. אל תדאג אם החברים של המשתמשים שלך עדיין לא התקינו את האפליקציה; קישורים דינמיים יכולים לטפל בזה בשבילך.
עבור כל רכיב תוכן שאתה רוצה שיהיה ניתן לשיתוף, צור קישור דינמי .
כאשר אתה יוצר את הקישור הדינמי, תצטרך לספק כתובת URL של HTTP או HTTPS כפרמטר link
שישמש לזיהוי התוכן שאתה משתף. אם יש לך אתר עם תוכן שווה ערך, עליך להשתמש בכתובות האתרים של האתר שלך. זה יבטיח שקישורים אלה יוצגו כהלכה בפלטפורמה שאינה תומכת בקישורים דינמיים, כגון דפדפן שולחני. לדוגמה:
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 Dynamic Links כדי ליצור כתובות URL בעלות מראה ידידותי יותר. קישור דינמי קצר נראה כמו הדוגמה הבאה:
https://example.page.link/WXYZ
לא משנה באיזה קישור אתה משתמש, כאשר משתמשים פותחים את הקישור הדינמי במכשיר שלהם, האפליקציה שצוינה על ידי פרמטר apn
(באנדרואיד) או הפרמטרים ibi
ו- isi
(ב-iOS) תעביר את המשתמשים לחנות Play או App Store כדי להתקין את האפליקציה אם הוא עדיין לא מותקן. לאחר מכן, כאשר האפליקציה מותקנת ונפתחת, כתובת האתר המצוינת בפרמטר 'קישור' מועברת לאפליקציה.
הוסף כפתורי "שתף" ששולחים קישורים דינמיים
ראשית, תסתכל על הדוגמה הפשוטה הזו של אפליקציית צ'אט מבוססת חדר כמו 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 }
Objective-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) }
Objective-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 }
Objective-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) { // ... } }
פיסת הנתונים הנדרשת היחידה כאן היא כתובת האתר, שבלעדיה אינך יכול להזמין משתמשים לאפליקציה שלך. חלקי הנתונים האחרים בנויים בבירור לקראת שליחת מיילים, מה שהופך אותם למעט מביכים במקרים אחרים - כאשר שולחים הזמנה באמצעות הודעת טקסט, הטקסט הנלווה לקישור עשוי להיקרא באופן דומה לנושא דוא"ל, אך בעת שיתוף במדיה חברתית הקישור הנלווה לטקסט עשוי להיות יותר כמו גוף דוא"ל. תצטרך להתנסות עם זה בעצמך כדי למצוא את האיזון הטוב ביותר עבור האפליקציה שלך, ואם אתה לא בטוח, אתה תמיד יכול להשתמש בשירות כמו 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() }
Objective-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 .
כל אלו הן השיטות לאפשר למשתמשים שלך לשלוח הזמנות לחברים שלהם, שזהו פתרון ההזמנה הקל ביותר. אפליקציות פופולריות רבות מספקות גם הזמנות על ידי שליחת אימיילים דרך הקצה האחורי שלהן, מה שדורש שילוב של שירות שליחת דואר, אך מציע מספר הטבות שאינן זמינות אחרת עם מספר חסרונות קלים בלבד.
יתרונות:
- מאפשר הודעות דוא"ל עם סימון מורכב שלא ניתן לשנות על ידי המשתמש שלך לפני השליחה.
- מאפשר מעקב/ניתוח מפורט יותר (כלומר שליחת הצלחות וכישלונות בקצה האחורי שלך).
חסרונות:
- סביר יותר שהודעות דוא"ל יסומנו כדואר זבל
- דורש אינטגרציה עם שירות משלוח דואר אלקטרוני
- דורש הרשאות אנשי קשר בתוך האפליקציה
בדרך כלל, שליחת הזמנות דרך שירות משלוח הדואר האלקטרוני שלך מספקת חווית הזמנות עקבית יותר ועלולה להיות עשירה יותר במחיר של רבגוניות.
פתח את התוכן המקושר באפליקציה שלך
לבסוף, עליך לקבל את הקישור שהועבר לאפליקציה שלך כדי שתוכל להציג את התוכן המקושר לנמען. זה קל באמצעות SDK של קישורים דינמיים:
iOS
ב-iOS, אתה מקבל את הקישור הדינמי על ידי יישום שיטת application:continueUserActivity:restorationHandler:
במטפל השחזור, אתה יכול לקבל את הקישור הדינמי על ידי קריאה handleUniversalLink:completion:
אם קישור דינמי הועבר לאפליקציה שלך, תוכל לקבל אותו ממאפיין ה- url
של ה- FIRDynamicLink
. לדוגמה:
Objective-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 של סכימה מותאמות אישית. לדוגמה:
Objective-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
, תוכל להציג את התוכן המקושר לנמען, או לעבד את הנתונים שצוינו על ידי הפרמטר בדרך אחרת. ספריית ניתוב כתובות אתרים כגון JLRoutes יכולה לעזור במשימה זו.
אם אתה מקבל קישור המיועד לנמען ספציפי, ודא שבטחון ההתאמה של הקישור הדינמי strong
לפני הפעלת לוגיקה ספציפית למשתמש.
דְמוּי אָדָם
ב-Android, אתה משתמש בשיטת getDynamicLink()
כדי לקבל נתונים מהקישור הדינמי:
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
, תוכל להציג את התוכן המקושר לנמען, או לעבד את הנתונים שצוינו על ידי הפרמטר בדרך אחרת. ספריית ניתוב כתובות אתרים יכולה לעזור במשימה זו.