SHNUrlRouter 2.0.0

SHNUrlRouter 2.0.0

测试已测试
语言语言 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)
}

路由别名

在上面的代码中,我们使用了 idsection 参数,然而目前它们是完全不受限制的,任何路径段都会匹配。您可以使用路由别名来指定参数必须匹配的正则表达式模式

// 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 文件。