Yeni kullanıcıların uygulamanızı yüklemesini sağlamanın en etkili yollarından biri, kullanıcılarınızın uygulamanızdaki içeriği arkadaşlarıyla paylaşmasını sağlamaktır. Dinamik Bağlantılar ile harika bir kullanıcıdan kullanıcıya paylaşım deneyimi oluşturabilirsiniz: arkadaşlarından içerik önerileri alan kullanıcılar, bir bağlantıya tıklayabilir ve Uygulamaya gitmeleri gerekse bile doğrudan uygulamanızdaki paylaşılan içeriğe yönlendirilebilir. Önce uygulamanızı yüklemek için Store veya Google Play Store.
Kullanıcı yönlendirmelerinin kalıcılığı ile Dinamik Bağlantıların sürekliliğini birleştirerek, yeni kullanıcıları doğrudan uygulamanızın içeriğine çekerek veya yönlendiren ile yönlendirilen arasında karşılıklı yarar sağlayan promosyonlar sunarak kullanıcıdan kullanıcıya paylaşım ve yönlendirme özellikleri oluşturabilirsiniz. .
Önemli avantajlar
- Uygulamanızı ilk kez açan yeni kullanıcılar, arkadaşlarının kendileriyle paylaşmak istediklerine göre bağlamsallaştırılmış, özelleştirilmiş bir ilk çalıştırma deneyimi elde eder. Örneğin, onlarla paylaşılan içeriği görüntüleyebilir veya onları, onları davet eden arkadaşa otomatik olarak bağlayabilirsiniz.
- Arkadaşlarında uygulamanız yüklü olsun ya da olmasın, kullanıcıların platformlar genelinde arkadaşlarıyla içerik paylaşmasını kolaylaştırır.
İşte nasıl başlayacağınız!
Firebase ve Dinamik Bağlantılar SDK'sını kurun
Yeni bir Firebase projesi kurun ve Dynamic Links SDK'yı uygulamanıza yükleyin.
Dynamic Links SDK'nın yüklenmesi, Firebase'in, kullanıcının uygulamayı yükledikten sonra da dahil olmak üzere Dynamic Link hakkındaki verileri uygulamaya iletmesine olanak tanır.
Dinamik Bağlantılar Oluşturun
Şimdi sıra kullanıcıların arkadaşlarına gönderebilecekleri bağlantıları kurmaya geldi. Kullanıcılarınızın arkadaşları henüz uygulamayı yüklemediyse endişelenmeyin; Dynamic Links bunu sizin yerinize halledebilir.
Paylaşılabilir olmasını istediğiniz her içerik öğesi için bir Dinamik Bağlantı oluşturun .
Dinamik Bağlantı oluşturduğunuzda, paylaştığınız içeriği tanımlamak için kullanılacak link
parametresi olarak bir HTTP veya HTTPS URL'si sağlamanız gerekir. Eşdeğer içeriğe sahip bir web siteniz varsa, web sitenizin URL'lerini kullanmalısınız. Bu, bu bağlantıların masaüstü tarayıcı gibi Dinamik Bağlantıları desteklemeyen bir platformda doğru şekilde oluşturulmasını sağlayacaktır. Örneğin:
https://example.page.link/?link=https://www.example.com/content?item%3D1234&apn=com.example.android&ibi=com.example.ios&isi=12345
URL kodlu parametreler ekleyerek veri yüküne ek bilgiler de ekleyebilirsiniz; örneğin, bağlantının belirli bir kullanıcıya yönelik olduğunu belirtmek için, örneğin bir oyun davetinde.
https://example.page.link/?link=https://www.example.com/invitation?gameid%3D1234%26referrer%3D555&apn=com.example.android&ibi=com.example.ios&isi=12345
Bu bağlantıları paylaşmadan önce, daha kolay görünen URL'ler oluşturmak için Firebase Dynamic Links URL kısaltıcı API'sini kullanmak isteyebilirsiniz. Kısa bir Dinamik Bağlantı aşağıdaki örneğe benzer:
https://example.page.link/WXYZ
Hangi bağlantıyı kullanırsanız kullanın, kullanıcılar cihazlarında Dynamic Link'i açtıklarında, apn
parametresi (Android'de) veya ibi
ve isi
parametreleriyle (iOS'ta) belirtilen uygulama, kullanıcıları uygulamayı yüklemeleri için Play Store veya App Store'a götürür. zaten kurulu değilse. Ardından, uygulama yüklenip açıldığında, 'bağlantı' parametresinde belirtilen URL uygulamaya iletilir.
Dinamik Bağlantılar gönderen "Paylaş" düğmeleri ekleyin
Öncelikle, insanları sohbet odalarına davet etmek için bağlantılar oluşturan Hangouts gibi oda tabanlı bir sohbet uygulamasına ilişkin bu basit örneğe bakın.
iOS


Android


Süratli
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 }
Amaç-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(); }
Dinamik bir bağlantınız olduğunda, kullanıcı arabiriminize standart platform paylaşım akışını başlatacak bir paylaşım düğmesi ekleyebilirsiniz:
Süratli
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) }
Amaç-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")); }
Bu örnekte, varsayılan paylaşım kullanıcı arabirimi, bağlantıyı paylaşmak için otomatik olarak bir uygulama listesi sunar, bu nedenle bu, yalnızca birkaç satır kodla kendi uygulamanızda ayarlayabileceğiniz bir şeydir.
Kullanıcının kişileri seçmesini ve uygulamanızda mesajı oluşturmasını sağlamak yerine, bu eylemler, paylaşım iletişim kutusundan seçtikleri uygulamaya atanır. Ayrıca, diğer uygulamalara paylaşım yetkisi vermek, kullanıcıdan kişi izinleri istemeniz gerekmediği anlamına gelir ve kullanıcıların seçtikleri uygulama içinde genişletilmiş bir kişi listesinden seçim yapmasına olanak tanır. Sosyal paylaşımı daha iyi kolaylaştırmak için dinamik bağlantınıza, bağlantıyla birlikte büyük sosyal kanallarda görüntülenecek olan sosyal medya önizleme meta verilerini ekleyebilirsiniz .
Ancak bazen, yalnızca metin içermeyen çıplak bir bağlantı göndermek, ikna edici bir yönlendirme için yeterli değildir. Bağlantıya kısa bir mesaj ve mümkünse daha zengin bir sunum eşlik ederek, kullanıcılar yönlendirmeyi aldıklarında değer teklifini anlayabilirler:
iOS


Android


Bu, son örnekten daha karmaşık olsa da, yaklaşım aşağı yukarı aynı olacaktır. Bu ekranda, davetin değer teklifini ve büyük sosyal kanallarda paylaşmak için düğmeleri içeren büyük bir grafik var. Bu kullanıcı arabirimi akışında biraz fazlalık var; bazı paylaşım kanalları, e-posta davetlerine bir konu satırı eklemek gibi kanala özgü daha fazla mesaj özelleştirmesine izin vermek için ayrı ayrı sunulur. Bu davet menüsünde biz:
- E-posta, kısa mesaj ve kopya bağlantı paylaşım düğmelerini sunun ve mesajlarını uygun şekilde özelleştirin. E-posta bir konu içerir ve satır sonları, resimler ve boşluk içeren daha uzun bir gövde içerebilir; metin, satır sonları olan ancak çok az boşluk içeren ve resim içermeyen daha kısa bir gövde içermelidir; ve bağlantı kopyalama, yalnızca bağlantıyı kopyalamalı, başka bir şey yapmamalıdır.
- Bağlantıya eşlik edecek kısa bir davet mesajı da dahil olmak üzere diğer her şey için sistem paylaşımı kullanıcı arayüzünü kullanın.
- Uygulamanızın davetlerini işlemek için özel mantığı olan başka bir uygulamaya URL şeması veya evrensel bağlantı yoluyla derin bağlantı. Bu, kuruluşunuz ile diğer uygulama arasındaki ortaklığın dışında çalışmaz ve muhtemelen daha küçük kuruluşlar için bir seçenek değildir. Bununla birlikte, bazı uygulamalar evrensel/derin bağlantı davranışlarını herkese açık olarak belgeleyebilir. Örneğimizde bunun sahte bir sürümünü uygulayacağız.
İlk olarak, yalnızca bir davetteki bilgileri kapsayan ve hiçbir işlevsellik içermeyen bir davet içerik türü tanımlayın. Bu şekilde, veri türleriyle başlayabilir ve kodunuzu bu verileri nasıl bir araya getirdiği açısından düşünebilirsiniz.
Süratli
/// 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 }
Amaç-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) { // ... } }
Burada gerekli olan tek veri parçası URL'dir ve bu olmadan kullanıcıları uygulamanıza davet edemezsiniz. Diğer veri parçaları, açıkça e-posta göndermeye yönelik yapılandırılmıştır, bu da diğer bazı durumlarda onları biraz garip hale getirir - metin üzerinden bir davet gönderirken, bağlantıya eşlik eden tanıtım yazısı bir e-posta konusuna benzer şekilde okunabilir, ancak sosyal medyada paylaşırken metne eşlik eden bağlantı daha çok bir e-posta gövdesi gibi olabilir. Uygulamanız için en iyi dengeyi bulmak için bunu kendiniz denemeniz gerekecek ve emin değilseniz, uygulama başlatıldıktan sonra metin değerlerini değiştirmenize izin vermek için her zaman Remote Config gibi bir hizmet kullanabilirsiniz.
Süratli
/// 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() }
Amaç-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) { // ... } }
Şimdi geriye kalan tek şey, bunu seçtiğiniz bir UI bileşenine takmak. Bu davet akışının tam uygulaması için iOS ve Android için GitHub'daki örneklere bakın.
Bunların hepsi, kullanıcılarınızın arkadaşlarına davetiye göndermesini sağlamanın en hafif davet çözümü olan yöntemleridir. Pek çok popüler uygulama ayrıca, bir posta gönderme hizmetinin entegre edilmesini gerektiren, ancak yalnızca birkaç küçük dezavantaj dışında başka türlü sağlanamayan bir dizi avantaj sunan kendi arka uçları aracılığıyla e-postalar göndererek davetiyeler gönderir.
Artıları:
- Göndermeden önce kullanıcınız tarafından değiştirilemeyen karmaşık biçimlendirmeye sahip e-postaları etkinleştirir.
- Daha ayrıntılı izleme/analitik sağlar (yani, arka ucunuzdaki başarıları ve başarısızlıkları gönderin).
Eksileri:
- E-postaların spam olarak işaretlenme olasılığı daha yüksektir
- Bir e-posta teslim hizmetiyle entegrasyon gerektirir
- Uygulama içi kişi izinleri gerektirir
Genel olarak, davetiyeleri kendi e-posta dağıtım hizmetiniz aracılığıyla göndermek, çok yönlülük pahasına daha tutarlı ve potansiyel olarak daha zengin bir davet deneyimi sağlar.
Bağlantılı içeriği uygulamanızda açın
Son olarak, bağlantılı içeriği alıcıya gösterebilmek için uygulamanıza iletilen bağlantıyı almanız gerekir. Dynamic Links SDK'yı kullanmak kolaydır:
iOS
iOS'ta, application:continueUserActivity:restorationHandler:
yöntemini uygulayarak Dinamik Bağlantıyı alırsınız. Geri yükleme işleyicisinde, handleUniversalLink:completion:
çağırarak Dinamik Bağlantıyı alabilirsiniz. Uygulamanıza bir Dinamik Bağlantı aktarıldıysa, bunu FIRDynamicLink
öğesinin url
özelliğinden alabilirsiniz. Örneğin:
Amaç-C
[[FIRDynamicLinks dynamicLinks]
handleUniversalLink:userActivity.webpageURL
completion:^(FIRDynamicLink * _Nullable dynamicLink,
NSError * _Nullable error) {
NSString *link = dynamicLink.url;
BOOL strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong;
// ...
}];
Süratli
FIRDynamicLinks.dynamicLinks()?.handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
let link = dynamicLink.url
let strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong
// ...
}
Ek olarak, uygulamanıza özel şema URL'leri olarak iletilen Dinamik Bağlantıları almak için application:openURL:options:
yönteminde dynamicLinkFromCustomSchemeURL:
: öğesini çağırmalısınız. Örneğin:
Amaç-C
FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
if (dynamicLink) {
NSString *link = dynamicLink.url;
BOOL strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong;
// ...
return YES;
}
Süratli
let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
if let dynamicLink = dynamicLink {
let link = dynamicLink.url
let strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong
// ...
return true
}
Artık link
parametresinin değerine sahip olduğunuza göre, bağlantılı içeriği alıcıya görüntüleyebilir veya parametre tarafından belirtilen verileri başka bir şekilde işleyebilirsiniz. JLRoutes gibi bir URL yönlendirme kitaplığı bu göreve yardımcı olabilir.
Belirli bir alıcıya yönelik bir bağlantı alıyorsanız, herhangi bir kullanıcıya özel mantık çalıştırmadan önce Dinamik Bağlantının eşleşme güveninin strong
olduğundan emin olun.
Android
Android'de, Dynamic Link'ten veri almak için getDynamicLink()
yöntemini kullanırsınız:
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 // ... } } });
Artık link
parametresinin değerine sahip olduğunuza göre, bağlantılı içeriği alıcıya görüntüleyebilir veya parametre tarafından belirtilen verileri başka bir şekilde işleyebilirsiniz. Bir URL yönlendirme kitaplığı bu göreve yardımcı olabilir.