0%

Dynamic Links

Dynamic Links

[TOC]

測試方式

  1. 連結設定完畢後,複製至模擬器safari並點擊
  2. Xcode Run 專案

測試結果

尚未安裝app狀態:

  • 第一次點擊連結後安裝app並開啟 -> 可以偵測 會觸發
    1
    2
    3
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

    }

第一次開啟會使用SchemeUR的方式,因此使用此函式解析(注意解析delegate位置)

1
2
3
4
5
6
7
8
9
10
if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
print("dynamicLink",dynamicLink)
guard let link = dynamicLink.url else {
return true
}

print("deep link: \(link)")
return true
}
return false

第二次開啟:

  • 已點擊過連結,再次點擊連結,並引導開啟app -> 可以偵測 會觸發
    1
    2
    3
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

    }
    第二次以後開啟則會以handleUniversalLink方式,因此使用此函式解析 (注意解析delegate位置)
1
2
3
4
5
6
let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { dynamicLinks, error in
print("userActivity dynamicLinks",dynamicLinks)
print("error",error)
}

return handled

已安裝app狀態:

尚未點過連結,開啟app -> 無法偵測

  • 第一次點擊連結後,連結引導開啟app -> 可以偵測 會觸發
    1
    2
    3
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

    }
  • 已點過連結,先刪除app後,重新安裝並直接開啟app -> 可以偵測 會觸發
    1
    2
    3
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

    }
  • 尚未點過連結,先刪除app後,點擊連結,安裝並開啟app -> 可以偵測 會觸發
    1
    2
    3
    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {

    }
  • 尚未點過連結,先刪除app後,安裝app,點擊連結,並開啟app -> 可以偵測 會觸發
    1
    2
    3
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {

    }

    回傳物件內容

<FIRDynamicLink: 0x600001aa4b40, url [https://swaynfit/welcome], match type: default, minimumAppVersion: N/A, match message: One pre-install link matched for this device.>

結論

由於沒有上架版可以測試點擊連結,導向商店並下載開啟app,但根據模擬器測試結果推測,點擊過連結就會記住,但已安裝與未安裝觸發位置不同。

網路資源:

https://masonchang1991.medium.com/%E4%BD%BF%E7%94%A8-firebase-dynamic-links-%E6%89%BE%E5%88%B0%E4%BD%A0%E7%9A%84%E4%BD%BF%E7%94%A8%E8%80%85%E5%BE%9E%E5%93%AA%E8%A3%A1%E4%B8%8B%E8%BC%89%E4%BD%A0%E7%9A%84-app-eaf44ca89383

補充:

詳細連結

可在Firebase後台最右方點選按鈕,點擊連結詳細資料

詳細連結頁面:

參數說明

參數有以下分類:

  • Deep Link Parameters
  • Android Parameters
  • iOS Parameters
  • Other Platform Parameters
  • Navigation Parameters
  • Social Meta Tag Parameters
  • Analytics Parameters
  • Debug Parameters

此連結提供 App 使用或退到網頁版來,如果無法開啟商店則會開啟此連結的網頁。

亦或是在專案中勾選此設定也會導到該連結

一般來說是 App 的內容或是啟動特定 App 邏輯的 Payload;link 會是格式良好且 URL 編碼過的 URL,可以是 HTTP 或 HTTPS,且不能為另一個 Firebase Dynamic Link。

在桌面裝置的瀏覽器上開啟時,將會開啟這個連結,除非有另外指定 ofl。

Android Parameters

這部分的參數主要是提供給 Android 來使用。

  • apn:用來開啟連結的 Package name,在專案中需要設定並且名稱一致。
  • afl:當 Android App 尚未安裝時所開啟的連結,用來指定一些像是開啟手機版的網頁,或是 App 的促銷頁面,並非用在使用者尚未安裝 App 時,從 Play Store 安裝 App 的用途。
  • amv:App 能夠開啟此連結的最低版本,如果安裝的較舊的版本時,將會導至 Play Store 來升級 App。

iOS Parameters

這部分的參數主要提供給 iOS 和 iPads 。

  • ibi:用來開啟連結的 iOS App Bundle ID,該 App 應該要在 Firebase Console 的 Overview 中與專案連結在一起;對於 Dynamic Link 要開啟 iOS App 來說是必要的。
  • ifl:當 iOS App 尚未安裝時所開啟的連結,用來指定一些像是開啟手機版的網頁,或是開啟 App 的促銷頁面,並非用在使用者尚未安裝 App 時,開啟 App Store 讓使用者安裝 App 的用途。
  • ius:自訂的 URL Schema。
  • ipfl:當 App 尚未安裝時,在 iPads 上所開啟的連結,與 ifl 的用途類似,只是專門用在 iPads 上。
  • ipbi:在 iPads 上用來開啟連結的 App Bundle ID,該 App 必須要在 Firebase Console 的 Overview 頁面中與專案連結在一起。
  • isi:App 的 Apple Store ID,當使用者尚未安裝 App 時用來帶使用者到 App Store。
  • imv:能夠開啟連結的最低 App 版本,當 App 開啟時,這個 flag 會被傳到 App 中,App 中必須決定該如何處理。

Other Parameters

主要為除了 Android 和 iOS 平台外所使用的參數。

  • ofl:除了 Android 和 iOS 平台,其他平台所開啟的連結,這在電腦版中用來指定不同的行為非常好用,像是開啟 App 內容的滿版網頁,或是其他用來安裝 App 的 Dynamic Link Payload。

Navigation 所使用的參數。

  • efr:將 efr 設為 1 開啟 Dynamic Link 時會略過 App 的預覽頁面,直接跳轉到商店或是 App;App 的預覽畫面在使用者開啟 Dynamic Link時,可以更可靠的將使用者帶到更適合的目的地

然而,如果你期望 Dynamic Link 只在 App 中被開啟,在沒有 App 的預覽畫面時會更可靠,因此也可以選擇將 efr 設為 0 來停止它。

Social Meta Tag Parameters

用在社群分享的參數。

  • st:用來當作分享在社群貼文中的標題。
  • sd:用來當作分享在社群貼文中的描述。
  • si:跟這個連結有相關的圖片,圖片至少要 300*200px 且小於 300KB。

Analytics Parameters

用於數據分析的參數。

  • Google Play Analytics Parameters
  • utm_source
  • utm_medium
  • utm_campaign
  • utm_term
  • utm_content
  • gclid
  • iTunes Connect Analytics Parameters
  • at
  • ct
  • mt
  • pt

Debug Parameters

用於偵錯的參數。

  • d :透過將 d 設為 1 進入偵錯模式,將會產生 Dynamic Link 的行為流程圖,而不是載入 Dynamic Link,可以用來預覽 Dynamic Link 在不同平台和配置的行為。

資料來源:https://medium.com/swag/firebase-dynamic-link-%E7%B0%A1%E5%96%AE%E4%BB%8B%E7%B4%B9-fd8259974eec

後台設定

  1. 在Firebase後台點擊Dynamic Links

  2. 點擊開始使用

  3. 設定網址

  4. 點擊新增動態連結

  5. 設定短網址

設定短網址 = 使用者看見的網址

  1. 設定動態連結

    動態連結 = App內能拿到的訊息

  1. 設定未安裝導向商店功能
    選擇要導向的APP

需要在專案中先設定團隊ID與APP商店ID

  1. Android部分同上

  1. 設定行銷用文案與GA分析名詞
    以下皆參照提示文字設定

以上文案會出現於連結,如果發布至Line則顯示:

點擊後會開啟Safari

iOS專案設定

  1. Pod 加入 pod ‘Firebase/DynamicLinks’
    1
    pod ‘Firebase/DynamicLinks’
    終端機:
    1
    pod install

    如果出現警告 None of your spec sources contain a spec satisfying the dependencies: Firebase

1
pod install --repo-update
  1. Project -> Info →新增 URL Types ,在Identifier 欄位輸入Bundle ID,URL Schemes輸入APP 套件名稱

  1. 在Signing & Capabilities 新增 Associated Domains

  1. 輸入applinks: 與後台設定的domain
    (ex:applinks:swaynfit.page.link)

  1. AppDelegate
    1
    import Firebase
  2. 在 didFinishLaunchingWithOptions 加入:
    1
    FirebaseApp.configure()
  3. 加入下列function即可取得連接資訊
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
    return application(app, open: url, sourceApplication: options[.sourceApplication] as? String, annotation: "")
    }

    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    if let dynamicLink = DynamicLinks.dynamicLinks().dynamicLink(fromCustomSchemeURL: url) {
    print("dynamicLink",dynamicLink)
    guard let link = dynamicLink.url else {
    return true
    }

    print("deep link: \(link)")
    return true
    }
    return false
    }
    1
    2
    3
    4
    5
    6
    7
    8
    func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {            
    let handled = DynamicLinks.dynamicLinks().handleUniversalLink(userActivity.webpageURL!) { dynamicLinks, error in
    print("userActivity dynamicLinks",dynamicLinks)
    print("error",error)
    }

    return handled
    }

    自定義網址

    如果不使用firebase提供的page.link則需要再專案plist中新增:

FirebaseDynamicLinksCustomDomains
將網址的domain填入

後台除錯

預覽連結

點擊後會出現此頁面: