资讯专栏INFORMATION COLUMN

iOS Deep Linking 最佳实践

hosition / 2169人阅读

摘要:对此的最佳实践是引入来统一可能存在的所有入口。在字典中列出了所有的模板,以及与之对应的解析函数。最后将返回的字典,即传入对应的解析函数,最终得到返回通过,把一个方式传入的,解析成一个的,使得代码具有了很高的可读性,非常清晰明了。

在 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] = [
  "/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,使得代码具有了很高的可读性,非常清晰明了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16901.html

相关文章

  • LinkedME|移动应用开发者必须知道的Deep Linking技术

    摘要:应用程序的数据请求需要经过权限检测,检测不通过则不执行。在这个节点里,可以自定义协议名称,如,这个形式的就会关联到唯品会客户端。我们正致力于为移动开发者提供稳定安全免费的技术服务,帮助提高用户增长,当拥有拥有流量之后,帮助实现流量变现。 本文作者徐斌,原腾信IOS工程师,现LinkedME高级工程师。 SandBox是什么? SandBox(沙盒)机制规定应用程序只能够读取应用程序内部...

    philadelphia 评论0 收藏0
  • Android移动开发者必须知道的Deep Linking技术

    摘要:概述译深度链接作为移动开发者可能对这个概念有点陌生,但是对于它的实现原理,说出来大家肯定都知道。部分的是必须包含的。但是谷歌在上实现了一个自动认证机制,让开发者可以避开这个弹出框,使用户不必去选择一个列表,直接跳转到他们的。 1.概述 Deep Linking(译:深度链接)作为移动开发者可能对这个概念有点陌生,但是对于它的实现原理,说出来大家肯定都知道。不过我们先说一下Deep Li...

    miguel.jiang 评论0 收藏0
  • fir.im Weekly - 我回来了

    摘要:搜索来自吴发伟则平总结的上有种搜索的方法。,内容可被搜索。上周赞助了主办的,聚集了多位海内外著名的移动无线测试专家,特此整理此次移动测试大会最精华的讲义,已经上传至百度云,点击这里,轻松获得。好了这期的就到这里,祝大家周末愉快 Hey: 大家好,距离 fir.im 新版上线已匆忙过去一周多的时间,新版的fir正在慢慢稳定优化中,感谢大家的反馈与支持!后续我们将上线 FAQ 帮助中心,...

    2i18ns 评论0 收藏0
  • 超过 150 个最佳机器学习,NLP 和 Python教程

    摘要:作者微信号微信公众号简书地址我把这篇文章分为四个部分机器学习,,和数学。在这篇文章中,我把每个主题的教程数量都是控制在五到六个,这些精选出来的教程都是非常重要的。每一个链接都会链接到别的链接,从而导致很多新的教程。 作者:chen_h微信号 & QQ:862251340微信公众号:coderpai简书地址:http://www.jianshu.com/p/2be3... showIm...

    JayChen 评论0 收藏0
  • 2018年最佳深度学习书单

    摘要:所以,如果你想成为这场革命的一部分,现在无疑是最佳的时间进入深度学习领域了。深度学习深度学习,可能是本文中最全面的书。这本书被许多人认为是深度学习的圣经,因为它汇集了数年和数年在一本书中学习和专注的研究。 摘要: AI人才缺口巨大?如果你想成为AI革命中的一员,那么你就必须要学习深度学习,看看这12本书,它们将成为你的利器! showImg(https://segmentfault.c...

    abson 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<