Lotusoot is a router tool and a decoupling tool of modular project.
pod 'Lotusoot'
- In Xcode: Click on your project in the file list, choose your target under
TARGETS, click theBuild Phasestab and add a New Run Script Phase by clicking the little plus icon in the top left - Drag the new Run Script phase above the Compile Sources phase and below
Check Pods Manifest.lock, expand it and paste the following script:
python ${PODS_ROOT}/Lotusoot/Lotusoot/Lotusoot.py ${SRC_ROOT} ${SRCROOT} Lotusoot
# parameter1: scan path
# parameter2: ${SRCROOT}, output path of Lotusoot.plist
# parameter3: suffix of Lotusoot(Can bes omited), Omit leads to script execution time- Build your project, in Finder you will now see a
Lotusoot.plistin the$SRCROOT-folder, addLotusoot.plistinto your project and uncheck Copy items if needed
Tip: Add the
Lotusoot.plistto your .gitignore file to prevent unnecessary conflicts.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// register all routes
LotusootCoordinator.registerAll()
return true
}- Call a service
let lotus = s(AccountLotus.self)
let accountModule: AccountLotus = LotusootCoordinator.lotusoot(lotus: lotus) as! AccountLotus
accountModule.login(username: "admin", password: "wow") { (error) in
print(error ?? "")
}- Register a router
let error: NSError? = LotusootRouter.register(route: "newproj://account/login") { (lotusootURL) in
accountModule.showLoginVC(username: "admin", password: "wow")
}- Open an URL
let param: Dictionary = ["username" : "admin",
"password" : "wow"]
// no call back
LotusootRouter.open(route: "newproj://account/login", params: param)
// has call back
LotusootRouter.open(route: "newproj://account/login", params: param).completion { (error) in
print(error ?? "open success")
}
// ⚠️Not recommanded, use ?pram0=xxx lead to mismanagement
// This method just for H5 page of Hybrid project
LotusootRouter.open(url: "newproj://account/login?username=zhoulingyu").completion { (error) in
print(error ?? "open success")
}
Good usage example of Lotusoot:
- Create
Public module, where it definesLotusprotocol for all modules. ALotusprotocol defines all the functionality that open to other modules。For Example:
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)
}- Implement the
Lotusprotocol you have defined inPublic Module, you can call itLotusoot. InLotusoot, you must add Annotation for currentLotusoot, include:NameSpace-@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) {
print("show login view controller")
}
}
LotusootMUST inherit fromNSObject
- In your main project
import Lotusoot、import ModulePublic. You are free to call all the service and routers now
Tip: You can refer Demo -> NewProject
Demo 工程,Please do not forget build every Scheme first.
- Fetch router dynamically
- Unified way of viewcontroller jump
- Custom Animation
Lotusoot Use MIT License

