Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Dapatkan pengguna baru untuk aplikasi Anda dengan memungkinkan pengguna berbagi konten aplikasi Anda

Salah satu cara paling efektif untuk membuat pengguna baru menginstal aplikasi Anda adalah dengan memungkinkan pengguna Anda berbagi konten dari aplikasi Anda dengan teman-teman mereka. Dengan Dynamic Links, Anda dapat menciptakan pengalaman berbagi pengguna-ke-pengguna yang luar biasa: pengguna yang menerima rekomendasi konten dari teman mereka dapat mengeklik tautan dan diarahkan langsung ke konten yang dibagikan di aplikasi Anda, meskipun mereka harus membuka Aplikasi Store atau Google Play Store untuk menginstal aplikasi Anda terlebih dahulu.

Dengan menggabungkan kelengketan rujukan pengguna dan kegigihan Dynamic Links, Anda dapat membuat fitur berbagi dan rujukan pengguna-ke-pengguna yang mendatangkan pengguna baru dengan menarik mereka langsung ke konten aplikasi Anda atau menyajikan promosi yang saling menguntungkan perujuk dan yang dirujuk .

Kunci Keuntungan

  • Pengguna baru yang membuka aplikasi Anda untuk pertama kalinya mendapatkan pengalaman pertama yang disesuaikan yang dikontekstualisasikan berdasarkan apa yang ingin dibagikan teman mereka dengan mereka. Misalnya, Anda dapat menampilkan konten yang dibagikan dengan mereka, atau secara otomatis menghubungkan mereka dengan teman yang mengundang mereka.
  • Memudahkan pengguna untuk berbagi konten dengan teman-teman mereka di seluruh platform terlepas dari apakah teman mereka telah menginstal aplikasi Anda atau tidak.

Berikut cara memulainya!

Siapkan proyek Firebase baru dan instal Dynamic Links SDK ke dalam aplikasi Anda.

Menginstal Dynamic Links SDK memungkinkan Firebase meneruskan data tentang Dynamic Link ke aplikasi, termasuk setelah pengguna menginstal aplikasi.

Sekarang saatnya mengatur tautan yang dapat dikirim pengguna ke teman mereka. Jangan khawatir jika teman pengguna Anda belum menginstal aplikasi; Dynamic Links dapat menanganinya untuk Anda.

Untuk setiap elemen konten yang ingin Anda bagikan, buat Dynamic Link .

Saat membuat Tautan Dinamis, Anda harus memberikan URL HTTP atau HTTPS sebagai parameter link yang akan digunakan untuk mengidentifikasi konten yang Anda bagikan. Jika Anda memiliki situs web dengan konten yang setara, Anda harus menggunakan URL situs web Anda. Ini akan memastikan bahwa tautan ini dirender dengan benar pada platform yang tidak mendukung Tautan Dinamis, seperti browser desktop. Misalnya:

https://example.page.link/?link=https://www.example.com/content?item%3D1234&apn=com.example.android&ibi=com.example.ios&isi=12345

Anda juga dapat menambahkan info tambahan ke payload data dengan menambahkan parameter yang disandikan URL—misalnya, untuk menunjukkan bahwa tautan ditujukan untuk pengguna tertentu, seperti dalam undangan game.

https://example.page.link/?link=https://www.example.com/invitation?gameid%3D1234%26referrer%3D555&apn=com.example.android&ibi=com.example.ios&isi=12345

Sebelum membagikan tautan ini, Anda mungkin ingin menggunakan API penyingkat URL Firebase Dynamic Links untuk menghasilkan URL yang terlihat lebih ramah. Tautan Dinamis pendek terlihat seperti contoh berikut:

https://example.page.link/WXYZ

Tautan mana pun yang Anda gunakan, saat pengguna membuka Dynamic Link di perangkat mereka, aplikasi yang ditentukan oleh parameter apn (di Android) atau parameter ibi dan isi (di iOS) akan membawa pengguna ke Play Store atau App Store untuk menginstal aplikasi jika belum terpasang. Kemudian, saat aplikasi dipasang dan dibuka, URL yang ditentukan dalam parameter 'tautan' akan diteruskan ke aplikasi.

Pertama, lihat contoh sederhana dari aplikasi obrolan berbasis ruang seperti Hangouts yang menghasilkan tautan untuk mengundang orang ke ruang obrolan.

iOS

chat app screenshotchat app screenshot with share sheet

Android

chat app screenshotchat app screenshot with share sheet

Cepat

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
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

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
- (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
}

Setelah Anda memiliki tautan dinamis, Anda dapat menambahkan tombol bagikan ke UI Anda yang akan meluncurkan alur berbagi platform standar:

Cepat

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
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

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
- (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"))
}

Dalam contoh ini, UI berbagi default secara otomatis menampilkan daftar aplikasi untuk berbagi tautan, jadi ini adalah sesuatu yang dapat Anda atur di aplikasi Anda sendiri hanya dengan beberapa baris kode.

Daripada meminta pengguna memilih kontak dan menulis pesan di aplikasi Anda, tindakan ini didelegasikan ke aplikasi yang mereka pilih dari dialog berbagi. Selain itu, mendelegasikan berbagi ke aplikasi lain berarti Anda tidak perlu meminta izin kontak kepada pengguna dan memungkinkan pengguna untuk memilih dari daftar kontak yang diperluas dalam aplikasi pilihan mereka. Untuk memfasilitasi berbagi sosial dengan lebih baik, Anda dapat menambahkan metadata pratinjau media sosial ke tautan dinamis Anda yang akan ditampilkan bersama dengan tautan di saluran sosial utama.

Namun, terkadang, mengirim tautan kosong tanpa teks saja tidak cukup untuk rujukan yang menarik. Dengan menyertai tautan dengan pesan singkat dan, jika mungkin, presentasi yang lebih kaya, pengguna dapat memahami proposisi nilai rujukan saat mereka menerimanya:

iOS

rewarded referral screenshotrewarded referral screenshot with share sheet

Android

rewarded referral screenshotrewarded referral screenshot with share sheet

Meskipun ini lebih kompleks daripada contoh terakhir, pendekatannya akan kurang lebih sama. Di layar ini ada grafik besar dengan proposisi nilai undangan dan tombol untuk berbagi ke saluran sosial utama. Ada beberapa redundansi dalam alur UI ini—beberapa saluran berbagi disajikan satu per satu untuk memungkinkan penyesuaian pesan khusus saluran, seperti menambahkan baris subjek ke undangan email. Dalam menu undangan ini, kami:

  • Sajikan email, pesan teks, dan salin tombol bagikan tautan, dan sesuaikan pesan mereka dengan tepat. Email akan menyertakan subjek dan dapat menyertakan isi yang lebih panjang dengan jeda baris, gambar, dan spasi; teks harus menyertakan badan yang lebih pendek dengan jeda baris tetapi sedikit spasi dan tanpa gambar; dan penyalinan tautan seharusnya hanya menyalin tautan dan tidak ada yang lain.
  • Gunakan UI berbagi sistem untuk yang lainnya, termasuk pesan undangan singkat untuk menyertai tautan.
  • Tautan dalam melalui skema URL atau tautan universal ke aplikasi lain yang memiliki logika khusus untuk menangani undangan aplikasi Anda. Ini tidak akan berfungsi di luar kemitraan antara organisasi Anda dan aplikasi lain, dan kemungkinan bukan opsi untuk organisasi yang lebih kecil. Karena itu, beberapa aplikasi mungkin secara publik mendokumentasikan perilaku tautan dalam/universal mereka. Kami akan menerapkan versi dummy ini dalam sampel kami.

Pertama, tentukan jenis konten undangan, yang hanya merangkum informasi dalam undangan dan tidak berisi fungsionalitas. Dengan cara ini, Anda dapat mulai dengan tipe data dan memikirkan kode Anda dalam kaitannya dengan cara menyatukan data tersebut.

Cepat

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
/// 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

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
/// 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
)

Satu-satunya data yang diperlukan di sini adalah URL, yang tanpanya Anda tidak dapat mengundang pengguna ke aplikasi Anda. Potongan data lainnya terstruktur dengan jelas untuk mengirim email, yang membuatnya sedikit canggung dalam beberapa kasus lain--saat mengirim undangan melalui teks, uraian yang menyertai tautan mungkin terbaca mirip dengan subjek email, tetapi ketika berbagi ke media sosial link teks yang menyertainya mungkin lebih seperti badan email. Anda harus bereksperimen dengan ini sendiri untuk menemukan keseimbangan terbaik untuk aplikasi Anda, dan jika Anda tidak yakin, Anda selalu dapat menggunakan layanan seperti Remote Config untuk memungkinkan Anda mengubah nilai teks setelah peluncuran aplikasi.

Cepat

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
/// 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

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
/// 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) {
        // ...
    }
}

Sekarang yang tersisa hanyalah menyambungkan ini ke komponen UI pilihan Anda. Untuk implementasi penuh alur undangan ini, lihat contoh di GitHub untuk iOS dan Android .

Ini semua adalah metode untuk memungkinkan pengguna Anda mengirim undangan ke teman mereka, yang merupakan solusi undangan paling ringan. Banyak aplikasi populer juga mengirimkan undangan dengan mengirim email melalui backend mereka sendiri, yang memerlukan integrasi layanan pengiriman email, tetapi menawarkan sejumlah manfaat yang tidak tersedia dengan hanya beberapa kelemahan kecil.

Kelebihan:

  • Mengaktifkan email dengan markup kompleks yang tidak dapat diubah oleh pengguna Anda sebelum dikirim.
  • Memungkinkan pelacakan/analitik yang lebih terperinci (yaitu, keberhasilan dan kegagalan pengiriman di backend Anda).

Kontra:

  • Email lebih mungkin ditandai sebagai spam
  • Memerlukan integrasi dengan layanan pengiriman email
  • Memerlukan izin kontak dalam aplikasi

Umumnya, mengirim undangan melalui layanan pengiriman email Anda sendiri memberikan pengalaman undangan yang lebih konsisten dan berpotensi lebih kaya dengan mengorbankan keserbagunaan.

Buka konten tertaut di aplikasi Anda

Terakhir, Anda perlu menerima tautan yang diteruskan ke aplikasi Anda sehingga Anda dapat menampilkan konten tertaut ke penerima. Ini mudah menggunakan Dynamic Links SDK:

iOS

Di iOS, Anda menerima Tautan Dinamis dengan menerapkan metode application:continueUserActivity:restorationHandler: Di penangan restorasi, Anda bisa mendapatkan Tautan Dinamis dengan memanggil handleUniversalLink:completion: . Jika Dynamic Link diteruskan ke aplikasi Anda, Anda bisa mendapatkannya dari properti url FIRDynamicLink . Sebagai contoh:

Objective-C

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
[[FIRDynamicLinks dynamicLinks]
    handleUniversalLink:userActivity.webpageURL
             completion:^(FIRDynamicLink * _Nullable dynamicLink,
                          NSError * _Nullable error) {
      NSString *link = dynamicLink.url;
      BOOL strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong;
      // ...
    }];

Cepat

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
FIRDynamicLinks.dynamicLinks()?.handleUniversalLink(userActivity.webpageURL!) { (dynamiclink, error) in
    let link = dynamicLink.url
    let strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong
    // ...
}

Selain itu, Anda harus memanggil dynamicLinkFromCustomSchemeURL: dalam metode application:openURL:options: untuk menerima Dynamic Links yang diteruskan ke aplikasi Anda sebagai URL skema khusus. Sebagai contoh:

Objective-C

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
FIRDynamicLink *dynamicLink = [[FIRDynamicLinks dynamicLinks] dynamicLinkFromCustomSchemeURL:url];
if (dynamicLink) {
  NSString *link = dynamicLink.url;
  BOOL strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong;
  // ...
  return YES;
}

Cepat

Catatan: Produk Firebase ini tidak tersedia di target macOS, Mac Catalyst, tvOS, atau watchOS.
let dynamicLink = FIRDynamicLinks.dynamicLinks()?.dynamicLinkFromCustomSchemeURL(url)
if let dynamicLink = dynamicLink {
  let link = dynamicLink.url
  let strongMatch = dynamicLink.matchConfidence == FIRDynamicLinkMatchConfidenceStrong
  // ...
  return true
}

Sekarang setelah Anda memiliki nilai parameter link , Anda dapat menampilkan konten tertaut ke penerima, atau memproses data yang ditentukan oleh parameter dengan cara lain. Pustaka perutean URL seperti JLRoutes dapat membantu tugas ini.

Jika Anda menerima tautan yang ditujukan untuk penerima tertentu, pastikan kepercayaan kecocokan Tautan Dinamis strong sebelum menjalankan logika khusus pengguna apa pun.

Android

Di Android, Anda menggunakan metode getDynamicLink() untuk mendapatkan data dari Dynamic Link:

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
                // ...
            }
        }

Sekarang setelah Anda memiliki nilai parameter link , Anda dapat menampilkan konten tertaut ke penerima, atau memproses data yang ditentukan oleh parameter dengan cara lain. Pustaka perutean URL dapat membantu tugas ini.