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用法的详解内容,感谢你对毛票票的支持。