Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Lotusoot is a router tool and a decoupling tool of modular project.



pod 'Lotusoot'

How to use

1. Configuration

  1. In Xcode: Click on your project in the file list, choose your target under TARGETS, click the Build Phases tab and add a New Run Script Phase by clicking the little plus icon in the top left
  2. 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/ ${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
  1. Build your project, in Finder you will now see a Lotusoot.plist in the $SRCROOT-folder, add Lotusoot.plist into your project and uncheck Copy items if needed

Tip: Add the Lotusoot.plist to your .gitignore file to prevent unnecessary conflicts.

2. Use

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // register all routes
    return true
  1. 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 ?? "")
  1. Register a router
let error: NSError? = LotusootRouter.register(route: "newproj://account/login") { (lotusootURL) in
    accountModule.showLoginVC(username: "admin", password: "wow")
  1. Open an URL
let param: Dictionary = ["username" : "admin",
                                 "password" : "wow"]

// no call back                         "newproj://account/login", params: param)
// has call back "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 "newproj://account/login?username=zhoulingyu").completion { (error) in
    print(error ?? "open success")

3. Annotation and Suggest

Good usage example of Lotusoot

  1. Create Public module, where it defines Lotus protocol for all modules. A Lotus protocol 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)
  1. Implement the Lotus protocol you have defined in Public Module, you can call it Lotusoot. In Lotusoot, you must add Annotation for current Lotusoot, include: NameSpace-@NameSpace, Lotusoot-@Lotusoot, Lotus-@Lotus:
// @NameSpace(TestAccountModule)
// @Lotusoot(AccountLotusoot)
// @Lotus(AccountLotus)
class AccountLotusoot: NSObject, AccountLotus {
    func email(username: String) -> String {
        return "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")

Lotusoot MUST inherit from NSObject

  1. In your main project import Lotusootimport 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


灵活的 Swift 组件解耦和通信工具








No packages published