测试已测试 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2018年2月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✗ |
由 Shaun Harrison 维护。
基于 Laravel 的 Router 的 Swift 简单路由器,虽然它缺乏 Laravel 的如分组等高级特性。
将此仓库中的 *.swift
文件拖入您的项目中。
设置路由非常简单,只需定义一些路由并提供在分发时被触发的处理器。
let router = UrlRouter()
router.register("feed") { [weak self] (parameters) in
self?.tabBarController.selectedIndex = 0
}
这将创建一个路由器并注册一个处理器,当分发 feed URL 时将切换到第一个标签。
您可以使用路由参数来支持更高级的路由
router.register("user/{id}/{section?}") { [weak self] (parameters) in
// Non-optional parameters are guaranteed to be in the parameters
// dictionary, or the route won’t dispatch, so you can skip the
// usual guard let block if you’d like
let id = parameters["id"]!
let viewController = UserViewController(identifier: id)
// Optional parameters are not guaranteed, so you should handle
// their presence conditionally
if let section = parameters["section"] {
viewController.section = section
}
self?.tabBarController.presentViewController(viewController, animated: true, completion: nil)
}
在上面的代码中,我们使用了 id
和 section
参数,然而目前它们是完全不受限制的,任何路径段都会匹配。您可以使用路由别名来指定参数必须匹配的正则表达式模式
// If your user IDs are numeric, you can use a numeric pattern to ensure you’ll always
// get a numeric id, otherwise the route won’t be dispatch
router.add("id", pattern: "[0-9]+")
// Similarly, if you want to ensure only specific sections dispatch, you can do that too
router.add("section", pattern: "profile|activity")
分发路由非常简单,只需将 URL 传递给路由器。
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
return self.router.dispatch(url)
}
SHNUrlRouter 是为了支持全 http://
链接而构建的,专注于 iOS 9 和深链接应用。这意味着路由是基于 URL 的路径部分进行匹配,而不仅仅是其他部分。
在 iOS 9 之前,应用通常使用类似 myapp://profile
的 URL 格式。由于该路由的 host
值被设置为 "profile" 而不是 path
值,因此它不会与路由一起使用。
如果您的应用使用类似的 URL 格式,您可以在准备采用完整的 http 链接之前,使用以下简单的/粗略的解决方案。
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
if url.scheme == "myapp" {
if let url = url.absoluteString?.stringByReplacingOccurrencesOfString("://", withString: "://host/") {
return self.router.dispatch(url)
}
}
return false
}
class AppDelegate: UIResponder, UIApplicationDelegate {
private let router = UrlRouter()
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject:AnyObject]?) -> Bool {
self.router.add("id", pattern: "[0-9]+")
self.router.add("section", pattern: "profile|activity")
self.router.register("feed") { [weak self] (parameters) in
self?.tabBarController.selectedIndex = 0
}
self.router.register("user/{id}/{section?}") { [weak self] (parameters) in
guard let stringId = parameters["id"], let id = Int(stringId) else {
return
}
let viewController = UserViewController(identifier: id)
if let section = parameters["section"] {
viewController.section = section
}
self?.tabBarController.presentViewController(viewController, animated: true, completion: nil)
}
}
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
return self.router.dispatch(url)
}
}
MIT -- 更多信息请参阅 LICENSE 文件。