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ına olanak tanımaktır. Dynamic Links ile harika bir kullanıcıdan kullanıcıya paylaşım deneyimi yaratabilirsiniz: 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önlendirilebilirler. Önce uygulamanızı yüklemek için Store veya Google Play Store.
Kullanıcı yönlendirmelerinin yapışkanlığını ve Dinamik Bağlantıların kalıcılığını birleştirerek, yeni kullanıcıları doğrudan uygulamanızın içeriğine çekerek veya yönlendiren ve yönlendirilenlere karşılıklı yarar sağlayan promosyonlar sunarak kullanıcıdan kullanıcıya paylaşım ve yönlendirme özellikleri oluşturabilirsiniz. .
Temel faydalar
- 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ı davet eden arkadaşınıza otomatik olarak bağlayabilirsiniz.
- Kullanıcıların, uygulamanız yüklü olsun ya da olmasın, kullanıcıların platformlar arasında arkadaşlarıyla içerik paylaşmasını kolaylaştırır.
İşte nasıl başlayacağınız!
Firebase ve Dynamic Links SDK'sını kurun
Yeni bir Firebase projesi oluşturun ve Dynamic Links SDK'sını uygulamanıza yükleyin.
Dynamic Links SDK'sının yüklenmesi, Firebase'in, kullanıcı 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ı uygulamayı henüz yüklemediyse endişelenmeyin; Dinamik Bağlantılar bunu sizin için 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, örneğin bir masaüstü tarayıcısı gibi Dinamik Bağlantıları desteklemeyen bir platformda doğru bir ş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 bir oyun davetiyesinde olduğu gibi belirli bir kullanıcıya yönelik olduğunu belirtmek için.
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ığında, apn
parametresi (Android'de) veya ibi
ve isi
parametreleri (iOS'ta) tarafından belirtilen uygulama, kullanıcıları uygulamayı yüklemeleri için Play Store'a veya App Store'a götürür. zaten yüklü 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
İlk olarak, insanları sohbet odalarına davet etmek için bağlantılar oluşturan Hangouts gibi oda tabanlı bir sohbet uygulamasının bu basit örneğine bir göz atı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; }
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 }
Dinamik bir bağlantınız olduğunda, kullanıcı arayüzünüze 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]; }
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")) }
Bu örnekte, varsayılan paylaşım kullanıcı arabirimi, bağlantıyı paylaşmak için otomatik olarak bir uygulama listesi sunar; bu nedenle, yalnızca birkaç satır kodla kendi uygulamanızda ayarlayabileceğiniz bir şeydir.
Kullanıcının uygulamanızda kişileri seçmesini ve mesajı oluşturmasını sağlamak yerine, bu eylemler, paylaşım iletişim kutusundan seçtikleri uygulamaya atanır. Ek olarak, paylaşımı diğer uygulamalara devretmek, kullanıcıdan kişi izinleri istemeniz gerekmediği anlamına gelir ve kullanıcıların seçtikleri uygulamada genişletilmiş bir kişi listesinden seçim yapmasına olanak tanır. Sosyal paylaşımı daha iyi kolaylaştırmak için, ana sosyal kanallarda bağlantıyla birlikte görüntülenecek olan dinamik bağlantınıza sosyal medya önizleme meta verilerini ekleyebilirsiniz .
Ancak bazen, yalnızca metin içermeyen bir bağlantı göndermek, zorlayıcı bir yönlendirme için yeterli değildir. Bağlantıya kısa bir mesaj ve mümkünse daha zengin bir sunum ekleyerek, kullanıcılar tavsiyeyi aldıklarında tavsiyenin 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 önerisini ve büyük sosyal kanallarla paylaşmak için düğmeleri içeren büyük bir grafik var. Bu kullanıcı arayüzü akışında bir miktar fazlalık vardır; bazı paylaşım kanalları, e-posta davetlerine konu satırı eklemek gibi daha kanala özel mesaj özelleştirmesine izin vermek için ayrı ayrı sunulur. Bu davet menüsünde biz:
- E-posta, metin mesajı ve kopya bağlantı paylaşma 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 bulunan ve resim içermeyen daha kısa bir gövde içermelidir; ve bağlantı kopyalama, yalnızca bağlantıyı kopyalamalı ve 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.
- URL şeması aracılığıyla derin bağlantı veya uygulamanızın davetlerini işlemek için özel mantığı olan başka bir uygulamaya evrensel bağlantı. Bu, kuruluşunuz ve diğer uygulama arasındaki ortaklık 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 kukla bir versiyonunu 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 kodunuzun bu verileri nasıl bir araya getirdiğini 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
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 )
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 olarak 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
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) { // ... } }
Şimdi geriye kalan tek şey, bunu seçtiğiniz bir UI bileşenine eklemek. Bu davet akışının tam olarak uygulanması için iOS ve Android için GitHub'daki örneklere bakın.
Bunların tümü, kullanıcılarınızın arkadaşlarına davetiye göndermelerini sağlayan yöntemlerdir ki bu en hafif davet çözümüdür. Pek çok popüler uygulama, bir posta gönderme hizmetinin entegre edilmesini gerektiren, ancak yalnızca birkaç küçük dezavantajla birlikte sunulmayan bir dizi avantaj sunan kendi arka uçları aracılığıyla e-posta göndererek de davetiyeler gönderir.
Artıları:
- Göndermeden önce kullanıcı 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 hataları gönderin).
Eksileri:
- E-postaların spam olarak işaretlenme olasılığı daha yüksek
- Bir e-posta dağıtım hizmetiyle entegrasyon gerektirir
- Uygulama içi kişi izinleri gerektirir
Genel olarak, davetleri 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.
Uygulamanızda bağlantılı içeriği açın
Son olarak, bağlantılı içeriği alıcıya gösterebilmeniz için uygulamanıza iletilen bağlantıyı almanız gerekir. Dynamic Links SDK'sını 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:
arayarak Dinamik Bağlantıyı alabilirsiniz. Uygulamanıza bir Dinamik Bağlantı aktarıldıysa, bunu FIRDynamicLink
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
// ...
}
Ayrıca, uygulamanıza özel şema URL'leri olarak geçirilen Dinamik Bağlantıları almak için application:openURL:options:
yönteminde dynamicLinkFromCustomSchemeURL:
ç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, kullanıcıya özel herhangi bir mantığı çalıştırmadan önce Dinamik Bağlantının eşleşme güveninin strong
olduğundan emin olun.
Android
Android'de, Dinamik Bağlantıdan veri almak için getDynamicLink()
yöntemini kullanırsınız:
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 // ... } }
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.