Swift 路由和模块通信解耦工具和规范。 可以让模块间无耦合的调用服务、页面跳转。
pod 'Lotusoot'
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// 通过 Build 阶段自动生成的 Lotusoot.plist 注册
LotusootCoordinator.registerAll()
return true
}
- 在 Xcode 中点击工程,选择你的
Target
,点击Buid Phases
,添加New Run Script Phase
- 将新建的
Run Script
拖拽至Compile Sources
上方、Check Pods Manifest.lock
下方,并填入以下脚本:
python ${PODS_ROOT}/Lotusoot/Lotusoot/Lotusoot.py ${SRC_ROOT} ${SRCROOT} Lotusoot
# 参数1: 扫描路径
# 参数2: ${SRCROOT},Lotusoot.plist 输出地址
# 参数3: Lotusoot 命名后缀(可省略),省略将会导致脚本执行时间变长
- 编译你的工程,在 Finder 中可以看到,工程目录下生成了
Lotusoot.plist
,将其拖入工程中,不要选择 Copy items if needed
。
Tip: 可以将
Lotusoot.plist
放入.gitignore
文件避免不要的冲突。
- 服务调用
let lotus = s(AccountLotus.self)
let accountModule: AccountLotus = LotusootCoordinator.lotusoot(lotus: lotus) as! AccountLotus
accountModule.login(username: "admin", password: "wow") { (error) in
print(error ?? "")
}
- 短链注册
let error: NSError? = LotusootRouter.register(route: "newproj://account/login") { (lotusootURL) in
accountModule.showLoginVC(username: "admin", password: "wow")
}
- 短链调用
let param: Dictionary = ["username" : "admin",
"password" : "wow"]
// 无回调
LotusootRouter.open(route: "newproj://account/login", params: param)
// 有回调
LotusootRouter.open(route: "newproj://account/login", params: param).completion { (error) in
print(error ?? "open success")
}
// ⚠️不推荐的用法,用 ?pram0=xxx 这样的形式导致字符串散落在各处,不易管理。
// 但为了保证 Hybrid 项目中 H5 页面的正常跳转,提供了此种调用
LotusootRouter.open(url: "newproj://account/login?username=zhoulingyu").completion { (error) in
print(error ?? "open success")
}
Lotusoot
的常规用法用例是:
- 建立
共用模块
,共用模块
中定义了各个模块的Lotus
,一个Lotus
协议包含了一个模块的所有的能调用的方法的列表。举例如下:
public protocol AccountLotus {
func login(username: String, password: String, complete: (Error?) -> Void)
func register(username: String, password: String, complete: (Error?) -> Void)
func email(username: String) -> String
func showLoginVC(username: String, password: String)
}
- 各个模块中,包含了一个实现
公共模块
中对应的Lotus
,称为Lotusoot
。Lotusoot
中具体实现了服务的逻辑,并在注解
中表明了模块的命名空间-@NameSpace
、Lotusoot-@Lotusoot``Lotus-@Lotus
。举例如下:
// @NameSpace(TestAccountModule)
// @Lotusoot(AccountLotusoot)
// @Lotus(AccountLotus)
class AccountLotusoot: NSObject, AccountLotus {
func email(username: String) -> String {
return OtherService.email(username: "zhoulingyu")
}
func login(username: String, password: String, complete: (Error?) -> Void) {
LoginService.login(username: username, password: password, complete: complete)
}
func register(username: String, password: String, complete: (Error?) -> Void) {
RegisterService.register(username: username, password: password, complete: complete)
}
func showLoginVC(username: String, password: String) {
// 可以用你们喜欢的非耦合方式处理跳转
// 或者传入 rootvc
// 更好的方式是自己的非耦合 UI 跳转处理模块
print("show login view controller")
}
}
Tip: 由于 Swift 的一些限制,目前
Lotusoot
必须继承NSObject
- 在主工程中
import Lotusoot
、import ModulePublic
调用服务和路由。
Tip: 具体可以查看 Demo -> DemoProject
在这里查看 Demo 工程,请记得先编译各个 Scheme。
- 路由动态下发
- 根页面保存及统一跳转工具
- 自定义动画支持
Lotusoot
使用 MIT License