Một trong những cách hiệu quả nhất để thu hút người dùng mới cài đặt ứng dụng của bạn là cho phép người dùng chia sẻ nội dung từ ứng dụng của bạn với bạn bè của họ. Với Liên kết động, bạn có thể tạo trải nghiệm chia sẻ tuyệt vời giữa người dùng với người dùng: người dùng nhận được đề xuất nội dung từ bạn bè của họ có thể nhấp vào liên kết và được đưa trực tiếp đến nội dung được chia sẻ trong ứng dụng của bạn, ngay cả khi họ phải truy cập Ứng dụng Store hoặc Cửa hàng Google Play để cài đặt ứng dụng của bạn trước.
Bằng cách kết hợp tính gắn bó của giới thiệu người dùng và tính bền vững của Liên kết động, bạn có thể tạo các tính năng giới thiệu và chia sẻ giữa người dùng với người dùng để thu hút người dùng mới bằng cách thu hút họ trực tiếp vào nội dung ứng dụng của bạn hoặc phân phát quảng cáo có lợi cho cả người giới thiệu và người được giới thiệu .
Lợi ích chính
- Người dùng mới mở ứng dụng của bạn lần đầu tiên sẽ có trải nghiệm chạy đầu tiên được tùy chỉnh, được tùy chỉnh theo ngữ cảnh dựa trên những gì bạn bè của họ muốn chia sẻ với họ. Ví dụ: bạn có thể hiển thị nội dung đã được chia sẻ với họ hoặc tự động kết nối họ với người bạn đã mời họ.
- Giúp người dùng dễ dàng chia sẻ nội dung với bạn bè của họ trên các nền tảng cho dù bạn bè của họ có cài đặt ứng dụng của bạn hay không.
Đây là cách để bắt đầu!
Thiết lập Firebase và SDK liên kết động
Thiết lập dự án Firebase mới và cài đặt SDK liên kết động vào ứng dụng của bạn.
Cài đặt SDK liên kết động cho phép Firebase truyền dữ liệu về Liên kết động tới ứng dụng, kể cả sau khi người dùng cài đặt ứng dụng.
Tạo liên kết động
Bây giờ là lúc thiết lập các liên kết mà người dùng có thể gửi cho bạn bè của họ. Đừng lo lắng nếu bạn bè của người dùng của bạn chưa cài đặt ứng dụng; Liên kết động có thể giải quyết vấn đề đó cho bạn.
Đối với mỗi thành phần của nội dung bạn muốn có thể chia sẻ được, hãy tạo Liên kết động .
Khi tạo Liên kết động, bạn cần cung cấp URL HTTP hoặc HTTPS làm tham số link
sẽ được sử dụng để xác định nội dung bạn đang chia sẻ. Nếu bạn có một trang web có nội dung tương đương, bạn nên sử dụng các URL của trang web của mình. Điều này sẽ đảm bảo rằng các liên kết này hiển thị chính xác trên nền tảng không hỗ trợ Liên kết động, chẳng hạn như trình duyệt dành cho máy tính để bàn. Ví dụ:
https://example.page.link/?link=https://www.example.com/content?item%3D1234&apn=com.example.android&ibi=com.example.ios&isi=12345
Bạn cũng có thể thêm thông tin bổ sung vào tải trọng dữ liệu bằng cách thêm các tham số được mã hóa URL—ví dụ: để cho biết rằng liên kết dành cho một người dùng cụ thể, chẳng hạn như trong lời mời tham gia trò chơi.
https://example.page.link/?link=https://www.example.com/invitation?gameid%3D1234%26referrer%3D555&apn=com.example.android&ibi=com.example.ios&isi=12345
Trước khi chia sẻ các liên kết này, bạn có thể muốn sử dụng API trình rút ngắn URL liên kết động của Firebase để tạo các URL có giao diện thân thiện hơn. Liên kết động ngắn trông giống như ví dụ sau:
https://example.page.link/WXYZ
Cho dù bạn sử dụng liên kết nào, khi người dùng mở Liên kết động trên thiết bị của họ, ứng dụng được chỉ định bởi thông số apn
(trên Android) hoặc thông số ibi
và isi
(trên iOS) sẽ đưa người dùng đến Play Store hoặc App Store để cài đặt ứng dụng nếu nó chưa được cài đặt. Sau đó, khi ứng dụng được cài đặt và mở, URL được chỉ định trong thông số 'liên kết' sẽ được chuyển đến ứng dụng.
Thêm các nút "Chia sẻ" gửi Liên kết động
Trước tiên, hãy xem ví dụ đơn giản này về ứng dụng trò chuyện dựa trên phòng như Hangouts tạo liên kết để mời mọi người vào phòng trò chuyện.
iOS


Android


Nhanh
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 }
Mục tiêu-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(); }
Khi bạn có liên kết động, bạn có thể thêm nút chia sẻ vào giao diện người dùng của mình để khởi chạy quy trình chia sẻ nền tảng tiêu chuẩn:
Nhanh
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) }
Mục tiêu-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")); }
Trong ví dụ này, giao diện người dùng chia sẻ mặc định sẽ tự động hiển thị danh sách các ứng dụng để chia sẻ liên kết, do đó, đây là thứ bạn có thể thiết lập trong ứng dụng của riêng mình chỉ bằng một vài dòng mã.
Thay vì yêu cầu người dùng chọn danh bạ và soạn tin nhắn trong ứng dụng của bạn, những hành động này được ủy quyền cho ứng dụng mà họ chọn từ hộp thoại chia sẻ. Ngoài ra, ủy quyền chia sẻ cho các ứng dụng khác có nghĩa là bạn không phải yêu cầu người dùng cấp quyền liên hệ và cho phép người dùng chọn từ danh sách liên hệ mở rộng trong ứng dụng họ đã chọn. Để tạo điều kiện thuận lợi hơn cho việc chia sẻ trên mạng xã hội, bạn có thể thêm siêu dữ liệu xem trước trên mạng xã hội vào liên kết động của mình. Siêu dữ liệu này sẽ được hiển thị cùng với liên kết trong các kênh xã hội chính.
Tuy nhiên, đôi khi, chỉ gửi một liên kết trống không có văn bản là không đủ để giới thiệu hấp dẫn. Bằng cách kèm theo liên kết với một thông báo ngắn và nếu có thể, một bản trình bày phong phú hơn, người dùng có thể hiểu được đề xuất giá trị của người giới thiệu khi họ nhận được nó:
iOS


Android


Mặc dù điều này phức tạp hơn ví dụ trước, nhưng cách tiếp cận sẽ ít nhiều giống nhau. Trên màn hình này có một đồ họa lớn với đề xuất giá trị của lời mời và các nút để chia sẻ với các kênh xã hội lớn. Có một số dư thừa trong luồng giao diện người dùng này—một số kênh chia sẻ được hiển thị riêng lẻ để cho phép tùy chỉnh thông báo theo kênh cụ thể hơn, chẳng hạn như thêm dòng chủ đề vào lời mời qua email. Trong menu mời này, chúng tôi:
- Trình bày email, tin nhắn văn bản và sao chép các nút chia sẻ liên kết cũng như tùy chỉnh thông điệp của họ một cách thích hợp. Email sẽ bao gồm chủ đề và có thể bao gồm phần nội dung dài hơn với ngắt dòng, hình ảnh và khoảng trắng; văn bản phải có nội dung ngắn hơn với các ngắt dòng nhưng ít khoảng trắng và không có hình ảnh; và sao chép liên kết chỉ nên sao chép liên kết và không có gì khác.
- Sử dụng giao diện người dùng chia sẻ hệ thống cho mọi thứ khác, bao gồm một thông báo mời ngắn đi kèm với liên kết.
- Liên kết sâu qua lược đồ URL hoặc liên kết chung đến một ứng dụng khác có logic đặc biệt để xử lý lời mời của ứng dụng của bạn. Điều này sẽ không hoạt động nếu không có sự hợp tác giữa tổ chức của bạn và ứng dụng khác và có thể không phải là một tùy chọn cho các tổ chức nhỏ hơn. Điều đó nói rằng, một số ứng dụng có thể ghi lại công khai hành vi liên kết sâu/chung của chúng. Chúng tôi sẽ thực hiện một phiên bản giả của điều này trong mẫu của chúng tôi.
Trước tiên, hãy xác định loại nội dung lời mời, loại nội dung này chỉ gói gọn thông tin trong lời mời và không chứa chức năng. Bằng cách này, bạn có thể bắt đầu với các loại dữ liệu và suy nghĩ về mã của mình theo cách nó ghép dữ liệu đó lại với nhau.
Nhanh
/// 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 }
Mục tiêu-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) { // ... } }
Phần dữ liệu bắt buộc duy nhất ở đây là URL, nếu không có URL này thì bạn không thể mời người dùng vào ứng dụng của mình. Các phần dữ liệu khác được cấu trúc rõ ràng để gửi email, điều này khiến chúng hơi khó xử trong một số trường hợp khác--khi gửi lời mời qua văn bản, lời giới thiệu kèm theo liên kết có thể đọc tương tự như chủ đề email, nhưng khi chia sẻ lên mạng xã hội văn bản đi kèm liên kết có thể giống nội dung email hơn. Bạn sẽ phải tự mình thử nghiệm điều này để tìm ra sự cân bằng tốt nhất cho ứng dụng của mình và nếu không chắc chắn, bạn luôn có thể sử dụng dịch vụ như Cấu hình từ xa để cho phép bạn thay đổi giá trị văn bản sau khi khởi chạy ứng dụng.
Nhanh
/// 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() }
Mục tiêu-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) { // ... } }
Bây giờ tất cả những gì còn lại là cắm cái này vào một thành phần giao diện người dùng mà bạn chọn. Để triển khai đầy đủ luồng lời mời này, hãy xem các mẫu trên GitHub dành cho iOS và Android .
Đây là tất cả các phương pháp cho phép người dùng của bạn gửi lời mời đến bạn bè của họ, đây là giải pháp lời mời gọn nhẹ nhất. Nhiều ứng dụng phổ biến cũng cung cấp lời mời bằng cách gửi email thông qua chương trình phụ trợ của riêng chúng, yêu cầu tích hợp dịch vụ gửi thư nhưng cung cấp một số lợi ích không có sẵn chỉ với một số nhược điểm nhỏ.
Ưu điểm:
- Cho phép email có đánh dấu phức tạp mà người dùng của bạn không thể sửa đổi trước khi gửi.
- Cho phép theo dõi/phân tích chi tiết hơn (tức là gửi thành công và thất bại trên phần phụ trợ của bạn).
Nhược điểm:
- Email có nhiều khả năng bị gắn cờ là thư rác
- Yêu cầu tích hợp với dịch vụ gửi email
- Yêu cầu quyền liên hệ trong ứng dụng
Nói chung, gửi lời mời thông qua dịch vụ gửi email của riêng bạn cung cấp trải nghiệm lời mời nhất quán hơn và có khả năng phong phú hơn với chi phí linh hoạt.
Mở nội dung được liên kết trong ứng dụng của bạn
Cuối cùng, bạn cần nhận được liên kết được chuyển đến ứng dụng của mình để bạn có thể hiển thị nội dung được liên kết cho người nhận. Điều này thật dễ dàng khi sử dụng SDK liên kết động:
iOS
Trên iOS, bạn nhận được Liên kết động bằng cách triển khai phương thức application:continueUserActivity:restorationHandler:
:. Trong trình xử lý khôi phục, bạn có thể lấy Liên kết động bằng cách gọi handleUniversalLink:completion:
. Nếu Liên kết động được chuyển đến ứng dụng của bạn, bạn có thể lấy liên kết đó từ thuộc tính url
của FIRDynamicLink
. Ví dụ:
Mục tiêu-C
[[FIRDynamicLinks dynamicLinks]
handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink * _Nullable dynamicLink,
NSError * _Nullable error) {
NSString *link = dynamicLink.url;
BOOL strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong;
// ...
}];
Nhanh
FIRDynamicLinks.dynamicLinks()?.handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
let link = dynamicLink.url
let strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong
// ...
}
Ngoài ra, bạn phải gọi dynamicLinkFromCustomSchemeURL:
trong application:openURL:options:
để nhận Liên kết động được chuyển đến ứng dụng của bạn dưới dạng URL lược đồ tùy chỉnh. Ví dụ:
Mục tiêu-C
FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
if (dynamicLink) {
NSString *link = dynamicLink.url;
BOOL strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong;
// ...
return YES;
}
Nhanh
let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
if let dynamicLink = dynamicLink {
let link = dynamicLink.url
let strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong
// ...
return true
}
Bây giờ bạn đã có giá trị của tham số link
, bạn có thể hiển thị nội dung được liên kết cho người nhận hoặc xử lý dữ liệu được chỉ định bởi tham số theo một số cách khác. Một thư viện định tuyến URL chẳng hạn như JLRoutes có thể giúp thực hiện nhiệm vụ này.
Nếu bạn đang nhận được một liên kết dành cho một người nhận cụ thể, hãy đảm bảo rằng độ tin cậy đối sánh của Liên kết strong
trước khi chạy bất kỳ logic cụ thể nào của người dùng.
Android
Trên Android, bạn sử dụng phương thức getDynamicLink()
để lấy dữ liệu từ 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 // ... } } });
Bây giờ bạn đã có giá trị của tham số link
, bạn có thể hiển thị nội dung được liên kết cho người nhận hoặc xử lý dữ liệu được chỉ định bởi tham số theo một số cách khác. Thư viện định tuyến URL có thể trợ giúp với nhiệm vụ này.