├── MainProject-MultiPod ├── Assets.xcassets │ ├── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── ViewController.h ├── Coordinator.h ├── AppDelegate.h ├── NavigationCoordinator.m ├── MainTabBarViewController.h ├── main.m ├── PayViewModel.h ├── MainModuleManager.h ├── ViewController.m ├── PayViewController.h ├── MainTabBarViewController.m ├── NavigationCoordinator.h ├── BPHttpClient.h ├── AccountVM.h ├── BaseCoordinator.h ├── PayViewController.m ├── BaseCoordinator.m ├── PayCoordinator.h ├── BPHttpClient.m ├── AccountViewController.h ├── AccountCoordinator.h ├── MainModuleManager.m ├── AppCoordinator.h ├── AccountCoordinator.m ├── AccountVM.m ├── PayViewModel.m ├── AccountViewController.m ├── Info.plist ├── PayCoordinator.m ├── Base.lproj │ └── LaunchScreen.storyboard ├── AppDelegate.m ├── AccountViewController.xib ├── AppCoordinator.m └── PayViewController.storyboard ├── Pods ├── Target Support Files │ ├── ListPod │ │ ├── ListPod.modulemap │ │ ├── ListPod-dummy.m │ │ ├── ListPod-prefix.pch │ │ ├── ListPod-umbrella.h │ │ ├── ListPod.xcconfig │ │ └── ListPod-Info.plist │ ├── LoginPod │ │ ├── LoginPod.modulemap │ │ ├── LoginPod-dummy.m │ │ ├── LoginPod-prefix.pch │ │ ├── LoginPod-umbrella.h │ │ ├── LoginPod.xcconfig │ │ ├── ResourceBundle-LoginPod-LoginPod-Info.plist │ │ └── LoginPod-Info.plist │ ├── LBCoordinator │ │ ├── LBCoordinator.modulemap │ │ ├── LBCoordinator-dummy.m │ │ ├── LBCoordinator-prefix.pch │ │ ├── LBCoordinator.xcconfig │ │ ├── LBCoordinator-umbrella.h │ │ └── LBCoordinator-Info.plist │ └── Pods-MainProject-MultiPod │ │ ├── Pods-MainProject-MultiPod.modulemap │ │ ├── Pods-MainProject-MultiPod-dummy.m │ │ ├── Pods-MainProject-MultiPod-frameworks-Debug-output-files.xcfilelist │ │ ├── Pods-MainProject-MultiPod-frameworks-Release-output-files.xcfilelist │ │ ├── Pods-MainProject-MultiPod-frameworks-Debug-input-files.xcfilelist │ │ ├── Pods-MainProject-MultiPod-frameworks-Release-input-files.xcfilelist │ │ ├── Pods-MainProject-MultiPod-umbrella.h │ │ ├── Pods-MainProject-MultiPod-Info.plist │ │ ├── Pods-MainProject-MultiPod.debug.xcconfig │ │ ├── Pods-MainProject-MultiPod.release.xcconfig │ │ ├── Pods-MainProject-MultiPod-acknowledgements.markdown │ │ ├── Pods-MainProject-MultiPod-acknowledgements.plist │ │ └── Pods-MainProject-MultiPod-frameworks.sh ├── LoginPod │ ├── LoginPod │ │ └── Classes │ │ │ ├── Public │ │ │ ├── UserInfo.m │ │ │ ├── UserInfo.h │ │ │ ├── LoginCoordinator.h │ │ │ ├── LoginModuleManager.h │ │ │ ├── BPDependency.m │ │ │ ├── LoginModuleManager.m │ │ │ ├── BPDependency.h │ │ │ └── LoginCoordinator.m │ │ │ └── Private │ │ │ ├── LoginViewModel.h │ │ │ ├── LoginViewModel.m │ │ │ ├── LoginViewController.h │ │ │ ├── LoginViewController.m │ │ │ └── LoginViewController.storyboard │ ├── README.md │ └── LICENSE ├── ListPod │ ├── ListPod │ │ └── Classes │ │ │ ├── ListModuleCoordinatorDelegate.swift │ │ │ ├── ModuleManager.swift │ │ │ ├── ListItem.swift │ │ │ ├── ListCoordinator.swift │ │ │ ├── ListViewController.swift │ │ │ └── DetailViewController.swift │ ├── README.md │ └── LICENSE ├── LBCoordinator │ ├── LBCoordinator │ │ └── Classes │ │ │ ├── LBCoordinator.h │ │ │ ├── LBGenericCoordinator.h │ │ │ ├── UIViewController+LBCoordinator.h │ │ │ ├── UIResponder+LBCoordinating.m │ │ │ ├── LBGenericCoordinator.m │ │ │ ├── UIResponder+LBCoordinating.h │ │ │ ├── LBCoordinating.h │ │ │ ├── LBBaseCoordinator.h │ │ │ ├── UIViewController+LBCoordinator.m │ │ │ ├── LBNavigationCoordinator.h │ │ │ ├── LBBaseCoordinator.m │ │ │ └── LBNavigationCoordinator.m │ ├── README.md │ └── LICENSE ├── Local Podspecs │ ├── LBCoordinator.podspec.json │ ├── ListPod.podspec.json │ └── LoginPod.podspec.json └── Manifest.lock ├── MainProject-MultiPod.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── project.pbxproj ├── MainProject-MultiPod.xcworkspace ├── xcshareddata │ └── IDEWorkspaceChecks.plist └── contents.xcworkspacedata ├── Podfile ├── .gitignore └── Podfile.lock /MainProject-MultiPod/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Pods/Target Support Files/ListPod/ListPod.modulemap: -------------------------------------------------------------------------------- 1 | framework module ListPod { 2 | umbrella header "ListPod-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LoginPod/LoginPod.modulemap: -------------------------------------------------------------------------------- 1 | framework module LoginPod { 2 | umbrella header "LoginPod-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ListPod/ListPod-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_ListPod : NSObject 3 | @end 4 | @implementation PodsDummy_ListPod 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LoginPod/LoginPod-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_LoginPod : NSObject 3 | @end 4 | @implementation PodsDummy_LoginPod 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LBCoordinator/LBCoordinator.modulemap: -------------------------------------------------------------------------------- 1 | framework module LBCoordinator { 2 | umbrella header "LBCoordinator-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LBCoordinator/LBCoordinator-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_LBCoordinator : NSObject 3 | @end 4 | @implementation PodsDummy_LBCoordinator 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Public/UserInfo.m: -------------------------------------------------------------------------------- 1 | // 2 | // UserInfo.m 3 | // LoginPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | #import "UserInfo.h" 9 | 10 | @implementation UserInfo 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_MainProject_MultiPod { 2 | umbrella header "Pods-MainProject-MultiPod-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_MainProject_MultiPod : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_MainProject_MultiPod 5 | @end 6 | -------------------------------------------------------------------------------- /MainProject-MultiPod.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ListPod/ListPod-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LoginPod/LoginPod-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Public/UserInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // UserInfo.h 3 | // LoginPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface UserInfo : NSObject 13 | 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LBCoordinator/LBCoordinator-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks-Debug-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LBCoordinator.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ListPod.framework 3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LoginPod.framework -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks-Release-output-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LBCoordinator.framework 2 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ListPod.framework 3 | ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/LoginPod.framework -------------------------------------------------------------------------------- /MainProject-MultiPod/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/14. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /MainProject-MultiPod.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /MainProject-MultiPod.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /MainProject-MultiPod.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Public/LoginCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LoginCoordinator.h 3 | // LoginPod 4 | // 5 | // Created by Bruce on 2019/10/30. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface LoginCoordinator : LBNavigationCoordinator 13 | 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks-Debug-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/LBCoordinator/LBCoordinator.framework 3 | ${BUILT_PRODUCTS_DIR}/ListPod/ListPod.framework 4 | ${BUILT_PRODUCTS_DIR}/LoginPod/LoginPod.framework -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks-Release-input-files.xcfilelist: -------------------------------------------------------------------------------- 1 | ${PODS_ROOT}/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks.sh 2 | ${BUILT_PRODUCTS_DIR}/LBCoordinator/LBCoordinator.framework 3 | ${BUILT_PRODUCTS_DIR}/ListPod/ListPod.framework 4 | ${BUILT_PRODUCTS_DIR}/LoginPod/LoginPod.framework -------------------------------------------------------------------------------- /MainProject-MultiPod/Coordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // Coordinator.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/10/28. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol Coordinator 14 | -(void)start; 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/14. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Private/LoginViewModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // LoginViewModel.h 3 | // LoginPod 4 | // 5 | // Created by Bruce on 2019/10/30. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface LoginViewModel : NSObject 13 | - (void)loginWithCompletion:(void (^)(BOOL success))completion; 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /MainProject-MultiPod/NavigationCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // NavigationCoordinator.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/10/28. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "NavigationCoordinator.h" 10 | 11 | @implementation NavigationCoordinator 12 | - (void)start{ 13 | NSAssert(NO, @"subclass must imp this method"); 14 | } 15 | @end 16 | -------------------------------------------------------------------------------- /Pods/ListPod/ListPod/Classes/ListModuleCoordinatorDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListPodCoordinatorType.swift 3 | // ListPod 4 | // 5 | // Created by gxy on 2019/9/14. 6 | // 7 | 8 | import Foundation 9 | import LBCoordinator 10 | 11 | @objc public protocol ListModuleCoordinatorDelegate: AnyObject { 12 | func listCoordinator(_ coordinator: ListCoordinator, jumpPayPageWith data: ListItemOC) 13 | } 14 | -------------------------------------------------------------------------------- /MainProject-MultiPod/MainTabBarViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainTabBarViewController.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by Bruce on 2019/10/31. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface MainTabBarViewController : UITabBarController 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /MainProject-MultiPod/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/14. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ListPod/ListPod-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double ListPodVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char ListPodVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /MainProject-MultiPod/PayViewModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // PayViewModel.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2020/4/10. 6 | // Copyright © 2020 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface PayViewModel : NSObject 14 | - (void)subscribePayStatus:(void (^)(BOOL status))subscriber; 15 | - (void)payWithId:(NSInteger)pId; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainProject-MultiPod/MainModuleManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // MainModuleManager.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/18. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class AppCoordinator; 14 | 15 | @interface MainModuleManager : NSObject 16 | + (void)injectAllDependencyWith:(AppCoordinator *)appFlow; 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /MainProject-MultiPod/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/14. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | 11 | @interface ViewController () 12 | 13 | @end 14 | 15 | @implementation ViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | } 21 | 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_MainProject_MultiPodVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_MainProject_MultiPodVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/LBCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LBCoordinator.h 3 | // LBCoordinator 4 | // 5 | // Created by gxy on 2020/4/10. 6 | // 7 | 8 | #ifndef LBCoordinator_h 9 | #define LBCoordinator_h 10 | 11 | #import "LBCoordinating.h" 12 | #import "LBBaseCoordinator.h" 13 | #import "LBGenericCoordinator.h" 14 | #import "LBNavigationCoordinator.h" 15 | 16 | #import "UIResponder+LBCoordinating.h" 17 | #import "UIViewController+LBCoordinator.h" 18 | 19 | #endif /* LBCoordinator_h */ 20 | -------------------------------------------------------------------------------- /MainProject-MultiPod/PayViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // PayViewController.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/18. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "PayViewModel.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface PayViewController : UIViewController 15 | @property (nonatomic, assign) NSInteger pId; 16 | @property (nonatomic, strong) PayViewModel *payViewModel; 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/LBGenericCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LBGenericCoordinator.h 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/5. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "LBBaseCoordinator.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface LBGenericCoordinator : LBBaseCoordinator 14 | @property (nonatomic, strong, readonly) T rootVC; 15 | - (instancetype)initWithRootVC:(T)rootVC; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /MainProject-MultiPod/MainTabBarViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainTabBarViewController.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by Bruce on 2019/10/31. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "MainTabBarViewController.h" 10 | 11 | @interface MainTabBarViewController () 12 | 13 | @end 14 | 15 | @implementation MainTabBarViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | } 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /MainProject-MultiPod/NavigationCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // NavigationCoordinator.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/10/28. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "BaseCoordinator.h" 12 | #import "Coordinator.h" 13 | 14 | NS_ASSUME_NONNULL_BEGIN 15 | 16 | @interface NavigationCoordinator : BaseCoordinator 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | platform :ios, '9.0' 3 | 4 | target 'MainProject-MultiPod' do 5 | # Comment the next line if you don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for MainProject-MultiPod 9 | pod 'ListPod', :git => 'https://github.com/Bruce-pac/ListPod.git' 10 | pod 'LoginPod', :git => 'https://github.com/Bruce-pac/LoginPod.git' 11 | pod 'LBCoordinator', :git => 'https://github.com/Bruce-pac/LBCoordinator.git' 12 | 13 | end 14 | -------------------------------------------------------------------------------- /MainProject-MultiPod/BPHttpClient.h: -------------------------------------------------------------------------------- 1 | // 2 | // BPHttpClient.h 3 | // LoginPod_Example 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // Copyright © 2019 Bruce-pac. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @interface BPHttpClient : NSObject 15 | -(void)requestApi:(NSString *)url param:(NSDictionary *)parameter success:(void (^)(void))success failure:(void (^)(void))failure; 16 | @end 17 | 18 | NS_ASSUME_NONNULL_END 19 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/UIViewController+LBCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+LBCoordinator.h 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/3. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LBBaseCoordinator.h" 11 | #import "UIResponder+LBCoordinating.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface UIViewController (LBCoordinator) 16 | @property (nonatomic, weak) LBBaseCoordinator *lb_coordinator; 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Public/LoginModuleManager.h: -------------------------------------------------------------------------------- 1 | // 2 | // LoginModuleManager.h 3 | // LoginPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | #import 9 | #import "BPDependency.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface LoginModuleManager : NSObject 14 | @property (nonatomic, strong, readonly) BPDependency *dependency; 15 | +(NSBundle *)resourceBundle; 16 | + (instancetype)shared; 17 | - (void)injectDependency:(BPDependency *)dependency; 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LoginPod/LoginPod-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "BPDependency.h" 14 | #import "LoginCoordinator.h" 15 | #import "LoginModuleManager.h" 16 | #import "UserInfo.h" 17 | 18 | FOUNDATION_EXPORT double LoginPodVersionNumber; 19 | FOUNDATION_EXPORT const unsigned char LoginPodVersionString[]; 20 | 21 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AccountVM.h: -------------------------------------------------------------------------------- 1 | // 2 | // AccountVM.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/11/1. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class UserInfo; 14 | 15 | typedef void(^UserNameListenser)(NSAttributedString *_Nullable userName); 16 | 17 | @interface AccountVM : NSObject 18 | - (void)updateUserInfo:(UserInfo *)info; 19 | - (void)subscribeUserName:(UserNameListenser)listener; 20 | @end 21 | 22 | NS_ASSUME_NONNULL_END 23 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LBCoordinator/LBCoordinator.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LBCoordinator 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | PODS_BUILD_DIR = ${BUILD_DIR} 4 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 5 | PODS_ROOT = ${SRCROOT} 6 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/LBCoordinator 7 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 8 | SKIP_INSTALL = YES 9 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 10 | -------------------------------------------------------------------------------- /MainProject-MultiPod/BaseCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // BaseCoordinator.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by 顾鑫烨 on 2019/10/30. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "Coordinator.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface BaseCoordinator : NSObject 16 | @property (nonatomic, weak, readonly) T rootVC; 17 | - (instancetype)initWithRootVC:(T)rootVC; 18 | @end 19 | 20 | NS_ASSUME_NONNULL_END 21 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LoginPod/LoginPod.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/LoginPod 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/LBCoordinator" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/LoginPod 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 11 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Private/LoginViewModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // LoginViewModel.m 3 | // LoginPod 4 | // 5 | // Created by Bruce on 2019/10/30. 6 | // 7 | 8 | #import "LoginViewModel.h" 9 | #import "LoginModuleManager.h" 10 | 11 | @implementation LoginViewModel 12 | - (void)loginWithCompletion:(void (^)(BOOL))completion{ 13 | [[LoginModuleManager shared].dependency.httpClient requestApi:@"loginapi" param:@{} success:^{ 14 | if (completion) { 15 | completion(YES); 16 | } 17 | } failure:^{ 18 | if (completion) { 19 | completion(NO); 20 | } 21 | }]; 22 | } 23 | @end 24 | -------------------------------------------------------------------------------- /MainProject-MultiPod/PayViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // PayViewController.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/18. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "PayViewController.h" 10 | 11 | @interface PayViewController () 12 | 13 | @end 14 | 15 | @implementation PayViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | // Do any additional setup after loading the view. 20 | NSLog(@"viewDidLoad %ld", (long)self.pId); 21 | } 22 | 23 | - (IBAction)onTapPay:(id)sender { 24 | [self.payViewModel payWithId:self.pId]; 25 | } 26 | 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/UIResponder+LBCoordinating.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIResponder+LBCoordinator.m 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/3. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "UIResponder+LBCoordinating.h" 10 | 11 | 12 | @implementation UIResponder (LBCoordinating) 13 | - (UIResponder *)coordinatingResponder{ 14 | return self.nextResponder; 15 | } 16 | 17 | - (void)lb_coordinatingMessage:(LBCoordinatorEventName)event object:(id)object userInfo:(NSDictionary *)userInfo{ 18 | [self.coordinatingResponder lb_coordinatingMessage:event object:object userInfo:userInfo]; 19 | } 20 | @end 21 | -------------------------------------------------------------------------------- /Pods/Local Podspecs/LBCoordinator.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LBCoordinator", 3 | "version": "0.1.0", 4 | "summary": "A short description of LBCoordinator.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com/Bruce-pac/LBCoordinator", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Bruce-pac": "Bruce_pac312@foxmail.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/Bruce-pac/LBCoordinator.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "8.0" 20 | }, 21 | "source_files": "LBCoordinator/Classes/**/*" 22 | } 23 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ListPod/ListPod.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/ListPod 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/LBCoordinator" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/ListPod 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 12 | -------------------------------------------------------------------------------- /MainProject-MultiPod/BaseCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // BaseCoordinator.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by 顾鑫烨 on 2019/10/30. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "BaseCoordinator.h" 10 | 11 | @interface BaseCoordinator () 12 | @property (nonatomic, weak) __kindof UIViewController *rootVC; 13 | @end 14 | 15 | @implementation BaseCoordinator 16 | 17 | - (instancetype)initWithRootVC:(UIViewController *)rootVC{ 18 | self = [super init]; 19 | if (self) { 20 | _rootVC = rootVC; 21 | } 22 | return self; 23 | } 24 | 25 | - (void)start { 26 | NSAssert(NO, @"subclass must imp this method"); 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /MainProject-MultiPod/PayCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // PayCoordinator.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2020/4/7. 6 | // Copyright © 2020 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class PayCoordinator; 14 | @protocol PayCoordinatorDelegate 15 | 16 | - (void)payFlow:(PayCoordinator *)payFlow didFinishWithStatus:(BOOL)payStatus; 17 | 18 | @end 19 | 20 | @interface PayCoordinator : LBNavigationCoordinator 21 | @property (nonatomic, weak) id delegate; 22 | - (void)startWithPId:(NSInteger)pId; 23 | @end 24 | 25 | NS_ASSUME_NONNULL_END 26 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Private/LoginViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // LoginViewController.h 3 | // LoginPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | #import 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol LoginViewControllerDelegate 14 | 15 | -(void)loginResult:(BOOL)result vc:(UIViewController *)vc; 16 | -(void)onTapCloseBtnWith:(UIViewController *)vc; 17 | @end 18 | 19 | @interface LoginViewController : UIViewController 20 | @property (nonatomic, weak) id delegate; 21 | - (instancetype)initWithViewModel:(LoginViewModel *)viewModel; 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /MainProject-MultiPod/BPHttpClient.m: -------------------------------------------------------------------------------- 1 | // 2 | // BPHttpClient.m 3 | // LoginPod_Example 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // Copyright © 2019 Bruce-pac. All rights reserved. 7 | // 8 | 9 | #import "BPHttpClient.h" 10 | 11 | @implementation BPHttpClient 12 | - (void)requestApi:(NSString *)url param:(NSDictionary *)parameter success:(void (^)(void))success failure:(void (^)(void))failure{ 13 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 14 | uint32_t num = arc4random(); 15 | if (num % 2 == 0) { 16 | success(); 17 | }else{ 18 | failure(); 19 | } 20 | }); 21 | } 22 | @end 23 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LBCoordinator/LBCoordinator-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "LBBaseCoordinator.h" 14 | #import "LBCoordinating.h" 15 | #import "LBCoordinator.h" 16 | #import "LBGenericCoordinator.h" 17 | #import "LBNavigationCoordinator.h" 18 | #import "UIResponder+LBCoordinating.h" 19 | #import "UIViewController+LBCoordinator.h" 20 | 21 | FOUNDATION_EXPORT double LBCoordinatorVersionNumber; 22 | FOUNDATION_EXPORT const unsigned char LBCoordinatorVersionString[]; 23 | 24 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AccountViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AccountViewController.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/10/31. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AccountVM.h" 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | @class AccountViewController; 14 | 15 | @protocol AccountViewControllerDelegate 16 | 17 | -(void)onTapAccountBtn:(AccountViewController *)vc; 18 | 19 | @end 20 | 21 | @interface AccountViewController : UIViewController 22 | @property (nonatomic, weak) id delegate; 23 | -(instancetype)initWithViewModel:(AccountVM *)vm; 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Public/BPDependency.m: -------------------------------------------------------------------------------- 1 | // 2 | // BPDependency.m 3 | // LoginPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | #import "BPDependency.h" 9 | 10 | @interface BPDependency () 11 | @property (nonatomic, strong) id coordinator; 12 | @property (nonatomic, strong) id httpClient; 13 | @end 14 | 15 | @implementation BPDependency 16 | - (instancetype)initWithCoordinator:(id)coordinator httpClient:(id)httpClient{ 17 | self = [super init]; 18 | if (self) { 19 | _coordinator = coordinator; 20 | _httpClient = httpClient; 21 | } 22 | return self; 23 | } 24 | @end 25 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/LBGenericCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // LBGenericCoordinator.m 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/5. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "LBGenericCoordinator.h" 10 | #import "UIViewController+LBCoordinator.h" 11 | 12 | @interface LBGenericCoordinator () 13 | @property (nonatomic, strong, readwrite) __kindof UIViewController *rootVC; 14 | @end 15 | 16 | @implementation LBGenericCoordinator 17 | - (instancetype)initWithRootVC:(UIViewController *)rootVC{ 18 | self = [super init]; 19 | if (self) { 20 | _rootVC = rootVC; 21 | _rootVC.lb_coordinator = self; 22 | } 23 | return self; 24 | } 25 | @end 26 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/UIResponder+LBCoordinating.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIResponder+LBCoordinator.h 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/3. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | typedef NSString* LBCoordinatorEventName NS_TYPED_EXTENSIBLE_ENUM; 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | 15 | @interface UIResponder (LBCoordinating) 16 | @property (nonatomic, readonly) UIResponder *coordinatingResponder; 17 | 18 | - (void)lb_coordinatingMessage:(LBCoordinatorEventName)event 19 | object:(nullable id)object 20 | userInfo:(nullable NSDictionary *)userInfo; 21 | @end 22 | 23 | NS_ASSUME_NONNULL_END 24 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AccountCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // AccountCoordinator.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2020/4/7. 6 | // Copyright © 2020 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | NS_ASSUME_NONNULL_BEGIN 13 | 14 | @class AccountCoordinator; 15 | @protocol AccountCoordinatorDelegate 16 | 17 | - (void)accountCoordinatorOnTapAvatar:(AccountCoordinator *)account; 18 | 19 | @end 20 | 21 | @interface AccountCoordinator : LBNavigationCoordinator 22 | @property (nonatomic, weak) id delegate; 23 | 24 | - (void)updateUserInfo:(UserInfo *)info; 25 | @end 26 | 27 | NS_ASSUME_NONNULL_END 28 | -------------------------------------------------------------------------------- /MainProject-MultiPod/MainModuleManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // MainModuleManager.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/18. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "MainModuleManager.h" 10 | #import 11 | #import 12 | #import "BPHttpClient.h" 13 | #import "AppCoordinator.h" 14 | 15 | @implementation MainModuleManager 16 | + (void)injectAllDependencyWith:(AppCoordinator *)appFlow{ 17 | 18 | [[ModuleManager shared] injectDependency:[[Dependency alloc] initWithCoordinator:appFlow]]; 19 | [[LoginModuleManager shared] injectDependency:[[BPDependency alloc] initWithCoordinator:appFlow httpClient:[BPHttpClient new]]]; 20 | } 21 | @end 22 | -------------------------------------------------------------------------------- /Pods/ListPod/ListPod/Classes/ModuleManager.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DependencyManager.swift 3 | // ListPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | import Foundation 9 | 10 | @objcMembers public class Dependency: NSObject { 11 | let coordinator: ListModuleCoordinatorDelegate 12 | 13 | public init(coordinator: ListModuleCoordinatorDelegate) { 14 | self.coordinator = coordinator 15 | } 16 | } 17 | 18 | @objcMembers public class ModuleManager: NSObject { 19 | public static let shared = ModuleManager() 20 | 21 | private override init() {} 22 | 23 | private(set) var dependency: Dependency? 24 | 25 | public func injectDependency(_ dependency: Dependency) { 26 | self.dependency = dependency 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Pods/Local Podspecs/ListPod.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ListPod", 3 | "version": "0.1.0", 4 | "summary": "A short description of ListPod.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com/Bruce-pac/ListPod", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Bruce-pac": "Bruce_pac312@foxmail.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/Bruce-pac/ListPod.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "8.0" 20 | }, 21 | "swift_versions": "5.0", 22 | "source_files": "ListPod/Classes/**/*", 23 | "dependencies": { 24 | "LBCoordinator": [ 25 | 26 | ] 27 | }, 28 | "swift_version": "5.0" 29 | } 30 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/LBCoordinating.h: -------------------------------------------------------------------------------- 1 | // 2 | // Coordinator.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/10/28. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol LBCoordinating 14 | @property (nonatomic, copy, readonly) NSString *identifier; 15 | @property (nonatomic, strong, nullable) id parentCoordinator; 16 | @property (nonatomic, copy, readonly) NSArray> *childCoordinators; 17 | 18 | - (void)start; 19 | - (void)startChildCoordinator:(id)child; 20 | - (void)stopChildCoordinator:(id)child; 21 | - (void)addChildCoordinator:(id)child; 22 | @end 23 | 24 | NS_ASSUME_NONNULL_END 25 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LoginPod/ResourceBundle-LoginPod-LoginPod-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleIdentifier 8 | ${PRODUCT_BUNDLE_IDENTIFIER} 9 | CFBundleInfoDictionaryVersion 10 | 6.0 11 | CFBundleName 12 | ${PRODUCT_NAME} 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 0.1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata/ 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 26 | # Carthage/Checkouts 27 | 28 | Carthage/Build 29 | 30 | # We recommend against adding the Pods directory to your .gitignore. However 31 | # you should judge for yourself, the pros and cons are mentioned at: 32 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 33 | # 34 | # Note: if you ignore the Pods directory, make sure to uncomment 35 | # `pod install` in .travis.yml 36 | # 37 | # Pods/ 38 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AppCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppCoordinator.h 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/10/28. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | #import "MainTabBarViewController.h" 13 | #import 14 | #import 15 | #import "PayCoordinator.h" 16 | 17 | 18 | NS_ASSUME_NONNULL_BEGIN 19 | 20 | @interface AppCoordinator : LBGenericCoordinator 21 | @end 22 | 23 | @interface AppCoordinator (ListPodCoordinatorTypeImp) 24 | 25 | @end 26 | 27 | @interface AppCoordinator (LoginCoordinatorDelegateImp) 28 | 29 | @end 30 | 31 | @interface AppCoordinator (PayCoordinatorDelegateImp) 32 | 33 | @end 34 | 35 | NS_ASSUME_NONNULL_END 36 | -------------------------------------------------------------------------------- /Pods/Local Podspecs/LoginPod.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "LoginPod", 3 | "version": "0.1.0", 4 | "summary": "A short description of LoginPod.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com/Bruce-pac/LoginPod", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Bruce-pac": "Bruce_pac312@foxmail.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/Bruce-pac/LoginPod.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "9.0" 20 | }, 21 | "source_files": "LoginPod/Classes/**/*.{h,m}", 22 | "resource_bundles": { 23 | "LoginPod": [ 24 | "LoginPod/Assets/*", 25 | "LoginPod/Classes/**/*.{xib,storyboard}" 26 | ] 27 | }, 28 | "public_header_files": "LoginPod/Classes/Public/*.h", 29 | "dependencies": { 30 | "LBCoordinator": [ 31 | 32 | ] 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Pods/Target Support Files/ListPod/ListPod-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LoginPod/LoginPod-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/LBCoordinator/LBCoordinator-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/ListPod/README.md: -------------------------------------------------------------------------------- 1 | # ListPod 2 | 3 | [![CI Status](https://img.shields.io/travis/Bruce-pac/ListPod.svg?style=flat)](https://travis-ci.org/Bruce-pac/ListPod) 4 | [![Version](https://img.shields.io/cocoapods/v/ListPod.svg?style=flat)](https://cocoapods.org/pods/ListPod) 5 | [![License](https://img.shields.io/cocoapods/l/ListPod.svg?style=flat)](https://cocoapods.org/pods/ListPod) 6 | [![Platform](https://img.shields.io/cocoapods/p/ListPod.svg?style=flat)](https://cocoapods.org/pods/ListPod) 7 | 8 | ## Example 9 | 10 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 11 | 12 | ## Requirements 13 | 14 | ## Installation 15 | 16 | ListPod is available through [CocoaPods](https://cocoapods.org). To install 17 | it, simply add the following line to your Podfile: 18 | 19 | ```ruby 20 | pod 'ListPod' 21 | ``` 22 | 23 | ## Author 24 | 25 | Bruce-pac, Bruce_pac312@foxmail.com 26 | 27 | ## License 28 | 29 | ListPod is available under the MIT license. See the LICENSE file for more info. 30 | -------------------------------------------------------------------------------- /Pods/LoginPod/README.md: -------------------------------------------------------------------------------- 1 | # LoginPod 2 | 3 | [![CI Status](https://img.shields.io/travis/Bruce-pac/LoginPod.svg?style=flat)](https://travis-ci.org/Bruce-pac/LoginPod) 4 | [![Version](https://img.shields.io/cocoapods/v/LoginPod.svg?style=flat)](https://cocoapods.org/pods/LoginPod) 5 | [![License](https://img.shields.io/cocoapods/l/LoginPod.svg?style=flat)](https://cocoapods.org/pods/LoginPod) 6 | [![Platform](https://img.shields.io/cocoapods/p/LoginPod.svg?style=flat)](https://cocoapods.org/pods/LoginPod) 7 | 8 | ## Example 9 | 10 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 11 | 12 | ## Requirements 13 | 14 | ## Installation 15 | 16 | LoginPod is available through [CocoaPods](https://cocoapods.org). To install 17 | it, simply add the following line to your Podfile: 18 | 19 | ```ruby 20 | pod 'LoginPod' 21 | ``` 22 | 23 | ## Author 24 | 25 | Bruce-pac, Bruce_pac312@foxmail.com 26 | 27 | ## License 28 | 29 | LoginPod is available under the MIT license. See the LICENSE file for more info. 30 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AccountCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // AccountCoordinator.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2020/4/7. 6 | // Copyright © 2020 Bruce. All rights reserved. 7 | // 8 | 9 | #import "AccountCoordinator.h" 10 | #import "AccountViewController.h" 11 | 12 | @interface AccountCoordinator () 13 | @property (nonatomic, strong) AccountVM *accountVM;//简单起见 14 | @end 15 | 16 | @implementation AccountCoordinator 17 | 18 | - (void)start{ 19 | AccountVM *vm = [AccountVM new]; 20 | self.accountVM = vm; 21 | AccountViewController *account = [[AccountViewController alloc] initWithViewModel:vm]; 22 | account.delegate = self; 23 | account.title = @"account"; 24 | [self.rootVC pushViewController:account animated:NO]; 25 | } 26 | 27 | - (void)onTapAccountBtn:(nonnull AccountViewController *)vc { 28 | [self.delegate accountCoordinatorOnTapAvatar:self]; 29 | } 30 | 31 | - (void)updateUserInfo:(UserInfo *)info{ 32 | [self.accountVM updateUserInfo:info]; 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/LBBaseCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LBBaseCoordinator.h 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/3. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "LBCoordinating.h" 11 | #import "UIResponder+LBCoordinating.h" 12 | 13 | NS_ASSUME_NONNULL_BEGIN 14 | /* 15 | @abstract class. 16 | 一般只需要重写 -start 方法。 17 | */ 18 | @interface LBBaseCoordinator : UIResponder 19 | 20 | @property (nonatomic, copy, readonly) NSString *identifier; 21 | @property (nonatomic, strong, nullable) id parentCoordinator; 22 | ///子类coordinator所负责的业务流结束之后主动调用,父coordinator在此回调里释放子coordinator,以及一些额外的操作 23 | @property (nonatomic, copy, nullable) void (^didCompleted)(__kindof LBBaseCoordinator *coordinator); 24 | 25 | - (void)start; 26 | 27 | - (void)startChildCoordinator:(id)child; 28 | - (void)stopChildCoordinator:(id)child; 29 | - (void)addChildCoordinator:(id)child; 30 | @end 31 | 32 | NS_ASSUME_NONNULL_END 33 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/UIViewController+LBCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+LBCoordinator.m 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/3. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "UIViewController+LBCoordinator.h" 10 | #import 11 | 12 | static NSString *const kParentCoordinatorKey = @"kParentCoordinatorKey"; 13 | 14 | @implementation UIViewController (LBCoordinator) 15 | 16 | - (LBBaseCoordinator *)lb_coordinator{ 17 | return objc_getAssociatedObject(self, &kParentCoordinatorKey); 18 | } 19 | 20 | - (void)setLb_coordinator:(LBBaseCoordinator *)lb_coordinator{ 21 | objc_setAssociatedObject(self, &kParentCoordinatorKey, lb_coordinator, OBJC_ASSOCIATION_ASSIGN); 22 | } 23 | 24 | - (UIResponder *)coordinatingResponder{ 25 | if (self.lb_coordinator) { 26 | return self.lb_coordinator; 27 | } 28 | if (self.parentViewController) { 29 | return self.parentViewController; 30 | } 31 | return self.nextResponder; 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Public/LoginModuleManager.m: -------------------------------------------------------------------------------- 1 | // 2 | // LoginModuleManager.m 3 | // LoginPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | #import "LoginModuleManager.h" 9 | 10 | @interface LoginModuleManager () 11 | @property (nonatomic, strong) BPDependency *dependency; 12 | @end 13 | 14 | @implementation LoginModuleManager 15 | +(NSBundle *)resourceBundle{ 16 | static NSBundle *imageBundle = nil; 17 | if (!imageBundle) { 18 | NSBundle *pod = [NSBundle bundleForClass:[self class]]; 19 | NSURL *url = [pod URLForResource:@"LoginPod" withExtension:@"bundle"]; 20 | imageBundle = [NSBundle bundleWithURL:url]; 21 | } 22 | return imageBundle; 23 | } 24 | 25 | + (instancetype)shared{ 26 | static LoginModuleManager *shared; 27 | static dispatch_once_t onceToken; 28 | dispatch_once(&onceToken, ^{ 29 | shared = [LoginModuleManager new]; 30 | }); 31 | return shared; 32 | } 33 | 34 | - (void)injectDependency:(BPDependency *)dependency{ 35 | self.dependency = dependency; 36 | } 37 | @end 38 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AccountVM.m: -------------------------------------------------------------------------------- 1 | // 2 | // AccountVM.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/11/1. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "AccountVM.h" 10 | 11 | 12 | @interface AccountVM () 13 | @property (nonatomic, strong) NSMutableArray *listeners; 14 | @end 15 | 16 | @implementation AccountVM 17 | 18 | - (void)updateUserInfo:(UserInfo *)info{ 19 | NSAttributedString *name = [[NSAttributedString alloc] initWithString:@"Bruce" attributes:@{NSFontAttributeName: [UIFont boldSystemFontOfSize:15]}]; 20 | [self.listeners enumerateObjectsUsingBlock:^(UserNameListenser _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 21 | obj(name); 22 | }]; 23 | } 24 | 25 | - (void)subscribeUserName:(void (^)(NSAttributedString * _Nullable))listener{ 26 | [self.listeners addObject:listener]; 27 | listener(nil); 28 | } 29 | 30 | - (NSMutableArray *)listeners{ 31 | if (!_listeners) { 32 | _listeners = [NSMutableArray array]; 33 | } 34 | return _listeners; 35 | } 36 | @end 37 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/README.md: -------------------------------------------------------------------------------- 1 | # LBCoordinator 2 | 3 | [![CI Status](https://img.shields.io/travis/Bruce-pac/LBCoordinator.svg?style=flat)](https://travis-ci.org/Bruce-pac/LBCoordinator) 4 | [![Version](https://img.shields.io/cocoapods/v/LBCoordinator.svg?style=flat)](https://cocoapods.org/pods/LBCoordinator) 5 | [![License](https://img.shields.io/cocoapods/l/LBCoordinator.svg?style=flat)](https://cocoapods.org/pods/LBCoordinator) 6 | [![Platform](https://img.shields.io/cocoapods/p/LBCoordinator.svg?style=flat)](https://cocoapods.org/pods/LBCoordinator) 7 | 8 | ## Example 9 | 10 | To run the example project, clone the repo, and run `pod install` from the Example directory first. 11 | 12 | ## Requirements 13 | 14 | ## Installation 15 | 16 | LBCoordinator is available through [CocoaPods](https://cocoapods.org). To install 17 | it, simply add the following line to your Podfile: 18 | 19 | ```ruby 20 | pod 'LBCoordinator' 21 | ``` 22 | 23 | ## Author 24 | 25 | Bruce-pac, Bruce_pac312@foxmail.com 26 | 27 | ## License 28 | 29 | LBCoordinator is available under the MIT license. See the LICENSE file for more info. 30 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod.debug.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/LBCoordinator" "${PODS_CONFIGURATION_BUILD_DIR}/ListPod" "${PODS_CONFIGURATION_BUILD_DIR}/LoginPod" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/LBCoordinator/LBCoordinator.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ListPod/ListPod.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LoginPod/LoginPod.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "LBCoordinator" -framework "ListPod" -framework "LoginPod" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod.release.xcconfig: -------------------------------------------------------------------------------- 1 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/LBCoordinator" "${PODS_CONFIGURATION_BUILD_DIR}/ListPod" "${PODS_CONFIGURATION_BUILD_DIR}/LoginPod" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/LBCoordinator/LBCoordinator.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/ListPod/ListPod.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/LoginPod/LoginPod.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "LBCoordinator" -framework "ListPod" -framework "LoginPod" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES 13 | -------------------------------------------------------------------------------- /Pods/ListPod/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 Bruce-pac 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Pods/LoginPod/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 Bruce-pac 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 Bruce-pac 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/LBNavigationCoordinator.h: -------------------------------------------------------------------------------- 1 | // 2 | // LBNavigationCoordinator.h 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/3. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "LBGenericCoordinator.h" 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface LBNavigationCoordinator : LBBaseCoordinator 14 | @property (nonatomic, strong, readonly) __kindof UINavigationController *rootVC; 15 | 16 | - (instancetype)initWithRootVC:(__kindof UINavigationController *)rootVC; 17 | 18 | - (void)presentViewController:(UIViewController *)viewController 19 | animated: (BOOL)flag 20 | completion:(void (^ _Nullable)(void))completion; 21 | - (void)dismissViewControllerAnimated: (BOOL)flag 22 | completion: (void (^ _Nullable)(void))completion; 23 | 24 | /// pop完成后的回调,子类可以重写 25 | /// @param toViewController pop完成后显示的控制器 26 | /// @param fromViewController 被pop的控制器 27 | - (void)didPopTransitionToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController; 28 | @end 29 | 30 | NS_ASSUME_NONNULL_END 31 | -------------------------------------------------------------------------------- /MainProject-MultiPod/PayViewModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // PayViewModel.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2020/4/10. 6 | // Copyright © 2020 Bruce. All rights reserved. 7 | // 8 | 9 | #import "PayViewModel.h" 10 | 11 | typedef void(^PayStatusSubscriber)(BOOL userName); 12 | 13 | @interface PayViewModel () 14 | @property (nonatomic, strong) NSMutableArray *subscribers; 15 | @end 16 | 17 | @implementation PayViewModel 18 | - (void)subscribePayStatus:(void (^)(BOOL))subscriber{ 19 | [self.subscribers addObject:subscriber]; 20 | } 21 | 22 | - (void)payWithId:(NSInteger)pId{ 23 | dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 24 | uint32_t num = arc4random(); 25 | [self.subscribers enumerateObjectsUsingBlock:^(PayStatusSubscriber _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { 26 | BOOL status = num % 2; 27 | obj(status); 28 | }]; 29 | }); 30 | } 31 | 32 | - (NSMutableArray *)subscribers{ 33 | if (!_subscribers) { 34 | _subscribers = [NSMutableArray array]; 35 | } 36 | return _subscribers; 37 | } 38 | @end 39 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Public/BPDependency.h: -------------------------------------------------------------------------------- 1 | // 2 | // BPDependency.h 3 | // LoginPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | #import 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @class UserInfo, LoginCoordinator; 14 | @protocol LoginCoordinatorDelegate 15 | -(void)loginFlow:(LoginCoordinator *)loginFlow onLoginSuccess:(UserInfo *)info; 16 | -(void)loginFlowOnFailure:(LoginCoordinator *)loginFlow; 17 | -(void)loginFlowOnTapClose:(LoginCoordinator *)loginFlow; 18 | @end 19 | 20 | @protocol LoginHttpClientType 21 | -(void)requestApi:(NSString *)url 22 | param:(NSDictionary *)parameter 23 | success:(void (^)(void))success 24 | failure:(void (^)(void))failure; 25 | @end 26 | 27 | @interface BPDependency : NSObject 28 | @property (nonatomic, strong, readonly) id coordinator; 29 | @property (nonatomic, strong, readonly) id httpClient; 30 | -(instancetype)initWithCoordinator:(id)coordinator 31 | httpClient:(id)httpClient; 32 | @end 33 | 34 | NS_ASSUME_NONNULL_END 35 | -------------------------------------------------------------------------------- /Pods/ListPod/ListPod/Classes/ListItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListItem.swift 3 | // ListPod 4 | // 5 | // Created by Bruce on 2019/10/31. 6 | // 7 | 8 | import Foundation 9 | 10 | @objcMembers public class ListItemOC: NSObject { 11 | 12 | let listItem: ListItem 13 | 14 | init(item: ListItem) { 15 | listItem = item 16 | } 17 | 18 | public var pId: Int { 19 | return listItem.id 20 | } 21 | public var title: String { 22 | return listItem.title 23 | } 24 | } 25 | 26 | struct ListItem { 27 | let id: Int 28 | let title: String 29 | 30 | } 31 | 32 | func makeItems() -> [ListItem] { 33 | return (0...20).map { (ele) -> ListItem in 34 | ListItem(id: ele, title: "I'm at \(ele) position") 35 | } 36 | } 37 | 38 | class ListViewModel { 39 | var items: [ListItem] = makeItems() 40 | private(set) lazy var cellModels: [ListCellModel] = { 41 | return self.items.map { return ListCellModel(item: $0) } 42 | }() 43 | 44 | } 45 | 46 | class ListCellModel { 47 | let title: NSAttributedString 48 | 49 | init(item: ListItem) { 50 | title = NSAttributedString(string: "\(item.id) \(item.title)", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 16), NSAttributedString.Key.foregroundColor: UIColor.black]) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - LBCoordinator (0.1.0) 3 | - ListPod (0.1.0): 4 | - LBCoordinator 5 | - LoginPod (0.1.0): 6 | - LBCoordinator 7 | 8 | DEPENDENCIES: 9 | - LBCoordinator (from `https://github.com/Bruce-pac/LBCoordinator.git`) 10 | - ListPod (from `https://github.com/Bruce-pac/ListPod.git`) 11 | - LoginPod (from `https://github.com/Bruce-pac/LoginPod.git`) 12 | 13 | EXTERNAL SOURCES: 14 | LBCoordinator: 15 | :git: https://github.com/Bruce-pac/LBCoordinator.git 16 | ListPod: 17 | :git: https://github.com/Bruce-pac/ListPod.git 18 | LoginPod: 19 | :git: https://github.com/Bruce-pac/LoginPod.git 20 | 21 | CHECKOUT OPTIONS: 22 | LBCoordinator: 23 | :commit: 0c49e348ae54453deebe8bef73256f553d29778e 24 | :git: https://github.com/Bruce-pac/LBCoordinator.git 25 | ListPod: 26 | :commit: d586b1d0fffd29a666085e26eab8747563fffb47 27 | :git: https://github.com/Bruce-pac/ListPod.git 28 | LoginPod: 29 | :commit: f705ed56fc3631eeaf7f2b64401af066e19f9e96 30 | :git: https://github.com/Bruce-pac/LoginPod.git 31 | 32 | SPEC CHECKSUMS: 33 | LBCoordinator: 022457f46029432f0d482e5609c851b9c5fb3ac3 34 | ListPod: b0852530616a57a272a63fa747ec5a1d193c20ee 35 | LoginPod: ecb60f74c27ad2271d9a7384ce883de07b20dd03 36 | 37 | PODFILE CHECKSUM: 8d77ba0b51e526e4dcde87bd1a451003376d9c36 38 | 39 | COCOAPODS: 1.8.4 40 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - LBCoordinator (0.1.0) 3 | - ListPod (0.1.0): 4 | - LBCoordinator 5 | - LoginPod (0.1.0): 6 | - LBCoordinator 7 | 8 | DEPENDENCIES: 9 | - LBCoordinator (from `https://github.com/Bruce-pac/LBCoordinator.git`) 10 | - ListPod (from `https://github.com/Bruce-pac/ListPod.git`) 11 | - LoginPod (from `https://github.com/Bruce-pac/LoginPod.git`) 12 | 13 | EXTERNAL SOURCES: 14 | LBCoordinator: 15 | :git: https://github.com/Bruce-pac/LBCoordinator.git 16 | ListPod: 17 | :git: https://github.com/Bruce-pac/ListPod.git 18 | LoginPod: 19 | :git: https://github.com/Bruce-pac/LoginPod.git 20 | 21 | CHECKOUT OPTIONS: 22 | LBCoordinator: 23 | :commit: 0c49e348ae54453deebe8bef73256f553d29778e 24 | :git: https://github.com/Bruce-pac/LBCoordinator.git 25 | ListPod: 26 | :commit: d586b1d0fffd29a666085e26eab8747563fffb47 27 | :git: https://github.com/Bruce-pac/ListPod.git 28 | LoginPod: 29 | :commit: f705ed56fc3631eeaf7f2b64401af066e19f9e96 30 | :git: https://github.com/Bruce-pac/LoginPod.git 31 | 32 | SPEC CHECKSUMS: 33 | LBCoordinator: 022457f46029432f0d482e5609c851b9c5fb3ac3 34 | ListPod: b0852530616a57a272a63fa747ec5a1d193c20ee 35 | LoginPod: ecb60f74c27ad2271d9a7384ce883de07b20dd03 36 | 37 | PODFILE CHECKSUM: 8d77ba0b51e526e4dcde87bd1a451003376d9c36 38 | 39 | COCOAPODS: 1.8.4 40 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AccountViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // AccountViewController.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/10/31. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "AccountViewController.h" 10 | 11 | @interface AccountViewController () 12 | @property (weak, nonatomic) IBOutlet UIButton *userName; 13 | @property (nonatomic, strong) AccountVM *vm; 14 | @end 15 | 16 | @implementation AccountViewController 17 | 18 | - (instancetype)initWithViewModel:(AccountVM *)vm{ 19 | self = [super initWithNibName:@"AccountViewController" bundle:nil]; 20 | if (self) { 21 | _vm = vm; 22 | } 23 | return self; 24 | } 25 | 26 | - (void)viewDidLoad { 27 | [super viewDidLoad]; 28 | __weak AccountViewController *weakSelf = self; 29 | [self.vm subscribeUserName:^(NSAttributedString * _Nullable userName) { 30 | [weakSelf.userName setAttributedTitle:userName forState:UIControlStateNormal]; 31 | }]; 32 | } 33 | 34 | - (IBAction)onTapHeadBtn:(id)sender { 35 | if ([self.delegate respondsToSelector:@selector(onTapAccountBtn:)]) { 36 | [self.delegate onTapAccountBtn:self]; 37 | } 38 | } 39 | 40 | /* 41 | #pragma mark - Navigation 42 | 43 | // In a storyboard-based application, you will often want to do a little preparation before navigation 44 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 45 | // Get the new view controller using [segue destinationViewController]. 46 | // Pass the selected object to the new view controller. 47 | } 48 | */ 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /MainProject-MultiPod/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIRequiredDeviceCapabilities 26 | 27 | armv7 28 | 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /MainProject-MultiPod/PayCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // PayCoordinator.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2020/4/7. 6 | // Copyright © 2020 Bruce. All rights reserved. 7 | // 8 | 9 | #import "PayCoordinator.h" 10 | #import "PayViewController.h" 11 | 12 | @interface PayCoordinator () 13 | @property (nonatomic, strong) PayViewController *entranceVC; 14 | @end 15 | 16 | @implementation PayCoordinator 17 | 18 | - (void)start{ 19 | PayViewController *pay = [[UIStoryboard storyboardWithName:@"PayViewController" bundle:nil] instantiateViewControllerWithIdentifier:@"PayViewController"]; 20 | PayViewModel *vm = [[PayViewModel alloc] init]; 21 | pay.payViewModel = vm; 22 | __weak typeof(self) weakSelf = self; 23 | [vm subscribePayStatus:^(BOOL status) { 24 | __strong PayCoordinator* self = weakSelf; 25 | if ([self.delegate respondsToSelector:@selector(payFlow:didFinishWithStatus:)]) { 26 | [self.delegate payFlow:self didFinishWithStatus:status]; 27 | } 28 | }]; 29 | self.entranceVC = pay; 30 | [self.rootVC pushViewController:pay animated:YES]; 31 | } 32 | 33 | - (void)startWithPId:(NSInteger)pId{ 34 | [self start]; 35 | PayViewController *pay = (PayViewController *)self.rootVC.topViewController; 36 | pay.pId = pId; 37 | } 38 | 39 | - (void)didPopTransitionToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController{ 40 | if (fromViewController == self.entranceVC) { 41 | if (self.didCompleted) { 42 | self.didCompleted(self); 43 | } 44 | } 45 | } 46 | @end 47 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Public/LoginCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // LoginCoordinator.m 3 | // LoginPod 4 | // 5 | // Created by Bruce on 2019/10/30. 6 | // 7 | 8 | #import "LoginCoordinator.h" 9 | #import "LoginViewController.h" 10 | #import "LoginViewModel.h" 11 | #import "LoginModuleManager.h" 12 | #import "UserInfo.h" 13 | 14 | @interface LoginCoordinator () 15 | 16 | @end 17 | 18 | @implementation LoginCoordinator 19 | - (void)start{ 20 | LoginViewModel *vm = [LoginViewModel new]; 21 | LoginViewController *vc = [[LoginViewController alloc] initWithViewModel:vm]; 22 | vc.delegate = self; 23 | [self.rootVC pushViewController:vc animated:NO]; 24 | } 25 | 26 | - (void)loginResult:(BOOL)result vc:(nonnull UIViewController *)vc { 27 | NSString *title = result ? @"success" : @"failure"; 28 | UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleAlert]; 29 | [alert addAction:[UIAlertAction actionWithTitle:@"sure" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 30 | [vc dismissViewControllerAnimated:result completion:^{ 31 | if (result) { 32 | [[[LoginModuleManager shared] dependency].coordinator loginFlow:self onLoginSuccess:[UserInfo new]]; 33 | }else{ 34 | [[[LoginModuleManager shared] dependency].coordinator loginFlowOnFailure:self]; 35 | } 36 | }]; 37 | }]]; 38 | [vc presentViewController:alert animated:true completion:nil]; 39 | } 40 | 41 | - (void)onTapCloseBtnWith:(UIViewController *)vc{ 42 | [[[LoginModuleManager shared] dependency].coordinator loginFlowOnTapClose:self]; 43 | } 44 | 45 | @end 46 | -------------------------------------------------------------------------------- /MainProject-MultiPod/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/LBBaseCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // LBBaseCoordinator.m 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/3. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "LBBaseCoordinator.h" 10 | #import "UIViewController+LBCoordinator.h" 11 | 12 | @interface LBBaseCoordinator () 13 | @property (nonatomic, copy, readwrite) NSString *identifier; 14 | @property (nonatomic, strong) NSMutableDictionary> *childCoordinatorContainer; 15 | 16 | @end 17 | 18 | @implementation LBBaseCoordinator 19 | 20 | - (void)start{ 21 | NSAssert(NO, @"%@ not implementated '-(void)start'", [self class]); 22 | } 23 | 24 | - (void)addChildCoordinator:(id)child{ 25 | [self.childCoordinatorContainer setObject:child forKey:child.identifier]; 26 | child.parentCoordinator = self; 27 | } 28 | 29 | - (void)startChildCoordinator:(id)child{ 30 | [self addChildCoordinator:child]; 31 | [child start]; 32 | } 33 | 34 | - (void)stopChildCoordinator:(id)child{ 35 | child.parentCoordinator = nil; 36 | [self.childCoordinatorContainer removeObjectForKey:child.identifier]; 37 | } 38 | 39 | - (NSArray> *)childCoordinators{ 40 | return self.childCoordinatorContainer.allValues; 41 | } 42 | 43 | - (UIResponder *)coordinatingResponder{ 44 | return (UIResponder *)self.parentCoordinator; 45 | } 46 | 47 | #pragma mark - Lazy load 48 | 49 | - (NSString *)identifier{ 50 | if (!_identifier) { 51 | _identifier = NSStringFromClass([self class]); 52 | } 53 | return _identifier; 54 | } 55 | 56 | - (NSMutableDictionary> *)childCoordinatorContainer{ 57 | if (!_childCoordinatorContainer) { 58 | _childCoordinatorContainer = [NSMutableDictionary dictionary]; 59 | } 60 | return _childCoordinatorContainer; 61 | } 62 | 63 | @end 64 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Private/LoginViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // LoginViewController.m 3 | // LoginPod 4 | // 5 | // Created by gxy on 2019/9/15. 6 | // 7 | 8 | #import "LoginViewController.h" 9 | #import "LoginModuleManager.h" 10 | #import "UserInfo.h" 11 | 12 | @interface LoginViewController () 13 | @property (nonatomic, strong) UIActivityIndicatorView *netIndicator; 14 | @property (nonatomic, strong) LoginViewModel *viewModel; 15 | @end 16 | 17 | @implementation LoginViewController 18 | 19 | - (instancetype)init{ 20 | self = [super init]; 21 | if (self) { 22 | self = [[UIStoryboard storyboardWithName:@"LoginViewController" bundle:[LoginModuleManager resourceBundle]] instantiateInitialViewController]; 23 | } 24 | return self; 25 | } 26 | 27 | - (instancetype)initWithViewModel:(LoginViewModel *)viewModel{ 28 | self = [self init]; 29 | if (self) { 30 | _viewModel = viewModel; 31 | } 32 | return self; 33 | } 34 | 35 | - (void)viewDidLoad { 36 | [super viewDidLoad]; 37 | self.netIndicator.center = self.view.center; 38 | [self.view addSubview:self.netIndicator]; 39 | } 40 | 41 | - (IBAction)signIn:(id)sender { 42 | [self.netIndicator startAnimating]; 43 | [self.viewModel loginWithCompletion:^(BOOL success) { 44 | [self.netIndicator stopAnimating]; 45 | if ([self.delegate respondsToSelector:@selector(loginResult:vc:)]) { 46 | [self.delegate loginResult:success vc:self]; 47 | } 48 | }]; 49 | 50 | } 51 | - (IBAction)onTapClose:(id)sender { 52 | if ([self.delegate respondsToSelector:@selector(onTapCloseBtnWith:)]) { 53 | [self.delegate onTapCloseBtnWith:self]; 54 | } 55 | } 56 | 57 | -(UIActivityIndicatorView *)netIndicator{ 58 | if (!_netIndicator) { 59 | _netIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 60 | } 61 | return _netIndicator; 62 | } 63 | 64 | @end 65 | -------------------------------------------------------------------------------- /Pods/ListPod/ListPod/Classes/ListCoordinator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListCoordinator.swift 3 | // ListPod 4 | // 5 | // Created by Bruce on 2019/10/31. 6 | // 7 | 8 | import Foundation 9 | import LBCoordinator 10 | 11 | @objcMembers public class LBCoordinatorEvent: NSObject { 12 | public static let detailBToAccount = LBCoordinatorEventName.detailBToAccount 13 | } 14 | 15 | public extension LBCoordinatorEventName { 16 | static var detailBToAccount = LBCoordinatorEventName(rawValue: "detailBToAccount") 17 | } 18 | 19 | @objcMembers public class ListCoordinator: LBNavigationCoordinator { 20 | override public func start() { 21 | let list = ListViewController() 22 | list.delegate = self 23 | list.viewModel = ListViewModel() 24 | self.rootVC.pushViewController(list, animated: true) 25 | } 26 | 27 | } 28 | 29 | extension ListCoordinator: ListViewControllerDelegate{ 30 | func onSelect(item: ListItem) { 31 | // 模拟A/B测试 32 | let isiPhoneX = arc4random_uniform(100).isMultiple(of: 2) 33 | if isiPhoneX { 34 | let detail = DetailTestAViewController(item: item) 35 | detail.delegate = self 36 | self.rootVC.pushViewController(detail, animated: true) 37 | }else{ 38 | let detail = DetailTestBViewController(item: item) 39 | self.rootVC.pushViewController(detail, animated: true) 40 | } 41 | } 42 | 43 | } 44 | 45 | extension ListCoordinator: DetailTestAViewControllerDelegate { 46 | func onTapPay(_ vc: DetailTestAViewController) { 47 | ModuleManager.shared.dependency?.coordinator.listCoordinator(self, jumpPayPageWith: ListItemOC(item: vc.item)) 48 | } 49 | } 50 | 51 | //写这个是因为无法在oc里调用泛型类,所以曲线救国。即使ListCoordinator明明是继承的oc的泛型类。。。 52 | @objcMembers public class ListCoordinatorFactory: NSObject{ 53 | public func makeCoordinator(with rootNav: UINavigationController) -> LBCoordinating { 54 | let list = ListCoordinator(rootVC: rootNav) 55 | return list 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /MainProject-MultiPod/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Pods/LBCoordinator/LBCoordinator/Classes/LBNavigationCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // LBNavigationCoordinator.m 3 | // Tendaisy 4 | // 5 | // Created by Bruce on 2019/12/3. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "LBNavigationCoordinator.h" 10 | #import "UIViewController+LBCoordinator.h" 11 | 12 | @interface LBNavigationCoordinator () 13 | @property (nonatomic, strong) NSMutableArray *viewControllers; 14 | @property (nonatomic, strong, readwrite) __kindof UINavigationController *rootVC; 15 | @end 16 | 17 | @implementation LBNavigationCoordinator 18 | 19 | - (instancetype)initWithRootVC:(__kindof UINavigationController *)rootVC { 20 | self = [super init]; 21 | if (self) { 22 | _rootVC = rootVC; 23 | _rootVC.lb_coordinator = self; 24 | _rootVC.delegate = self; 25 | } 26 | return self; 27 | } 28 | 29 | - (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^ _Nullable)(void))completion{ 30 | viewControllerToPresent.lb_coordinator = self; 31 | [self.rootVC presentViewController:viewControllerToPresent animated:flag completion:completion]; 32 | } 33 | 34 | - (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^ _Nullable)(void))completion{ 35 | [self.rootVC dismissViewControllerAnimated:flag completion:completion]; 36 | } 37 | 38 | - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated{ 39 | UIViewController *fromViewController = [navigationController.transitionCoordinator viewControllerForKey:UITransitionContextFromViewControllerKey]; 40 | if (!fromViewController) { 41 | return; 42 | } 43 | if ([navigationController.viewControllers containsObject:fromViewController]) { 44 | return; 45 | } 46 | [self didPopTransitionToViewController:viewController fromViewController:fromViewController]; 47 | } 48 | 49 | - (void)didPopTransitionToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController{ 50 | 51 | } 52 | 53 | @end 54 | -------------------------------------------------------------------------------- /Pods/ListPod/ListPod/Classes/ListViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ListViewController.swift 3 | // ListPod 4 | // 5 | // Created by gxy on 2019/9/14. 6 | // 7 | 8 | import UIKit 9 | 10 | protocol ListViewControllerDelegate: AnyObject { 11 | func onSelect(item: ListItem) 12 | } 13 | 14 | class ListViewController: UIViewController { 15 | 16 | let reuseId = "reuseId" 17 | 18 | weak var delegate: ListViewControllerDelegate? 19 | 20 | var viewModel: ListViewModel! 21 | 22 | lazy var tableView: UITableView = { 23 | let tableView = UITableView(frame: self.view.bounds, style: .plain) 24 | tableView.register(ListCell.self, forCellReuseIdentifier: self.reuseId) 25 | tableView.dataSource = self 26 | tableView.delegate = self 27 | tableView.allowsSelection = true 28 | return tableView 29 | }() 30 | 31 | override public func viewDidLoad() { 32 | super.viewDidLoad() 33 | view.addSubview(tableView) 34 | } 35 | } 36 | 37 | extension ListViewController: UITableViewDataSource, UITableViewDelegate { 38 | public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 39 | return self.viewModel.cellModels.count 40 | } 41 | 42 | public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 43 | guard let cell = tableView.dequeueReusableCell(withIdentifier: reuseId, for: indexPath) as? ListCell else { fatalError() } 44 | cell.selectionStyle = .blue 45 | cell.cellModel = self.viewModel.cellModels[indexPath.row] 46 | return cell 47 | } 48 | 49 | public func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 50 | let item = self.viewModel.items[indexPath.row] 51 | delegate?.onSelect(item: item) 52 | } 53 | } 54 | 55 | class ListCell: UITableViewCell { 56 | 57 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { 58 | super.init(style: .default, reuseIdentifier: reuseIdentifier) 59 | } 60 | 61 | var cellModel: ListCellModel? { 62 | didSet { 63 | textLabel?.attributedText = self.cellModel?.title 64 | } 65 | } 66 | 67 | required init?(coder: NSCoder) { 68 | fatalError("init(coder:) has not been implemented") 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/9/14. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "MainModuleManager.h" 11 | #import "AppCoordinator.h" 12 | #import "MainTabBarViewController.h" 13 | 14 | 15 | @interface AppDelegate () 16 | @property (nonatomic, strong) AppCoordinator *appCoordinator; 17 | @end 18 | 19 | @implementation AppDelegate 20 | 21 | 22 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 23 | // Override point for customization after application launch. 24 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];; 25 | MainTabBarViewController *root = [MainTabBarViewController new]; 26 | self.appCoordinator = [[AppCoordinator alloc] initWithRootVC:root]; 27 | self.window.rootViewController = root; 28 | [self.appCoordinator start]; 29 | [MainModuleManager injectAllDependencyWith:self.appCoordinator]; 30 | [self.window makeKeyAndVisible]; 31 | return YES; 32 | } 33 | 34 | - (void)applicationWillResignActive:(UIApplication *)application { 35 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 36 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 37 | } 38 | 39 | 40 | - (void)applicationDidEnterBackground:(UIApplication *)application { 41 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 42 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 43 | } 44 | 45 | 46 | - (void)applicationWillEnterForeground:(UIApplication *)application { 47 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 48 | } 49 | 50 | 51 | - (void)applicationDidBecomeActive:(UIApplication *)application { 52 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 53 | } 54 | 55 | 56 | - (void)applicationWillTerminate:(UIApplication *)application { 57 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 58 | } 59 | 60 | 61 | @end 62 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AccountViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /MainProject-MultiPod/AppCoordinator.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppCoordinator.m 3 | // MainProject-MultiPod 4 | // 5 | // Created by gxy on 2019/10/28. 6 | // Copyright © 2019 Bruce. All rights reserved. 7 | // 8 | 9 | #import "AppCoordinator.h" 10 | #import 11 | #import 12 | #import "AccountCoordinator.h" 13 | 14 | @interface AppCoordinator () 15 | @property (nonatomic, weak) MainTabBarViewController *rootVC; 16 | @property (nonatomic, weak) AccountCoordinator *accountCoordinator; 17 | @end 18 | 19 | @implementation AppCoordinator 20 | 21 | @dynamic rootVC; 22 | 23 | - (void)start{ 24 | UINavigationController *listNav = [UINavigationController new]; 25 | ListCoordinator *listCoordinator = [[ListCoordinator alloc] initWithRootVC:listNav]; 26 | [self startChildCoordinator:listCoordinator]; 27 | 28 | UINavigationController *accountNav = [UINavigationController new]; 29 | AccountCoordinator *account = [[AccountCoordinator alloc] initWithRootVC:accountNav]; 30 | account.delegate = self; 31 | [self startChildCoordinator:account]; 32 | self.accountCoordinator = account; 33 | accountNav.title = @"account"; 34 | listNav.title = @"list"; 35 | self.rootVC.viewControllers = @[listNav, accountNav]; 36 | } 37 | 38 | - (void)startLoginFlow{ 39 | UINavigationController *loginRoot = [UINavigationController new]; 40 | LoginCoordinator *loginFlow = [[LoginCoordinator alloc] initWithRootVC:loginRoot]; 41 | [self startChildCoordinator:loginFlow]; 42 | [self.rootVC presentViewController:loginRoot animated:YES completion:nil]; 43 | } 44 | 45 | - (void)accountCoordinatorOnTapAvatar:(nonnull AccountCoordinator *)account { 46 | [self startLoginFlow]; 47 | } 48 | 49 | /* 50 | 层级深的时候利用响应者链也可以跨组件调用 51 | */ 52 | - (void)lb_coordinatingMessage:(LBCoordinatorEventName)event object:(id)object userInfo:(NSDictionary *)userInfo{ 53 | if ([event isEqualToString: LBCoordinatorEvent.detailBToAccount]) { 54 | self.rootVC.selectedViewController = self.accountCoordinator.rootVC; 55 | } 56 | } 57 | 58 | @end 59 | 60 | @implementation AppCoordinator (ListPodCoordinatorTypeImp) 61 | 62 | - (void)listCoordinator:(ListCoordinator *)coordinator jumpPayPageWith:(ListItemOC *)data{ 63 | uint32_t num = arc4random(); 64 | BOOL isLogin = num % 2; 65 | 66 | if (isLogin) { 67 | PayCoordinator *pay = [[PayCoordinator alloc] initWithRootVC:coordinator.rootVC]; 68 | pay.delegate = self; 69 | pay.didCompleted = ^(__kindof LBBaseCoordinator * _Nonnull coordinator) { 70 | [self stopChildCoordinator:coordinator]; 71 | }; 72 | [self addChildCoordinator:pay]; 73 | [pay startWithPId:data.pId]; 74 | }else{ 75 | [self startLoginFlow]; 76 | } 77 | } 78 | 79 | @end 80 | 81 | @implementation AppCoordinator (LoginCoordinatorDelegateImp) 82 | 83 | - (void)loginFlowOnTapClose:(LoginCoordinator *)loginFlow{ 84 | [self.rootVC dismissViewControllerAnimated:YES completion:^{ 85 | [self stopChildCoordinator:loginFlow]; 86 | }]; 87 | } 88 | 89 | - (void)loginFlowOnFailure:(LoginCoordinator *)loginFlow{ 90 | [self stopChildCoordinator:loginFlow]; 91 | } 92 | 93 | - (void)loginFlow:(LoginCoordinator *)loginFlow onLoginSuccess:(UserInfo *)info{ 94 | [self stopChildCoordinator:loginFlow]; 95 | [self.accountCoordinator updateUserInfo:info]; 96 | } 97 | 98 | @end 99 | 100 | @implementation AppCoordinator (PayCoordinatorDelegateImp) 101 | 102 | - (void)payFlow:(PayCoordinator *)payFlow didFinishWithStatus:(BOOL)payStatus{ 103 | NSLog(@"%d", payStatus); 104 | } 105 | 106 | @end 107 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## LBCoordinator 5 | 6 | Copyright (c) 2020 Bruce-pac 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | 27 | ## ListPod 28 | 29 | Copyright (c) 2019 Bruce-pac 30 | 31 | Permission is hereby granted, free of charge, to any person obtaining a copy 32 | of this software and associated documentation files (the "Software"), to deal 33 | in the Software without restriction, including without limitation the rights 34 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 35 | copies of the Software, and to permit persons to whom the Software is 36 | furnished to do so, subject to the following conditions: 37 | 38 | The above copyright notice and this permission notice shall be included in 39 | all copies or substantial portions of the Software. 40 | 41 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 42 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 43 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 44 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 45 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 46 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 47 | THE SOFTWARE. 48 | 49 | 50 | ## LoginPod 51 | 52 | Copyright (c) 2019 Bruce-pac 53 | 54 | Permission is hereby granted, free of charge, to any person obtaining a copy 55 | of this software and associated documentation files (the "Software"), to deal 56 | in the Software without restriction, including without limitation the rights 57 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 58 | copies of the Software, and to permit persons to whom the Software is 59 | furnished to do so, subject to the following conditions: 60 | 61 | The above copyright notice and this permission notice shall be included in 62 | all copies or substantial portions of the Software. 63 | 64 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 65 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 66 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 67 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 68 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 69 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 70 | THE SOFTWARE. 71 | 72 | Generated by CocoaPods - https://cocoapods.org 73 | -------------------------------------------------------------------------------- /MainProject-MultiPod/PayViewController.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 31 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Pods/ListPod/ListPod/Classes/DetailViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DetailViewController.swift 3 | // ListPod 4 | // 5 | // Created by gxy on 2019/9/14. 6 | // 7 | 8 | import UIKit 9 | import LBCoordinator 10 | 11 | protocol DetailTestAViewControllerDelegate: AnyObject { 12 | func onTapPay(_ vc: DetailTestAViewController) 13 | } 14 | 15 | class DetailTestAViewController: UIViewController { 16 | 17 | lazy var textView: UITextView = { 18 | let textView = UITextView(frame: self.view.bounds) 19 | textView.textAlignment = NSTextAlignment.center 20 | textView.font = UIFont.systemFont(ofSize: 20) 21 | textView.isEditable = false 22 | return textView 23 | }() 24 | 25 | let item: ListItem 26 | 27 | weak var delegate: DetailTestAViewControllerDelegate? 28 | 29 | init(item: ListItem) { 30 | self.item = item 31 | super.init(nibName: nil, bundle: nil) 32 | } 33 | 34 | required init?(coder aDecoder: NSCoder) { 35 | fatalError("init(coder:) has not been implemented") 36 | } 37 | 38 | override func viewDidLoad() { 39 | super.viewDidLoad() 40 | view.addSubview(textView) 41 | textView.text = """ 42 | A Test 43 | I'm the detail of \(item.id) row item. 44 | \(item.title) 45 | """ 46 | 47 | let payItem = UIBarButtonItem(title: "pay", style: .plain, target: self, action: #selector(pay)) 48 | 49 | navigationItem.rightBarButtonItem = payItem 50 | } 51 | 52 | @objc func pay() { 53 | delegate?.onTapPay(self) 54 | } 55 | } 56 | 57 | class DetailTestBViewController: UIViewController { 58 | 59 | lazy var imageView: UIImageView = { 60 | let imgView = UIImageView(image: UIImage.imageWith(UIColor.red)) 61 | return imgView 62 | }() 63 | lazy var textView: UITextView = { 64 | let textView = UITextView(frame: self.view.bounds) 65 | textView.textAlignment = NSTextAlignment.center 66 | textView.font = UIFont.systemFont(ofSize: 20) 67 | textView.isEditable = false 68 | return textView 69 | }() 70 | 71 | lazy var accountBtn: UIButton = { 72 | let btn = UIButton(type: .custom) 73 | btn.setTitle("去Account个人中心", for: .normal) 74 | btn.setTitleColor(.black, for: .normal) 75 | btn.addTarget(self, action: #selector(onTapAccountBtn(_:)), for: .touchUpInside) 76 | return btn 77 | }() 78 | 79 | let item: ListItem 80 | 81 | init(item: ListItem) { 82 | self.item = item 83 | super.init(nibName: nil, bundle: nil) 84 | } 85 | 86 | required init?(coder aDecoder: NSCoder) { 87 | fatalError("init(coder:) has not been implemented") 88 | } 89 | 90 | override func viewDidLoad() { 91 | super.viewDidLoad() 92 | view.backgroundColor = .white 93 | view.addSubview(imageView) 94 | view.addSubview(textView) 95 | view.addSubview(accountBtn) 96 | textView.text = """ 97 | B Test 98 | I'm the detail of \(item.id) row item. 99 | \(item.title) 100 | """ 101 | } 102 | 103 | override func viewDidLayoutSubviews() { 104 | super.viewDidLayoutSubviews() 105 | imageView.frame = CGRect(x: 100, y: 200, width: 100, height: 100) 106 | textView.frame = CGRect(x: 0, y: imageView.frame.maxY + 50, width: view.frame.width, height: 300) 107 | accountBtn.frame = CGRect(x: 100, y: 100, width: 200, height: 30) 108 | } 109 | 110 | @objc func onTapAccountBtn(_ sender: UIButton) { 111 | lb_coordinatingMessage(LBCoordinatorEventName.detailBToAccount, object: nil, userInfo: nil) 112 | } 113 | } 114 | 115 | extension UIImage { 116 | static func imageWith(_ color: UIColor) -> UIImage? { 117 | let size = CGSize(width: 1, height: 1) 118 | UIGraphicsBeginImageContext(size) 119 | 120 | guard let context = UIGraphicsGetCurrentContext() else { 121 | return nil 122 | } 123 | context.setFillColor(color.cgColor) 124 | context.fill(CGRect(origin: CGPoint.zero, size: size)) 125 | guard let image = UIGraphicsGetImageFromCurrentImageContext() else { return nil } 126 | UIGraphicsEndImageContext() 127 | return image 128 | } 129 | } 130 | -------------------------------------------------------------------------------- /Pods/LoginPod/LoginPod/Classes/Private/LoginViewController.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 39 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2020 Bruce-pac <Bruce_pac312@foxmail.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | LBCoordinator 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Copyright (c) 2019 Bruce-pac <Bruce_pac312@foxmail.com> 47 | 48 | Permission is hereby granted, free of charge, to any person obtaining a copy 49 | of this software and associated documentation files (the "Software"), to deal 50 | in the Software without restriction, including without limitation the rights 51 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 52 | copies of the Software, and to permit persons to whom the Software is 53 | furnished to do so, subject to the following conditions: 54 | 55 | The above copyright notice and this permission notice shall be included in 56 | all copies or substantial portions of the Software. 57 | 58 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 59 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 60 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 61 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 62 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 63 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 64 | THE SOFTWARE. 65 | 66 | License 67 | MIT 68 | Title 69 | ListPod 70 | Type 71 | PSGroupSpecifier 72 | 73 | 74 | FooterText 75 | Copyright (c) 2019 Bruce-pac <Bruce_pac312@foxmail.com> 76 | 77 | Permission is hereby granted, free of charge, to any person obtaining a copy 78 | of this software and associated documentation files (the "Software"), to deal 79 | in the Software without restriction, including without limitation the rights 80 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 81 | copies of the Software, and to permit persons to whom the Software is 82 | furnished to do so, subject to the following conditions: 83 | 84 | The above copyright notice and this permission notice shall be included in 85 | all copies or substantial portions of the Software. 86 | 87 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 88 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 89 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 90 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 91 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 92 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 93 | THE SOFTWARE. 94 | 95 | License 96 | MIT 97 | Title 98 | LoginPod 99 | Type 100 | PSGroupSpecifier 101 | 102 | 103 | FooterText 104 | Generated by CocoaPods - https://cocoapods.org 105 | Title 106 | 107 | Type 108 | PSGroupSpecifier 109 | 110 | 111 | StringsTable 112 | Acknowledgements 113 | Title 114 | Acknowledgements 115 | 116 | 117 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 90 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Copies the bcsymbolmap files of a vendored framework 113 | install_bcsymbolmap() { 114 | local bcsymbolmap_path="$1" 115 | local destination="${BUILT_PRODUCTS_DIR}" 116 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 117 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 118 | } 119 | 120 | # Signs a framework with the provided identity 121 | code_sign_if_enabled() { 122 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 123 | # Use the current code_sign_identity 124 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 125 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 126 | 127 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 128 | code_sign_cmd="$code_sign_cmd &" 129 | fi 130 | echo "$code_sign_cmd" 131 | eval "$code_sign_cmd" 132 | fi 133 | } 134 | 135 | # Strip invalid architectures 136 | strip_invalid_archs() { 137 | binary="$1" 138 | # Get architectures for current target binary 139 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 140 | # Intersect them with the architectures we are building for 141 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 142 | # If there are no archs supported by this binary then warn the user 143 | if [[ -z "$intersected_archs" ]]; then 144 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 145 | STRIP_BINARY_RETVAL=0 146 | return 147 | fi 148 | stripped="" 149 | for arch in $binary_archs; do 150 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 151 | # Strip non-valid architectures in-place 152 | lipo -remove "$arch" -output "$binary" "$binary" 153 | stripped="$stripped $arch" 154 | fi 155 | done 156 | if [[ "$stripped" ]]; then 157 | echo "Stripped $binary of architectures:$stripped" 158 | fi 159 | STRIP_BINARY_RETVAL=1 160 | } 161 | 162 | 163 | if [[ "$CONFIGURATION" == "Debug" ]]; then 164 | install_framework "${BUILT_PRODUCTS_DIR}/LBCoordinator/LBCoordinator.framework" 165 | install_framework "${BUILT_PRODUCTS_DIR}/ListPod/ListPod.framework" 166 | install_framework "${BUILT_PRODUCTS_DIR}/LoginPod/LoginPod.framework" 167 | fi 168 | if [[ "$CONFIGURATION" == "Release" ]]; then 169 | install_framework "${BUILT_PRODUCTS_DIR}/LBCoordinator/LBCoordinator.framework" 170 | install_framework "${BUILT_PRODUCTS_DIR}/ListPod/ListPod.framework" 171 | install_framework "${BUILT_PRODUCTS_DIR}/LoginPod/LoginPod.framework" 172 | fi 173 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 174 | wait 175 | fi 176 | -------------------------------------------------------------------------------- /MainProject-MultiPod.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 32049195236AE30C00C53E33 /* MainTabBarViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 32049194236AE30C00C53E33 /* MainTabBarViewController.m */; }; 11 | 8456AC7E2367388C0009AEF7 /* AppCoordinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 8456AC7D2367388C0009AEF7 /* AppCoordinator.m */; }; 12 | 8456AC8123673B700009AEF7 /* PayViewController.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8456AC8023673B700009AEF7 /* PayViewController.storyboard */; }; 13 | 8456AC88236B30490009AEF7 /* AccountViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8456AC86236B30490009AEF7 /* AccountViewController.m */; }; 14 | 8456AC89236B30490009AEF7 /* AccountViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8456AC87236B30490009AEF7 /* AccountViewController.xib */; }; 15 | 8456AC8C236B42590009AEF7 /* AccountVM.m in Sources */ = {isa = PBXBuildFile; fileRef = 8456AC8B236B42590009AEF7 /* AccountVM.m */; }; 16 | 847D4ECA243C88A7006EB3A3 /* AccountCoordinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 847D4EC9243C88A7006EB3A3 /* AccountCoordinator.m */; }; 17 | 847D4ECD243C8EB1006EB3A3 /* PayCoordinator.m in Sources */ = {isa = PBXBuildFile; fileRef = 847D4ECC243C8EB1006EB3A3 /* PayCoordinator.m */; }; 18 | 847D4ED224404607006EB3A3 /* PayViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 847D4ED124404607006EB3A3 /* PayViewModel.m */; }; 19 | 84D21F1B232D13B800859622 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D21F1A232D13B800859622 /* AppDelegate.m */; }; 20 | 84D21F1E232D13B800859622 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D21F1D232D13B800859622 /* ViewController.m */; }; 21 | 84D21F23232D13BB00859622 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 84D21F22232D13BB00859622 /* Assets.xcassets */; }; 22 | 84D21F26232D13BB00859622 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84D21F24232D13BB00859622 /* LaunchScreen.storyboard */; }; 23 | 84D21F29232D13BB00859622 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D21F28232D13BB00859622 /* main.m */; }; 24 | 84D7967C23326B2400F5538E /* MainModuleManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D7967B23326B2400F5538E /* MainModuleManager.m */; }; 25 | 84D7967F23326CEB00F5538E /* BPHttpClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D7967D23326CEB00F5538E /* BPHttpClient.m */; }; 26 | 84D796822332717200F5538E /* PayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 84D796812332717200F5538E /* PayViewController.m */; }; 27 | 85B3D43020FA0F8F8B572108 /* Pods_MainProject_MultiPod.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FC1E3278538F1E3686EDEFAC /* Pods_MainProject_MultiPod.framework */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXFileReference section */ 31 | 32049193236AE30C00C53E33 /* MainTabBarViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainTabBarViewController.h; sourceTree = ""; }; 32 | 32049194236AE30C00C53E33 /* MainTabBarViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainTabBarViewController.m; sourceTree = ""; }; 33 | 79F584E5217FECCEB2034230 /* Pods-MainProject-MultiPod.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MainProject-MultiPod.release.xcconfig"; path = "Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod.release.xcconfig"; sourceTree = ""; }; 34 | 8456AC7C2367388C0009AEF7 /* AppCoordinator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppCoordinator.h; sourceTree = ""; }; 35 | 8456AC7D2367388C0009AEF7 /* AppCoordinator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppCoordinator.m; sourceTree = ""; }; 36 | 8456AC8023673B700009AEF7 /* PayViewController.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = PayViewController.storyboard; sourceTree = ""; }; 37 | 8456AC85236B30490009AEF7 /* AccountViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccountViewController.h; sourceTree = ""; }; 38 | 8456AC86236B30490009AEF7 /* AccountViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AccountViewController.m; sourceTree = ""; }; 39 | 8456AC87236B30490009AEF7 /* AccountViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AccountViewController.xib; sourceTree = ""; }; 40 | 8456AC8A236B42590009AEF7 /* AccountVM.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccountVM.h; sourceTree = ""; }; 41 | 8456AC8B236B42590009AEF7 /* AccountVM.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AccountVM.m; sourceTree = ""; }; 42 | 847D4EC8243C88A7006EB3A3 /* AccountCoordinator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccountCoordinator.h; sourceTree = ""; }; 43 | 847D4EC9243C88A7006EB3A3 /* AccountCoordinator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AccountCoordinator.m; sourceTree = ""; }; 44 | 847D4ECB243C8EB1006EB3A3 /* PayCoordinator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PayCoordinator.h; sourceTree = ""; }; 45 | 847D4ECC243C8EB1006EB3A3 /* PayCoordinator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PayCoordinator.m; sourceTree = ""; }; 46 | 847D4ED024404607006EB3A3 /* PayViewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PayViewModel.h; sourceTree = ""; }; 47 | 847D4ED124404607006EB3A3 /* PayViewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PayViewModel.m; sourceTree = ""; }; 48 | 84D21F16232D13B800859622 /* MainProject-MultiPod.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "MainProject-MultiPod.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 84D21F19232D13B800859622 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 50 | 84D21F1A232D13B800859622 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 51 | 84D21F1C232D13B800859622 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 52 | 84D21F1D232D13B800859622 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 53 | 84D21F22232D13BB00859622 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 54 | 84D21F25232D13BB00859622 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 55 | 84D21F27232D13BB00859622 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | 84D21F28232D13BB00859622 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 57 | 84D7967A23326B2400F5538E /* MainModuleManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainModuleManager.h; sourceTree = ""; }; 58 | 84D7967B23326B2400F5538E /* MainModuleManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MainModuleManager.m; sourceTree = ""; }; 59 | 84D7967D23326CEB00F5538E /* BPHttpClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BPHttpClient.m; sourceTree = ""; }; 60 | 84D7967E23326CEB00F5538E /* BPHttpClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BPHttpClient.h; sourceTree = ""; }; 61 | 84D796802332717200F5538E /* PayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PayViewController.h; sourceTree = ""; }; 62 | 84D796812332717200F5538E /* PayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PayViewController.m; sourceTree = ""; }; 63 | C9C824F7FAD5D51FA89ED6F8 /* Pods-MainProject-MultiPod.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MainProject-MultiPod.debug.xcconfig"; path = "Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod.debug.xcconfig"; sourceTree = ""; }; 64 | FC1E3278538F1E3686EDEFAC /* Pods_MainProject_MultiPod.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MainProject_MultiPod.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | /* End PBXFileReference section */ 66 | 67 | /* Begin PBXFrameworksBuildPhase section */ 68 | 84D21F13232D13B800859622 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | 85B3D43020FA0F8F8B572108 /* Pods_MainProject_MultiPod.framework in Frameworks */, 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | /* End PBXFrameworksBuildPhase section */ 77 | 78 | /* Begin PBXGroup section */ 79 | 23EB13E0FDCAB42F5C3F30D7 /* Pods */ = { 80 | isa = PBXGroup; 81 | children = ( 82 | C9C824F7FAD5D51FA89ED6F8 /* Pods-MainProject-MultiPod.debug.xcconfig */, 83 | 79F584E5217FECCEB2034230 /* Pods-MainProject-MultiPod.release.xcconfig */, 84 | ); 85 | path = Pods; 86 | sourceTree = ""; 87 | }; 88 | 5F6D1EA9A4C322F06EC52F68 /* Frameworks */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | FC1E3278538F1E3686EDEFAC /* Pods_MainProject_MultiPod.framework */, 92 | ); 93 | name = Frameworks; 94 | sourceTree = ""; 95 | }; 96 | 847D4EAD243B36CE006EB3A3 /* Accout */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 8456AC8A236B42590009AEF7 /* AccountVM.h */, 100 | 8456AC8B236B42590009AEF7 /* AccountVM.m */, 101 | 8456AC85236B30490009AEF7 /* AccountViewController.h */, 102 | 8456AC86236B30490009AEF7 /* AccountViewController.m */, 103 | 8456AC87236B30490009AEF7 /* AccountViewController.xib */, 104 | 847D4EC8243C88A7006EB3A3 /* AccountCoordinator.h */, 105 | 847D4EC9243C88A7006EB3A3 /* AccountCoordinator.m */, 106 | ); 107 | name = Accout; 108 | sourceTree = ""; 109 | }; 110 | 847D4EAE243B36F3006EB3A3 /* Pay */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | 84D796802332717200F5538E /* PayViewController.h */, 114 | 84D796812332717200F5538E /* PayViewController.m */, 115 | 8456AC8023673B700009AEF7 /* PayViewController.storyboard */, 116 | 847D4ECB243C8EB1006EB3A3 /* PayCoordinator.h */, 117 | 847D4ECC243C8EB1006EB3A3 /* PayCoordinator.m */, 118 | 847D4ED024404607006EB3A3 /* PayViewModel.h */, 119 | 847D4ED124404607006EB3A3 /* PayViewModel.m */, 120 | ); 121 | name = Pay; 122 | sourceTree = ""; 123 | }; 124 | 84D21F0D232D13B800859622 = { 125 | isa = PBXGroup; 126 | children = ( 127 | 84D21F18232D13B800859622 /* MainProject-MultiPod */, 128 | 84D21F17232D13B800859622 /* Products */, 129 | 23EB13E0FDCAB42F5C3F30D7 /* Pods */, 130 | 5F6D1EA9A4C322F06EC52F68 /* Frameworks */, 131 | ); 132 | sourceTree = ""; 133 | }; 134 | 84D21F17232D13B800859622 /* Products */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 84D21F16232D13B800859622 /* MainProject-MultiPod.app */, 138 | ); 139 | name = Products; 140 | sourceTree = ""; 141 | }; 142 | 84D21F18232D13B800859622 /* MainProject-MultiPod */ = { 143 | isa = PBXGroup; 144 | children = ( 145 | 847D4EAE243B36F3006EB3A3 /* Pay */, 146 | 847D4EAD243B36CE006EB3A3 /* Accout */, 147 | 84D21F19232D13B800859622 /* AppDelegate.h */, 148 | 84D21F1A232D13B800859622 /* AppDelegate.m */, 149 | 84D7967A23326B2400F5538E /* MainModuleManager.h */, 150 | 84D7967B23326B2400F5538E /* MainModuleManager.m */, 151 | 84D21F1C232D13B800859622 /* ViewController.h */, 152 | 84D21F1D232D13B800859622 /* ViewController.m */, 153 | 84D7967E23326CEB00F5538E /* BPHttpClient.h */, 154 | 84D7967D23326CEB00F5538E /* BPHttpClient.m */, 155 | 84D21F22232D13BB00859622 /* Assets.xcassets */, 156 | 84D21F24232D13BB00859622 /* LaunchScreen.storyboard */, 157 | 84D21F27232D13BB00859622 /* Info.plist */, 158 | 84D21F28232D13BB00859622 /* main.m */, 159 | 8456AC7C2367388C0009AEF7 /* AppCoordinator.h */, 160 | 8456AC7D2367388C0009AEF7 /* AppCoordinator.m */, 161 | 32049193236AE30C00C53E33 /* MainTabBarViewController.h */, 162 | 32049194236AE30C00C53E33 /* MainTabBarViewController.m */, 163 | ); 164 | path = "MainProject-MultiPod"; 165 | sourceTree = ""; 166 | }; 167 | /* End PBXGroup section */ 168 | 169 | /* Begin PBXNativeTarget section */ 170 | 84D21F15232D13B800859622 /* MainProject-MultiPod */ = { 171 | isa = PBXNativeTarget; 172 | buildConfigurationList = 84D21F2C232D13BB00859622 /* Build configuration list for PBXNativeTarget "MainProject-MultiPod" */; 173 | buildPhases = ( 174 | 80150964EBF3296C1066A75D /* [CP] Check Pods Manifest.lock */, 175 | 84D21F12232D13B800859622 /* Sources */, 176 | 84D21F13232D13B800859622 /* Frameworks */, 177 | 84D21F14232D13B800859622 /* Resources */, 178 | 385F83C768EE9F7AD7B1EDB6 /* [CP] Embed Pods Frameworks */, 179 | ); 180 | buildRules = ( 181 | ); 182 | dependencies = ( 183 | ); 184 | name = "MainProject-MultiPod"; 185 | productName = "MainProject-MultiPod"; 186 | productReference = 84D21F16232D13B800859622 /* MainProject-MultiPod.app */; 187 | productType = "com.apple.product-type.application"; 188 | }; 189 | /* End PBXNativeTarget section */ 190 | 191 | /* Begin PBXProject section */ 192 | 84D21F0E232D13B800859622 /* Project object */ = { 193 | isa = PBXProject; 194 | attributes = { 195 | LastUpgradeCheck = 1140; 196 | ORGANIZATIONNAME = Bruce; 197 | TargetAttributes = { 198 | 84D21F15232D13B800859622 = { 199 | CreatedOnToolsVersion = 10.3; 200 | }; 201 | }; 202 | }; 203 | buildConfigurationList = 84D21F11232D13B800859622 /* Build configuration list for PBXProject "MainProject-MultiPod" */; 204 | compatibilityVersion = "Xcode 9.3"; 205 | developmentRegion = en; 206 | hasScannedForEncodings = 0; 207 | knownRegions = ( 208 | en, 209 | Base, 210 | ); 211 | mainGroup = 84D21F0D232D13B800859622; 212 | productRefGroup = 84D21F17232D13B800859622 /* Products */; 213 | projectDirPath = ""; 214 | projectRoot = ""; 215 | targets = ( 216 | 84D21F15232D13B800859622 /* MainProject-MultiPod */, 217 | ); 218 | }; 219 | /* End PBXProject section */ 220 | 221 | /* Begin PBXResourcesBuildPhase section */ 222 | 84D21F14232D13B800859622 /* Resources */ = { 223 | isa = PBXResourcesBuildPhase; 224 | buildActionMask = 2147483647; 225 | files = ( 226 | 8456AC8123673B700009AEF7 /* PayViewController.storyboard in Resources */, 227 | 84D21F26232D13BB00859622 /* LaunchScreen.storyboard in Resources */, 228 | 8456AC89236B30490009AEF7 /* AccountViewController.xib in Resources */, 229 | 84D21F23232D13BB00859622 /* Assets.xcassets in Resources */, 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | }; 233 | /* End PBXResourcesBuildPhase section */ 234 | 235 | /* Begin PBXShellScriptBuildPhase section */ 236 | 385F83C768EE9F7AD7B1EDB6 /* [CP] Embed Pods Frameworks */ = { 237 | isa = PBXShellScriptBuildPhase; 238 | buildActionMask = 2147483647; 239 | files = ( 240 | ); 241 | inputFileListPaths = ( 242 | "${PODS_ROOT}/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks-${CONFIGURATION}-input-files.xcfilelist", 243 | ); 244 | name = "[CP] Embed Pods Frameworks"; 245 | outputFileListPaths = ( 246 | "${PODS_ROOT}/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks-${CONFIGURATION}-output-files.xcfilelist", 247 | ); 248 | runOnlyForDeploymentPostprocessing = 0; 249 | shellPath = /bin/sh; 250 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-MainProject-MultiPod/Pods-MainProject-MultiPod-frameworks.sh\"\n"; 251 | showEnvVarsInLog = 0; 252 | }; 253 | 80150964EBF3296C1066A75D /* [CP] Check Pods Manifest.lock */ = { 254 | isa = PBXShellScriptBuildPhase; 255 | buildActionMask = 2147483647; 256 | files = ( 257 | ); 258 | inputFileListPaths = ( 259 | ); 260 | inputPaths = ( 261 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 262 | "${PODS_ROOT}/Manifest.lock", 263 | ); 264 | name = "[CP] Check Pods Manifest.lock"; 265 | outputFileListPaths = ( 266 | ); 267 | outputPaths = ( 268 | "$(DERIVED_FILE_DIR)/Pods-MainProject-MultiPod-checkManifestLockResult.txt", 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | shellPath = /bin/sh; 272 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 273 | showEnvVarsInLog = 0; 274 | }; 275 | /* End PBXShellScriptBuildPhase section */ 276 | 277 | /* Begin PBXSourcesBuildPhase section */ 278 | 84D21F12232D13B800859622 /* Sources */ = { 279 | isa = PBXSourcesBuildPhase; 280 | buildActionMask = 2147483647; 281 | files = ( 282 | 8456AC7E2367388C0009AEF7 /* AppCoordinator.m in Sources */, 283 | 847D4ECD243C8EB1006EB3A3 /* PayCoordinator.m in Sources */, 284 | 847D4ED224404607006EB3A3 /* PayViewModel.m in Sources */, 285 | 84D7967C23326B2400F5538E /* MainModuleManager.m in Sources */, 286 | 84D796822332717200F5538E /* PayViewController.m in Sources */, 287 | 84D21F1E232D13B800859622 /* ViewController.m in Sources */, 288 | 8456AC8C236B42590009AEF7 /* AccountVM.m in Sources */, 289 | 847D4ECA243C88A7006EB3A3 /* AccountCoordinator.m in Sources */, 290 | 8456AC88236B30490009AEF7 /* AccountViewController.m in Sources */, 291 | 84D7967F23326CEB00F5538E /* BPHttpClient.m in Sources */, 292 | 32049195236AE30C00C53E33 /* MainTabBarViewController.m in Sources */, 293 | 84D21F29232D13BB00859622 /* main.m in Sources */, 294 | 84D21F1B232D13B800859622 /* AppDelegate.m in Sources */, 295 | ); 296 | runOnlyForDeploymentPostprocessing = 0; 297 | }; 298 | /* End PBXSourcesBuildPhase section */ 299 | 300 | /* Begin PBXVariantGroup section */ 301 | 84D21F24232D13BB00859622 /* LaunchScreen.storyboard */ = { 302 | isa = PBXVariantGroup; 303 | children = ( 304 | 84D21F25232D13BB00859622 /* Base */, 305 | ); 306 | name = LaunchScreen.storyboard; 307 | sourceTree = ""; 308 | }; 309 | /* End PBXVariantGroup section */ 310 | 311 | /* Begin XCBuildConfiguration section */ 312 | 84D21F2A232D13BB00859622 /* Debug */ = { 313 | isa = XCBuildConfiguration; 314 | buildSettings = { 315 | ALWAYS_SEARCH_USER_PATHS = NO; 316 | CLANG_ANALYZER_NONNULL = YES; 317 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 318 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 319 | CLANG_CXX_LIBRARY = "libc++"; 320 | CLANG_ENABLE_MODULES = YES; 321 | CLANG_ENABLE_OBJC_ARC = YES; 322 | CLANG_ENABLE_OBJC_WEAK = YES; 323 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 324 | CLANG_WARN_BOOL_CONVERSION = YES; 325 | CLANG_WARN_COMMA = YES; 326 | CLANG_WARN_CONSTANT_CONVERSION = YES; 327 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 328 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 329 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 330 | CLANG_WARN_EMPTY_BODY = YES; 331 | CLANG_WARN_ENUM_CONVERSION = YES; 332 | CLANG_WARN_INFINITE_RECURSION = YES; 333 | CLANG_WARN_INT_CONVERSION = YES; 334 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 335 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 336 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 337 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 338 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 339 | CLANG_WARN_STRICT_PROTOTYPES = YES; 340 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 341 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 342 | CLANG_WARN_UNREACHABLE_CODE = YES; 343 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 344 | CODE_SIGN_IDENTITY = "iPhone Developer"; 345 | COPY_PHASE_STRIP = NO; 346 | DEBUG_INFORMATION_FORMAT = dwarf; 347 | ENABLE_STRICT_OBJC_MSGSEND = YES; 348 | ENABLE_TESTABILITY = YES; 349 | GCC_C_LANGUAGE_STANDARD = gnu11; 350 | GCC_DYNAMIC_NO_PIC = NO; 351 | GCC_NO_COMMON_BLOCKS = YES; 352 | GCC_OPTIMIZATION_LEVEL = 0; 353 | GCC_PREPROCESSOR_DEFINITIONS = ( 354 | "DEBUG=1", 355 | "$(inherited)", 356 | ); 357 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 358 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 359 | GCC_WARN_UNDECLARED_SELECTOR = YES; 360 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 361 | GCC_WARN_UNUSED_FUNCTION = YES; 362 | GCC_WARN_UNUSED_VARIABLE = YES; 363 | IPHONEOS_DEPLOYMENT_TARGET = 12.4; 364 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 365 | MTL_FAST_MATH = YES; 366 | ONLY_ACTIVE_ARCH = YES; 367 | SDKROOT = iphoneos; 368 | }; 369 | name = Debug; 370 | }; 371 | 84D21F2B232D13BB00859622 /* Release */ = { 372 | isa = XCBuildConfiguration; 373 | buildSettings = { 374 | ALWAYS_SEARCH_USER_PATHS = NO; 375 | CLANG_ANALYZER_NONNULL = YES; 376 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 377 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 378 | CLANG_CXX_LIBRARY = "libc++"; 379 | CLANG_ENABLE_MODULES = YES; 380 | CLANG_ENABLE_OBJC_ARC = YES; 381 | CLANG_ENABLE_OBJC_WEAK = YES; 382 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 383 | CLANG_WARN_BOOL_CONVERSION = YES; 384 | CLANG_WARN_COMMA = YES; 385 | CLANG_WARN_CONSTANT_CONVERSION = YES; 386 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 387 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 388 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 389 | CLANG_WARN_EMPTY_BODY = YES; 390 | CLANG_WARN_ENUM_CONVERSION = YES; 391 | CLANG_WARN_INFINITE_RECURSION = YES; 392 | CLANG_WARN_INT_CONVERSION = YES; 393 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 394 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 395 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 396 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 397 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 398 | CLANG_WARN_STRICT_PROTOTYPES = YES; 399 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 400 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 401 | CLANG_WARN_UNREACHABLE_CODE = YES; 402 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 403 | CODE_SIGN_IDENTITY = "iPhone Developer"; 404 | COPY_PHASE_STRIP = NO; 405 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 406 | ENABLE_NS_ASSERTIONS = NO; 407 | ENABLE_STRICT_OBJC_MSGSEND = YES; 408 | GCC_C_LANGUAGE_STANDARD = gnu11; 409 | GCC_NO_COMMON_BLOCKS = YES; 410 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 411 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 412 | GCC_WARN_UNDECLARED_SELECTOR = YES; 413 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 414 | GCC_WARN_UNUSED_FUNCTION = YES; 415 | GCC_WARN_UNUSED_VARIABLE = YES; 416 | IPHONEOS_DEPLOYMENT_TARGET = 12.4; 417 | MTL_ENABLE_DEBUG_INFO = NO; 418 | MTL_FAST_MATH = YES; 419 | SDKROOT = iphoneos; 420 | VALIDATE_PRODUCT = YES; 421 | }; 422 | name = Release; 423 | }; 424 | 84D21F2D232D13BB00859622 /* Debug */ = { 425 | isa = XCBuildConfiguration; 426 | baseConfigurationReference = C9C824F7FAD5D51FA89ED6F8 /* Pods-MainProject-MultiPod.debug.xcconfig */; 427 | buildSettings = { 428 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 429 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 430 | CODE_SIGN_STYLE = Automatic; 431 | DEFINES_MODULE = YES; 432 | DEVELOPMENT_TEAM = NS27ZB8WPD; 433 | INFOPLIST_FILE = "MainProject-MultiPod/Info.plist"; 434 | LD_RUNPATH_SEARCH_PATHS = ( 435 | "$(inherited)", 436 | "@executable_path/Frameworks", 437 | ); 438 | PRODUCT_BUNDLE_IDENTIFIER = "com.Bruce.MainProject-MultiPod"; 439 | PRODUCT_NAME = "$(TARGET_NAME)"; 440 | TARGETED_DEVICE_FAMILY = "1,2"; 441 | }; 442 | name = Debug; 443 | }; 444 | 84D21F2E232D13BB00859622 /* Release */ = { 445 | isa = XCBuildConfiguration; 446 | baseConfigurationReference = 79F584E5217FECCEB2034230 /* Pods-MainProject-MultiPod.release.xcconfig */; 447 | buildSettings = { 448 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 449 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 450 | CODE_SIGN_STYLE = Automatic; 451 | DEFINES_MODULE = YES; 452 | DEVELOPMENT_TEAM = NS27ZB8WPD; 453 | INFOPLIST_FILE = "MainProject-MultiPod/Info.plist"; 454 | LD_RUNPATH_SEARCH_PATHS = ( 455 | "$(inherited)", 456 | "@executable_path/Frameworks", 457 | ); 458 | PRODUCT_BUNDLE_IDENTIFIER = "com.Bruce.MainProject-MultiPod"; 459 | PRODUCT_NAME = "$(TARGET_NAME)"; 460 | TARGETED_DEVICE_FAMILY = "1,2"; 461 | }; 462 | name = Release; 463 | }; 464 | /* End XCBuildConfiguration section */ 465 | 466 | /* Begin XCConfigurationList section */ 467 | 84D21F11232D13B800859622 /* Build configuration list for PBXProject "MainProject-MultiPod" */ = { 468 | isa = XCConfigurationList; 469 | buildConfigurations = ( 470 | 84D21F2A232D13BB00859622 /* Debug */, 471 | 84D21F2B232D13BB00859622 /* Release */, 472 | ); 473 | defaultConfigurationIsVisible = 0; 474 | defaultConfigurationName = Release; 475 | }; 476 | 84D21F2C232D13BB00859622 /* Build configuration list for PBXNativeTarget "MainProject-MultiPod" */ = { 477 | isa = XCConfigurationList; 478 | buildConfigurations = ( 479 | 84D21F2D232D13BB00859622 /* Debug */, 480 | 84D21F2E232D13BB00859622 /* Release */, 481 | ); 482 | defaultConfigurationIsVisible = 0; 483 | defaultConfigurationName = Release; 484 | }; 485 | /* End XCConfigurationList section */ 486 | }; 487 | rootObject = 84D21F0E232D13B800859622 /* Project object */; 488 | } 489 | --------------------------------------------------------------------------------