Universal Links(一) —— 基本配置和使用示例(一)

版本記錄

版本號 時間
V1.0 2018.08.25

前言

大家一定遇到過很多的情況:比如說點擊一個網頁的webview上的鏈接或者點擊一個備忘錄中的連接,就會直接跳轉到自己的App里面,這其中一個實現方法就是使用:Universal Links。接下來幾篇我們就一起看一下Universal Links的使用。

簡介

寫作環境:Swift 3, iOS 10, Xcode 8。

你有一個與iOS應用共享內容的網站嗎? 從iOS 9開始,您可以使用通用鏈接連接它們,這意味著用戶現在可以觸摸iPhone上的HTTP鏈接并直接發送到您的應用程序!

在本教程中,您將學習如何將iOS應用程序鏈接到Heroku網站。 應用程序和網站都提供單板計算機的參考資料。

本教程假設您對Swift和iOS開發有基本的了解。 如果您不熟悉這些內容,請首先閱讀關于Swift和iOS開發的其他一些教程。 以前使用Heroku和Web開發的經驗將是有益的,但并不是嚴格要求的。

最后,您必須擁有付費Apple開發者帳戶。 不幸的是,免費帳戶將無法使用。

下載我們的示例工程,Build并運行,你會看到主視圖控制器 - ComputersController。

Main View

該應用程序展示了市場上一些最受歡迎的單板計算機。 觸摸其中一行以切換到詳細信息視圖控制器ComputerDetailController。 您可以在此處查看特定于產品的信息,包括網站,供應商和定價。

Navigating the Views

還創建了具有類似信息的基本網站。 在這里查看starter website here

Single Board Computers Website

不要擔心Heroku部分:這只是您訪問演示網站的快速方法。雖然本教程不要求您,但您可以選擇將網站部署到您自己的Heroku帳戶。如果您想這樣做,請按照此處的說明操作。

現在您已經看過應用程序和網站,現在是時候深入了解代碼來連接它們。最終目標:每當用戶點擊iOS設備上的任何網站鏈接時 - 例如 https://rw-universal-links-starter.herokuapp.com/arduino.html - 它將由應用打開,而不是蘋果瀏覽器Safari。作為最后一點,應用程序甚至可以直接導航到特定的計算機細節控制器。

要做到這一點,你需要做三件事:

  • 1)通知網站的應用程序。
  • 2)通知應用程序的網站。
  • 3)無論何時點擊鏈接,都可以在應用內處理導航。

創建通用鏈接有幾個要求。首先,您必須對鏈接網站具有write access,該網站必須使用HTTPS,并且您必須能夠將文件上傳到該網站。其次,您必須擁有關聯的應用程序,因此您可以編輯其配置文件capabilities以注冊網站并能夠將其部署到App Store

由于這些原因,您將無法測試教程應用程序。但是,您仍然會通過這個過程來了解它是如何完成的。


Configuring the App - 配置App

您首先需要配置應用程序以處理通用鏈接。 從Starter文件夾中打開UniversalLinks.xcodeproj并執行以下操作:

  • 1)選擇UniversalLinks項目。
  • 2)選擇UniversalLinks目標。
  • 3)選擇Capabilities選項卡。
  • 4)滾動并啟用Associated Domains。
Turn On Capabilities

您可能會收到Select a Development Team to Use for Provisioning的提示。選擇您所在的任何付費Apple開發人員團隊,然后按Choose繼續。

如果您看到Add an Apple ID Account的提示,則表示您當前未登錄任何帳戶。在這種情況下,請按Add按鈕并登錄您所屬的付費Apple開發人員團隊。

這是一個付費帳戶很重要。當我在測試中嘗試使用免費帳戶時,Xcode一直崩潰,這似乎是一個Xcode錯誤。

您還會看到一條錯誤消息,指出An App ID with identifier ‘com.razeware.UniversalLinks’ is not available。這是因為原始教程應用已經采用了應用標識符。

在您自己的應用中,請確保您的應用標識符是唯一的(遵循反向域名表示法)。但是,對于本教程的應用程序,可以忽略此消息。

接下來,按+并添加以下域:applinks:rw-universal-links-final.herokuapp.com

請務必添加applinks前綴。您現在應該看到以下內容:

Associated Domains

第一步就完成了! 該應用程序現在知道該網站的URL。 接下來,您將配置網站。


Configuring the Website - 配置Website

現在你需要讓網站上的“big secret”。為此,創建一個apple-app-site-association文件。 這個文件對于iOS世界來說并不陌生:它與iOS 8中用于Web credentialsHandoff的文件相同。 格式與JSON文件的格式匹配,但它不能具有.json擴展名。 不應該使用擴展,為了保持調試的健全性,請仔細檢查文件名是否完全匹配!

創建apple-app-site-association文件并添加以下內容:

{
  "applinks": {
    "apps": [],
    "details": [
    {
      "appID": "KFCNEC27GU.com.razeware.UniveralLinksTutorial",
      "paths": ["*"]
    }
    ]
  }
}

applinks標簽確定哪些應用與網站相關聯。 將apps值保留為空數組。 details標記內部是一個字典數組,用于鏈接appIDURL路徑。 為簡單起見,“*”通配符用于將所有此網站的鏈接與UniversalLinks應用相關聯。 此外,路徑值可以限制為特定文件夾或文件名。

appID包含您的team ID以及應用的bundle ID。 上面列出的團隊ID屬于Ray Wenderlich團隊,但您需要為自己的帳戶使用該標識符。

Apple在創建Apple開發人員帳戶時為您分配了一個team ID。 它可以在Apple developer center找到。 登錄網站,單擊Your Account選項卡,然后向下滾動到Developer Account Summary部分。 你會在那里找到你的team ID

Developer Account Summary

您可以通過XcodeTargets \ UniversalLinks \ General標簽找到該應用的bundle ID

現在apple-app-site-association已經完成,是時候將它上傳到Web服務器了。

同樣,您必須對網站具有“write access”才能執行此操作。 為了本教程的目的,您可以參考已完成的網站finished website,該網站已包含此文件。

如果您想確保它在那里,請打開http://rw-universal-links-final.herokuapp.com/apple-app-site-association。 您會看到它與上面顯示的信息相符。

大棒了! 該應用程序了解該網站,該網站了解UniversalLinks應用程序。 現在是最后一步的時候了:添加應用程序邏輯來處理通用鏈接的時候。


Handling Universal Links - 處理通用鏈接

現在應用程序和網站正式相互了知道彼此了,所有應用程序需求都是代碼來處理調用時的鏈接。

打開AppDelegate.swift并添加以下helper方法:

func presentDetailViewController(_ computer: Computer) {
    
  let storyboard = UIStoryboard(name: "Main", bundle: nil)
    
  let detailVC = storyboard.instantiateViewController(withIdentifier: "NavigationController")
      as! ComputerDetailController
  detailVC.item = computer
    
  let navigationVC = storyboard.instantiateViewController(withIdentifier: "DetailController")
      as! UINavigationController
  navigationVC.modalPresentationStyle = .formSheet
    
  navigationVC.pushViewController(detailVC, animated: true)
}

此方法打開ComputerDetailController并顯示Computer參數的信息。 這為您提供了一種導航到特定單板計算機的簡潔方法。 接下來你將使用這種方法。

在上一個方法之后,添加以下代理方法:

func application(_ application: UIApplication,
                   continue userActivity: NSUserActivity,
                                        restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
    
  // 1
  guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
    let url = userActivity.webpageURL,
    let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
      return false
  }
    
  // 2
  if let computer = ItemHandler.sharedInstance.items.filter({ $0.path == components.path}).first {
    self.presentDetailViewController(computer)
    return true
  }
    
  // 3
  let webpageUrl = URL(string: "http://rw-universal-links-final.herokuapp.com")!
  application.openURL(webpageUrl)
    
  return false
}

只要點擊與應用程序相關的通用鏈接(universal link),就會調用此方法。 以下是每個步驟的作用:

  • 1)首先,驗證傳入的userActivity是否具有預期的特征。 最終,您希望獲取活動的path部分。 否則,返回false表示應用程序無法處理活動。
  • 2)使用該path,您將查找與其匹配的已知計算機。 如果找到一個,則為其顯示詳細視圖控制器并返回true。
  • 3)如果找不到與路徑匹配的計算機,則指示應用程序打開URL,該URL將使用默認的系統應用程序 - 很可能是Safari。 您還在此處返回false,表示該應用無法處理用戶活動。

Testing the Links - 測試鏈接

如上所述,沒有很好的方法來測試通用鏈接是否在教程應用程序中工作,但了解在您自己的應用程序中實現通用鏈接時的預期結果非常重要。

如果你已經在自己的應用程序中實現了這一點,你就可以給自己發送一個鏈接(例如https://rw-universal-links-final.herokuapp.com/arduino.html),點擊它,然后驗證顯示正確的頁面。

請記住,也可以從其他位置觸發通用鏈接,例如UIWebViewWKWebView,SFSafariViewControllerNotes或直接在Safari中。

到這里,有關universal link的內容就結束了,

您可以直接從Apple’s documentation中找到其他參考資料。

要在您自己的網站上測試您的通用鏈接的實現,您可以使用此工具this tool或Apple自己的鏈接驗證器Apple’s own link validator,這兩者都可以指出您的設置中可能存在的問題。

后記

本篇主要講述了基本配置和使用示例,感興趣的給個贊或者關注~~~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容