ios中Deep Linking实例分析用法
在iOS中,deeplinking实际上包括URLScheme、UniversalLink、notification或者3DTouch等URL跳转方式。应用场景比如常见的通知,社交分享,支付,或者在webView中点击特定链接在app中打开并跳转到对应的原生页面。
用的最多也是最常用的是通过CustomURLScheme来实现deeplinking。在application:openURL:sourceApplication:annotation或者iOS9之后引入的application:openURL:options中,通过对URL进行处理来执行相应的业务逻辑。一般地简单地通过字符串比较就可以了。但如果URL跳转的对应场景比较多,开发维护起来就不那么简单了。对此的最佳实践是引入router来统一可能存在的所有入口。
这里介绍的一种使用router来组织入口的方法是来自与kickstarter-ios这个开源项目,是纯swift开发的,而且在talk.objc.io上有开发者的视频分享。
在工程,通过定于Navigationenum,把所有支持通过URL跳转的entrypoint都定义成一个case。
publicenumNavigation{ casecheckout(Int,Navigation.Checkout) casemessages(messageThreadId:Int) casetab(Tab) ... }
在allRoutes字典中列出了所有的URL模板,以及与之对应的解析函数。
privateletallRoutes:[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返回
publicstaticfuncmatch(_url:URL)->Navigation?{ returnallRoutes.reduce(nil){accum,templateAndRoutein let(template,route)=templateAndRoute returnaccum??parsedParams(url:url,fromTemplate:template).flatMap(route)?.value } }
privatefuncparsedParams(url:URL,fromTemplatetemplate:String)->RouteParams?{ ... lettemplateComponents=template .components(separatedBy:"/") .filter{$0!=""} leturlComponents=url .path .components(separatedBy:"/") .filter{$0!=""&&!$0.hasPrefix("?")} guardtemplateComponents.count==urlComponents.countelse{returnnil} varparams:[String:String]=[:] for(templateComponent,urlComponent)inzip(templateComponents,urlComponents){ iftemplateComponent.hasPrefix(":"){ //matchedatoken letparamName=String(templateComponent.characters.dropFirst()) params[paramName]=urlComponent }elseiftemplateComponent!=urlComponent{ returnnil } } URLComponents(url:url,resolvingAgainstBaseURL:false)? .queryItems? .forEach{itemin params[item.name]=item.value } varobject:[String:RouteParams]=[:] params.forEach{key,valuein object[key]=.string(value) } return.object(object) }
通过Navigationenum,把一个deeplink方式传入的URL,解析成一个Navigation的case,使得代码具有了很高的可读性,非常清晰明了。
以上就是小编整理的关于DeepLinking用法的详解内容,感谢你对毛票票的支持。