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ẻ giữa người dùng với người dùng tuyệt vời: 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 sự gắn bó của giới thiệu người dùng và tính bền bỉ 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 để mang lại 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 các chương trình khuyến mại cùng có lợi cho người giới thiệu và người được giới thiệu .
Các 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ó được trải nghiệm lần đầu tiên đượ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.
Việc 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 phần tử của nội dung bạn muốn có thể chia sẻ được, hãy tạo một Liên kết động .
Khi tạo Liên kết động, bạn sẽ cần cung cấp URL HTTP hoặc HTTPS làm thông 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 trên 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 dữ liệu bằng cách thêm các thông 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 Firebase để tạo các URL trông thân thiện hơn. Một 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 Cửa hàng Play 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 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 trong 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 }
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; }
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(); }
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 }
Sau khi 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, nút này sẽ 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) }
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]; }
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")); }
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")) }
Trong ví dụ này, giao diện người dùng chia sẻ mặc định tự động hiển thị danh sách các ứng dụng để chia sẻ liên kết, vì vậy, đó là thứ bạn có thể thiết lập trong ứng dụng của riêng mình chỉ với một vài dòng mã.
Thay vì để người dùng chọn địa chỉ liên hệ 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, việc ủ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 phương tiện truyền thông xã hội vào liên kết động 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 không có văn bản là không đủ cho một 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 điệp 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 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ố điểm dư thừa trong luồng giao diện người dùng này — một số kênh chia sẻ được trình bày riêng lẻ để cho phép tùy chỉnh thông điệp 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, đồng thời tùy chỉnh các thông điệp của chúng một cách thích hợp. Email sẽ bao gồm một chủ đề và có thể bao gồm một nội dung dài hơn với các dấu ngắt dòng, hình ảnh và khoảng trắng; văn bản phải bao gồm phần 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 cả một tin nhắn mời ngắn kèm theo liên kết.
- Liên kết sâu thông 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 ứng dụng của bạn. Điều này sẽ không hoạt động bên ngoài mối quan hệ đối 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 / phổ quát của chúng. Chúng tôi sẽ triển khai một phiên bản giả của điều này trong mẫu của chúng tôi.
Đầu tiên, hãy xác định một 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 nào. 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 bạn về cách nó ghép các 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 }
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
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) { // ... } }
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 )
Phần dữ liệu bắt buộc duy nhất ở đây là URL, nếu không có URL, 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, phần nổi bật 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 các 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() }
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
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) { // ... } }
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) { // ... } }
Bây giờ tất cả những gì còn lại là cắm nó vào một thành phần giao diện người dùng mà bạn chọn. Để triển khai đầy đủ quy trình 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 nhẹ nhàng nhất. Nhiều ứng dụng phổ biến cũng gửi 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 các 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 chương trình phụ trợ của bạn).
Nhược điểm:
- Email có nhiều khả năng bị gắn cờ là spam hơn
- 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ó tiềm 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 bằng cách 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 application:continueUserActivity:restorationHandler:
method. 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 một Liên kết động đã được chuyển đến ứng dụng của bạn, bạn có thể lấy nó từ thuộc tính url
của FIRDynamicLink
. Ví dụ:
Objective-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 các 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ụ:
Objective-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. 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 động là strong
trước khi chạy bất kỳ logic nào dành cho người dùng cụ thể.
Android
Trên Android, bạn sử dụng phương thức getDynamicLink()
để lấy dữ liệu từ Liên kết động:
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 // ... } } });
Kotlin+KTX
Firebase.dynamicLinks .getDynamicLink(intent) .addOnCompleteListener { task -> if (!task.isSuccessful) { // Handle error // ... } val invite = FirebaseAppInvite.getInvitation(task.result) 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ể giúp thực hiện nhiệm vụ này.