APIs 1.2.2

APIs 1.2.2

LEE维护。



APIs 1.2.2

  • 作者:
  • LEE

APIs

License  Swift  Platform  Carthage  Cocoapods

URLNavigator 是在Swift中编写的抽象路由组件,受到 Moya 的启发。

功能

  • 根据插件机制支持不同的处理。
  • 配置是独立的,易于管理。
  • 优秀的业务可扩展性。
  • 更安全的页面管理。
  • 支持回调的异步完成。

安装

Apis官方仅支持CocoaPods。

CocoaPods - Podfile

pod 'Apis'

用法

首先确保导入框架

import Apis

以下是使用示例。所有设备也可以在模拟器中使用

创建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 { }

URLTargetType

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