這篇文章將為大家詳細講解有關ios中Deep Linking怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
成都創新互聯堅持“要么做到,要么別承諾”的工作理念,服務領域包括:成都網站建設、成都網站設計、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的寶雞網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!在 iOS 中,deep linking 實際上包括 URL Scheme、Universal Link、notification 或者 3D Touch 等 URL 跳轉方式。應用場景比如常見的通知,社交分享,支付,或者在 webView 中點擊特定鏈接在 app 中打開并跳轉到對應的原生頁面。
用的最多也是最常用的是通過 Custom URL Scheme 來實現 deep linking。在 application:openURL:sourceApplication:annotation 或者 iOS9 之后引入的 application:openURL:options 中,通過對 URL 進行處理來執行相應的業務邏輯。一般地簡單地通過字符串比較就可以了。但如果 URL 跳轉的對應場景比較多,開發維護起來就不那么簡單了。對此的最佳實踐是引入 router 來統一可能存在的所有入口。
這里介紹的一種使用 router 來組織入口的方法是來自與 kickstarter-ios 這個開源項目,是純 swift 開發的,而且在 talk.objc.io 上有開發者的視頻分享。
在工程,通過定于 Navigation enum,把所有支持通過 URL 跳轉的 entry point 都定義成一個 case。
public enum Navigation { case checkout(Int, Navigation.Checkout) case messages(messageThreadId: Int) case tab(Tab) ... }
在 allRoutes 字典中列出了所有的 URL 模板,以及與之對應的解析函數。
private let allRoutes: [String: (RouteParams) -> Decode<Navigation>] = [ "/mpss/:a/:b/:c/:d/:e/:f/:g": emailLink, "/checkouts/:checkout_param/payments": paymentsRoot, "/discover/categories/:category_id": discovery, "/projects/:creator_param/:project_param/comments": projectComments, ... ]
在 match(_ url: URL) -> Navigation 函數中通過遍歷 allRoutes,去匹配傳入的 url。具體過程是:在 match 函數內,調用 parsedParams(_ url: URL, fromTemplate: template: String) -> [String: RouteParams] 函數,將分割后 template 字符串作 key,取出 url 中的對應的 value,并組裝成 [String: RouteParams] 字典返回。最后將返回的字典 flatmap(route),即傳入對應的解析函數,最終得到 Navigation 返回
public static func match(_ url: URL) -> Navigation? { return allRoutes.reduce(nil) { accum, templateAndRoute in let (template, route) = templateAndRoute return accum ?? parsedParams(url: url, fromTemplate: template).flatMap(route)?.value } }
private func parsedParams(url: URL, fromTemplate template: String) -> RouteParams? { ... let templateComponents = template .components(separatedBy: "/") .filter { $0 != "" } let urlComponents = url .path .components(separatedBy: "/") .filter { $0 != "" && !$0.hasPrefix("?") } guard templateComponents.count == urlComponents.count else { return nil } var params: [String: String] = [:] for (templateComponent, urlComponent) in zip(templateComponents, urlComponents) { if templateComponent.hasPrefix(":") { // matched a token let paramName = String(templateComponent.characters.dropFirst()) params[paramName] = urlComponent } else if templateComponent != urlComponent { return nil } } URLComponents(url: url, resolvingAgainstBaseURL: false)? .queryItems? .forEach { item in params[item.name] = item.value } var object: [String: RouteParams] = [:] params.forEach { key, value in object[key] = .string(value) } return .object(object) }
通過 Navigation enum,把一個 deep link 方式傳入的 URL,解析成一個 Navigation 的 case,使得代碼具有了很高的可讀性,非常清晰明了。
關于“ios中Deep Linking怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
另外有需要云服務器可以了解下創新互聯建站vcdvsql.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
標題名稱:ios中DeepLinking怎么用-創新互聯
分享URL:http://vcdvsql.cn/article8/ddhiop.html
成都網站建設公司_創新互聯,為您提供軟件開發、用戶體驗、網站收錄、企業網站制作、電子商務、App開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯