BKRouter
BKRouter 是 iOS 上 UIViewControllers 的导航器。它通过 URL 字符串导航 UIViewControllers。
安装
您可以通过 Cocoapod 安装 BKRouter。
pod 'BKRouter'
如何使用它?
您应创建一个路由图并将其注册到 Router。路由图是 Routerable 协议的实现。例如,ColorViewController 的路由图如下
import UIKit
import BKRouter
class RouteColor: Routerable {
static func route(scheme: String, host: String, params: [String : String], userData:[String: Any]?) -> UIViewController? {
// storyboard
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ColorViewController")
if let colorVC = vc as? ColorViewController {
if let color = params["color"] {
switch color {
case "red":
colorVC.color = UIColor.red
case "blue":
colorVC.color = UIColor.blue
case "green":
colorVC.color = UIColor.green
default:
colorVC.color = UIColor.white
}
}
}
return vc
}
}
如果您使用的主机为 "myapp",可以将 "myapp://color" 映射为 RouteColor,如下所示
Router.shared.map(url: "myapp://color?color=$value", to: RouteColor.self)
在上面的代码中,$value 是通过 URL 字符串传递的值。如果您有更复杂的数据,可以在使用 Router 进行路由时使用 userData
Router.shared.push(from: self, to: "myapp://color?color=red", userData: ["A": 1])
您可以将您的应用模块化为框架片段。如果 DomainA 框架有很多场景作为 UIViewController,您可以定义一个用于路由 DomainA 的路由。
import Foundation
import BKRouter
public class RouteDomainA: Routerable {
public static func route(scheme: String, host: String, params: [String : String], userData:[String: Any]?) -> UIViewController? {
// storyboard
guard let items = userData?["items"] as? [String] else { return nil }
let viewModel = DomainAViewModel(havyItemArray: items)
let vc = DomainAViewController(viewModel: viewModel)
return vc
}
}
当然,您应该像以下那样将上述 RouteDomainA 注册到 Router
Router.shared.map(url: "myapp://domainA", to: RouteDomainA.self)
将路由注册到 Router
您应将路由图注册到 Router。AppDelegate 是一个很好的地方。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
Router.shared.map(url: "myapp://main?title=$value&a=$v1&b=v2", to: RouteMain.self)
Router.shared.map(url: "myapp://color?color=$value", to: RouteColor.self)
Router.shared.map(url: "myapp://domainA", to: RouteDomainA.self)
Router.shared.map(url: "myapp://domainB?title=$value", to: RouteDomainB.self)
return true
}
路由化
您可以使用Router对UIViewControllers进行路由化。
@IBAction func clickedRedButton(_ sender: Any) {
Router.shared.push(from: self, to: "myapp://color?color=red", userData: ["A": 1])
}
@IBAction func clickedGreenButton(_ sender: Any) {
Router.shared.push(from: self, to: "myapp://color?color=green")
}
@IBAction func clickedBlueButton(_ sender: Any) {
Router.shared.push(from: self, to: "myapp://color?color=blue")
}
@IBAction func clickedNextButton(_ sender: Any) {
Router.shared.push(from: self, to: "myapp://domainB?title=Hello")
}
@IBAction func clickedNextButton(_ sender: Any) {
let items = [
"Lorem Ipsum is simply dummy text of the printing and typesetting industry.",
"Lorem Ipsum has been the industry's standard dummy text ever since the 1500s,",
"when an unknown printer took a galley of type and scrambled it to make a type specimen book.",
"It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.",
"It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages,",
"and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
]
Router.shared.push(from: self, to: "myapp://domainA", userData: ["items": items])
}
处理深链接
您还可以使用Router来处理深链接。首先,您需要为您深链接注册URLType方案。
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.github.skyfe79.bkrouter</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
您可以按照以下方式进行深链接处理
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
Router.shared.replace(to: url.absoluteString, wrapNavigationController: true)
return true
}
在iOS模拟器中测试深链接
您可以使用iOS模拟器从您的终端测试深链接。
- 运行上述示例应用。
- 打开终端。
- 输入以下命令。
xcrun simctl openurl booted 'myapp://main'
xcrun simctl openurl booted 'myapp://domainB?title=HELLO'
xcrun simctl openurl booted 'myapp://color?color=red'
xcrun simctl openurl booted 'myapp://domainB?title=%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94'
...
MIT许可证
MIT许可证
版权所有 (c) 2018 Sungcheol Kim, https://github.com/ReactComponentKit/BKRouter
在此特此授予任何人无条件的、免费的、不可撤销的使用许可,任何人得到本软件及其相关的文档文件(以下简称“软件”)的副本,不管任何条件,包括但不仅限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本,并且允许向提供软件的个人或实体进行上述操作,前提是以下条件
上述版权声明和本许可声明应包含在软件的任何副本或主要部分中。
软件按原样提供,没有任何形式的明示或暗示保证,包括但不限于商品性、针对特定目的的适用性和非侵权性。在任何情况下,作者或版权持有者不对因使用软件或与其使用相关的软件或使用软件中的错误而引起的任何要求、损害或其他责任负责,不论是由于合同、侵权或其他行为,引起的。