URLNavigator 是在Swift中编写的抽象路由组件,受到 Moya 的启发。
- 根据插件机制支持不同的处理。
- 配置是独立的,易于管理。
- 优秀的业务可扩展性。
- 更安全的页面管理。
- 支持回调的异步完成。
Apis官方仅支持CocoaPods。
CocoaPods - Podfile
pod 'Apis'
首先确保导入框架
import Apis
以下是使用示例。所有设备也可以在模拟器中使用
let router = Apis.Provider<RouterTarget>(
[RouterXXXXXXPlugin(),
RouterXXXXXXPlugin(),
RouterXXXXXXPlugin()]
)
enum RouterTarget {
case open_http(url: URL)
case open_https(url: URL)
case open_none
case open_live(id: String)
case open_some
}
extension RouterTarget: Apis.TargetType {
var task: Task {
switch(self) {
case let .open_http(url):
return .controller(SFSafariViewController(url: url))
case let .open_https(url):
return .controller(SFSafariViewController(url: url))
case .open_none:
return .controller(NoneViewController())
case let .open_live(id):
let controller = LiveViewController()
controller.id = id
return .controller(controller)
case .open_some:
return .handle { completion in
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
completion(true)
}
}
}
}
}
extension XXXXViewController: Routerable { }
extension SFSafariViewController: Routerable { }
private let schemes = "router"
extension RouterTarget: URLTargetType {
static var bindings: [URLPatternBinding<RouterTarget>] {
return [
.init("http://<path:_>") { source in
guard let url = source.url.value else { return .none }
return .open_http(url: url)
},
.init("https://<path:_>") { source in
guard let url = source.url.value else { return .none }
return .open_https(url: url)
},
.init(schemes + "://open/none") {
return .open_none
},
.init(schemes + "://open/live") { source in
guard let id = source.url.queryParameters["id"] else { return nil }
return .open_live(id: id)
},
.init(schemes + "://open/some") {
return .open_some
}
]
}
}
class RouterXXXXPlugin: Apis.PluginType {
func should(open target: TargetType) -> Bool {
/* ... */
return true
}
func prepare(open target: TargetType, completion: @escaping (Bool) -> Void) {
/* ... */
completion(true)
}
func will(open target: TargetType, controller: Routerable) {
/* ... */
}
func did(open target: TargetType, controller: Routerable) {
/* ... */
}
}
// Open page based on type
router.open(.open_xxxx)
// Open page based on url
router.open("http://xxxxxxxx")
// Result callback
router.open("http://xxxxxxxx") { (result) in
// Success or failure
}
如果您需要实现特定功能或有bug的问题,请打开一个问题。如果您扩展了Apis的功能并希望 others 也使用它,请提交一个pull request。
Apis遵循MIT许可协议。更多信息请参阅LICENSE文件。