├── Image ├── p1.png ├── p2.png ├── p3.png └── p4.png ├── PlugInDemo ├── GCore │ ├── GCore.bundle │ │ ├── image.png │ │ └── arrow_left@2x.png │ ├── GCore │ │ ├── UI │ │ │ ├── ShowVC.h │ │ │ ├── FuncVC │ │ │ │ ├── SecShowVC.h │ │ │ │ └── SecShowVC.m │ │ │ ├── GCoreNavVC.h │ │ │ ├── GCoreNavVC.m │ │ │ ├── UIViewController+Ex.h │ │ │ ├── UIViewController+Ex.m │ │ │ └── ShowVC.m │ │ ├── GPluginFunc.h │ │ ├── GPluginFunc.m │ │ ├── GCore.h │ │ ├── Info.plist │ │ └── Tools │ │ │ └── GMacros.h │ ├── GCoreTests │ │ ├── Info.plist │ │ └── GCoreTests.m │ └── GCore.xcodeproj │ │ └── project.pbxproj ├── PlugInDemo │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── AccentColor.colorset │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── TestVC.h │ ├── AppDelegate.h │ ├── main.m │ ├── AppDelegate.m │ ├── Base.lproj │ │ └── LaunchScreen.storyboard │ ├── Info.plist │ ├── TestVC.xib │ └── TestVC.m ├── PlugInDemo.xcworkspace │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Podfile ├── PlugInDemoTests │ ├── Info.plist │ └── PlugInDemoTests.m ├── PlugInDemoUITests │ ├── Info.plist │ └── PlugInDemoUITests.m └── PlugInDemo.xcodeproj │ └── project.pbxproj ├── .gitignore └── README.md /Image/p1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lx-xi/PlugInDemo/HEAD/Image/p1.png -------------------------------------------------------------------------------- /Image/p2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lx-xi/PlugInDemo/HEAD/Image/p2.png -------------------------------------------------------------------------------- /Image/p3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lx-xi/PlugInDemo/HEAD/Image/p3.png -------------------------------------------------------------------------------- /Image/p4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lx-xi/PlugInDemo/HEAD/Image/p4.png -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore.bundle/image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lx-xi/PlugInDemo/HEAD/PlugInDemo/GCore/GCore.bundle/image.png -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore.bundle/arrow_left@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lx-xi/PlugInDemo/HEAD/PlugInDemo/GCore/GCore.bundle/arrow_left@2x.png -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/UI/ShowVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // ShowVC.h 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface ShowVC : UIViewController 13 | 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/TestVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // TestVC.h 3 | // PlugInDemo 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface TestVC : UIViewController 13 | 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/UI/FuncVC/SecShowVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // SecShowVC.h 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/7. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface SecShowVC : UIViewController 13 | 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/UI/GCoreNavVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // GCoreNavVC.h 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/7. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface GCoreNavVC : UINavigationController 13 | 14 | @end 15 | 16 | NS_ASSUME_NONNULL_END 17 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // PlugInDemo 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import 9 | 10 | @interface AppDelegate : UIResponder 11 | 12 | @property (strong, nonatomic) UIWindow * window; 13 | 14 | @end 15 | 16 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/GPluginFunc.h: -------------------------------------------------------------------------------- 1 | // 2 | // GPluginFunc.h 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/7. 6 | // 7 | 8 | #import 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface GPluginFunc : NSObject 14 | 15 | + (UIViewController *)showUI; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/UI/GCoreNavVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // GCoreNavVC.m 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/7. 6 | // 7 | 8 | #import "GCoreNavVC.h" 9 | #import "ShowVC.h" 10 | 11 | @interface GCoreNavVC () 12 | 13 | @end 14 | 15 | @implementation GCoreNavVC 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | } 20 | 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/UI/UIViewController+Ex.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Ex.h 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/7. 6 | // 7 | 8 | #import 9 | 10 | NS_ASSUME_NONNULL_BEGIN 11 | 12 | @interface UIViewController (Ex) 13 | 14 | - (void)addNavBackItemWithColor:(UIColor *__nullable)color; 15 | - (void)navigationBack; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /PlugInDemo/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '12.0' 3 | 4 | workspace 'PlugInDemo.xcworkspace' 5 | 6 | target 'PlugInDemo' do 7 | # Comment the next line if you don't want to use dynamic frameworks 8 | use_frameworks! 9 | 10 | # Pods for running 11 | pod 'AFNetworking', '4.0.1' 12 | pod 'Masonry', '1.1.0' 13 | pod 'SSZipArchive', '2.2.3' 14 | end 15 | 16 | target 'GCore' do 17 | 18 | project 'GCore/GCore.xcodeproj' 19 | 20 | end 21 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/GPluginFunc.m: -------------------------------------------------------------------------------- 1 | // 2 | // GPluginFunc.m 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/7. 6 | // 7 | 8 | #import "GPluginFunc.h" 9 | #import "GCoreNavVC.h" 10 | #import "ShowVC.h" 11 | 12 | @implementation GPluginFunc 13 | 14 | + (UIViewController *)showUI { 15 | ShowVC *root = [[ShowVC alloc] init]; 16 | GCoreNavVC *nav = [[GCoreNavVC alloc] initWithRootViewController:root]; 17 | nav.modalPresentationStyle = UIModalPresentationFullScreen; 18 | return nav; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // PlugInDemo 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import 9 | #import "AppDelegate.h" 10 | 11 | int main(int argc, char * argv[]) { 12 | NSString * appDelegateClassName; 13 | @autoreleasepool { 14 | // Setup code that might create autoreleased objects goes here. 15 | appDelegateClassName = NSStringFromClass([AppDelegate class]); 16 | } 17 | return UIApplicationMain(argc, argv, nil, appDelegateClassName); 18 | } 19 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/GCore.h: -------------------------------------------------------------------------------- 1 | // 2 | // GCore.h 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import 9 | 10 | //! Project version number for GCore. 11 | FOUNDATION_EXPORT double GCoreVersionNumber; 12 | 13 | //! Project version string for GCore. 14 | FOUNDATION_EXPORT const unsigned char GCoreVersionString[]; 15 | 16 | // In this header, you should import all the public headers of your framework using statements like #import 17 | 18 | #import "GPluginFunc.h" 19 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // PlugInDemo 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import "AppDelegate.h" 9 | #import "TestVC.h" 10 | 11 | @interface AppDelegate () 12 | 13 | @end 14 | 15 | @implementation AppDelegate 16 | 17 | 18 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 19 | 20 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 21 | self.window.backgroundColor = [UIColor whiteColor]; 22 | [self.window makeKeyAndVisible]; 23 | 24 | self.window.rootViewController = [[TestVC alloc] init]; 25 | 26 | return YES; 27 | } 28 | 29 | 30 | 31 | 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/UI/FuncVC/SecShowVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // SecShowVC.m 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/7. 6 | // 7 | 8 | #import "SecShowVC.h" 9 | 10 | @interface SecShowVC () 11 | 12 | @end 13 | 14 | @implementation SecShowVC 15 | 16 | - (void)viewDidLoad { 17 | [super viewDidLoad]; 18 | self.view.backgroundColor = [UIColor lightGrayColor]; 19 | } 20 | 21 | /* 22 | #pragma mark - Navigation 23 | 24 | // In a storyboard-based application, you will often want to do a little preparation before navigation 25 | - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 26 | // Get the new view controller using [segue destinationViewController]. 27 | // Pass the selected object to the new view controller. 28 | } 29 | */ 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCoreTests/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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemoTests/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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemoUITests/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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Mac OS X 2 | *.DS_Store 3 | 4 | # Xcode 5 | # 6 | *.xcworkspacedata 7 | *.xcsettings 8 | *.xcscheme 9 | 10 | project.xcworkspace 11 | project.xcworkspace/ 12 | UserInterfaceState.xcuserstate 13 | UserInterface.xcuserstate 14 | 15 | 16 | build/ 17 | *.pbxuser 18 | !default.pbxuser 19 | *.mode1v3 20 | !default.mode1v3 21 | *.mode2v3 22 | !default.mode2v3 23 | *.perspectivev3 24 | !default.perspectivev3 25 | xcuserdata 26 | xcuserdata/ 27 | *.xccheckout 28 | *.moved-aside 29 | DerivedData 30 | DerivedData/ 31 | *.hmap 32 | *.ipa 33 | *.xcuserstate 34 | 35 | # CocoaPods 36 | # 37 | # We recommend against adding the Pods directory to your .gitignore. However 38 | # you should judge for yourself, the pros and cons are mentioned at: 39 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 40 | # 41 | *.lock 42 | Pods/ 43 | AutoPackaging/ 44 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCoreTests/GCoreTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // GCoreTests.m 3 | // GCoreTests 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import 9 | 10 | @interface GCoreTests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation GCoreTests 15 | 16 | - (void)setUp { 17 | // Put setup code here. This method is called before the invocation of each test method in the class. 18 | } 19 | 20 | - (void)tearDown { 21 | // Put teardown code here. This method is called after the invocation of each test method in the class. 22 | } 23 | 24 | - (void)testExample { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | - (void)testPerformanceExample { 30 | // This is an example of a performance test case. 31 | [self measureBlock:^{ 32 | // Put the code you want to measure the time of here. 33 | }]; 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemoTests/PlugInDemoTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // PlugInDemoTests.m 3 | // PlugInDemoTests 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import 9 | 10 | @interface PlugInDemoTests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation PlugInDemoTests 15 | 16 | - (void)setUp { 17 | // Put setup code here. This method is called before the invocation of each test method in the class. 18 | } 19 | 20 | - (void)tearDown { 21 | // Put teardown code here. This method is called after the invocation of each test method in the class. 22 | } 23 | 24 | - (void)testExample { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | - (void)testPerformanceExample { 30 | // This is an example of a performance test case. 31 | [self measureBlock:^{ 32 | // Put the code you want to measure the time of here. 33 | }]; 34 | } 35 | 36 | @end 37 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/UI/UIViewController+Ex.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Ex.m 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/7. 6 | // 7 | 8 | #import "UIViewController+Ex.h" 9 | #import "GMacros.h" 10 | 11 | @implementation UIViewController (Ex) 12 | 13 | - (void)addNavBackItemWithColor:(UIColor *__nullable)color { 14 | UIBarButtonItem * item = [[UIBarButtonItem alloc] initWithImage:bImage(@"arrow_left") style:UIBarButtonItemStylePlain target:self action:@selector(navigationBack)]; 15 | if (color == nil) { 16 | color = UIColorFromHex(0x666666); 17 | } 18 | item.tintColor = color; 19 | self.navigationItem.leftBarButtonItem = item; 20 | } 21 | 22 | - (void)navigationBack { 23 | if (self.navigationController.viewControllers.count == 1 && [self.navigationController.viewControllers lastObject] == self) { 24 | [self.navigationController dismissViewControllerAnimated:true completion:nil]; 25 | return; 26 | } 27 | [self.navigationController popViewControllerAnimated:true]; 28 | } 29 | 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/UI/ShowVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // ShowVC.m 3 | // GCore 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import "ShowVC.h" 9 | #import "GMacros.h" 10 | #import "UIViewController+Ex.h" 11 | #import "SecShowVC.h" 12 | 13 | @interface ShowVC () 14 | 15 | 16 | @end 17 | 18 | @implementation ShowVC 19 | 20 | - (void)viewDidLoad { 21 | [super viewDidLoad]; 22 | self.view.backgroundColor = [UIColor whiteColor]; 23 | 24 | UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, kScreenWidth - 40, 44)]; 25 | tf.placeholder = @"请输入文字"; 26 | [self.view addSubview:tf]; 27 | 28 | UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem]; 29 | btn.frame = CGRectMake(10, 200, 100, 44); 30 | btn.backgroundColor = [UIColor lightGrayColor]; 31 | [btn setTitle:@"push" forState:UIControlStateNormal]; 32 | [btn addTarget:self action:@selector(pushAction) forControlEvents:UIControlEventTouchUpInside]; 33 | [self.view addSubview:btn]; 34 | 35 | UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 300, 100, 100)]; 36 | imgView.image = bImage(@"image.png"); 37 | imgView.contentMode = UIViewContentModeScaleAspectFit; 38 | [self.view addSubview:imgView]; 39 | 40 | [self addNavBackItemWithColor:nil]; 41 | } 42 | 43 | - (void)goBackAction { 44 | [self navigationBack]; 45 | } 46 | 47 | - (void)pushAction { 48 | SecShowVC *vc = [[SecShowVC alloc] init]; 49 | vc.title = @"第二页"; 50 | [self.navigationController pushViewController:vc animated:true]; 51 | } 52 | 53 | 54 | 55 | @end 56 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemoUITests/PlugInDemoUITests.m: -------------------------------------------------------------------------------- 1 | // 2 | // PlugInDemoUITests.m 3 | // PlugInDemoUITests 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import 9 | 10 | @interface PlugInDemoUITests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation PlugInDemoUITests 15 | 16 | - (void)setUp { 17 | // Put setup code here. This method is called before the invocation of each test method in the class. 18 | 19 | // In UI tests it is usually best to stop immediately when a failure occurs. 20 | self.continueAfterFailure = NO; 21 | 22 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 23 | } 24 | 25 | - (void)tearDown { 26 | // Put teardown code here. This method is called after the invocation of each test method in the class. 27 | } 28 | 29 | - (void)testExample { 30 | // UI tests must launch the application that they test. 31 | XCUIApplication *app = [[XCUIApplication alloc] init]; 32 | [app launch]; 33 | 34 | // Use recording to get started writing UI tests. 35 | // Use XCTAssert and related functions to verify your tests produce the correct results. 36 | } 37 | 38 | - (void)testLaunchPerformance { 39 | if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *)) { 40 | // This measures how long it takes to launch your application. 41 | [self measureWithMetrics:@[[[XCTApplicationLaunchMetric alloc] init]] block:^{ 42 | [[[XCUIApplication alloc] init] launch]; 43 | }]; 44 | } 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/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 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/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 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | UIApplicationSupportsIndirectInputEvents 29 | 30 | UILaunchStoryboardName 31 | LaunchScreen 32 | UIRequiredDeviceCapabilities 33 | 34 | armv7 35 | 36 | UISupportedInterfaceOrientations 37 | 38 | UIInterfaceOrientationPortrait 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UISupportedInterfaceOrientations~ipad 43 | 44 | UIInterfaceOrientationPortrait 45 | UIInterfaceOrientationPortraitUpsideDown 46 | UIInterfaceOrientationLandscapeLeft 47 | UIInterfaceOrientationLandscapeRight 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "scale" : "1x", 46 | "size" : "20x20" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "scale" : "2x", 51 | "size" : "20x20" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "scale" : "1x", 56 | "size" : "29x29" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "scale" : "2x", 61 | "size" : "29x29" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "scale" : "1x", 66 | "size" : "40x40" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "scale" : "2x", 71 | "size" : "40x40" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "scale" : "1x", 76 | "size" : "76x76" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "scale" : "2x", 81 | "size" : "76x76" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "scale" : "2x", 86 | "size" : "83.5x83.5" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "scale" : "1x", 91 | "size" : "1024x1024" 92 | } 93 | ], 94 | "info" : { 95 | "author" : "xcode", 96 | "version" : 1 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore/Tools/GMacros.h: -------------------------------------------------------------------------------- 1 | // 2 | // Macros.h 3 | // running 4 | // 5 | // Created by GreeX on 2021/4/23. 6 | // 7 | 8 | #ifndef GMacros_h 9 | #define GMacros_h 10 | 11 | //MARK: - 工具宏 12 | //获取物理屏幕的尺寸 13 | #define kScreenHeight [UIScreen mainScreen].bounds.size.height 14 | #define kScreenWidth [UIScreen mainScreen].bounds.size.width 15 | 16 | #define SafeAreaTopHeight (isLiuhai ? 88 : 64) 17 | #define SafeAreaBottomHeight (isLiuhai ? 34 : 0) 18 | #define STATUS_BAR_HEIGHT 20.0 19 | #define NAVIGATION_BAR_HEIGHT 44.0 20 | 21 | //typeof self 22 | #define WEAK_SELF __weak typeof(self)weakSelf = self; 23 | #define STRONG_SELF __strong typeof(weakSelf)strongSelf = weakSelf; 24 | 25 | //插件路径 26 | #define kFrameworkPath [NSString stringWithFormat:@"%@/Documents/GCore.framework", NSHomeDirectory()] 27 | #define kBundlePath [NSString stringWithFormat:@"%@/Documents/GCore.bundle", NSHomeDirectory()] 28 | 29 | //图片 30 | #define image(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"%@", imageName]] 31 | #define bImage(imageName) [UIImage imageNamed:[NSString stringWithFormat:@"%@/%@", kBundlePath, imageName]] 32 | 33 | //RGB color 34 | #define UIColorFromRGB(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1.0] 35 | #define UIColorFromRGBA(r,g,b,a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a] 36 | //十六进制 色值 37 | #define UIColorFromHex(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] 38 | 39 | //是否刘海屏 40 | #define isLiuhai ({\ 41 | BOOL isBangsScreen = NO; \ 42 | if (@available(iOS 11.0, *)) { \ 43 | UIWindow *window = [[UIApplication sharedApplication].windows firstObject]; \ 44 | isBangsScreen = window.safeAreaInsets.bottom > 0; \ 45 | } \ 46 | isBangsScreen; \ 47 | }) 48 | 49 | //设置是否调试模式 50 | #define RUN_DEBUG 1 51 | #if RUN_DEBUG 52 | #define GLog(xx, ...) NSLog(@"%s(%d): " xx, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__) 53 | #else 54 | #define GLog(xx, ...) ((void)0) 55 | #endif 56 | 57 | //MARK: - 第三方 58 | #define AMAP_KEY @"b7c60d18a077b636fb9844508c9d7072" 59 | 60 | 61 | 62 | #endif /* Macros_h */ 63 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/TestVC.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 28 | 35 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo/TestVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // TestVC.m 3 | // PlugInDemo 4 | // 5 | // Created by GreeX on 2021/5/6. 6 | // 7 | 8 | #import "TestVC.h" 9 | #import 10 | #import 11 | 12 | @interface TestVC () 13 | 14 | @end 15 | 16 | @implementation TestVC 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | } 21 | 22 | /// 下载并解压 23 | - (IBAction)downloadPlugInAction:(id)sender { 24 | NSString *frameworkPath = [NSString stringWithFormat:@"%@/Documents/", NSHomeDirectory()]; 25 | if ([[NSFileManager defaultManager] fileExistsAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.zip"]]){ 26 | [[NSFileManager defaultManager] removeItemAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.zip"] error:nil]; 27 | } 28 | 29 | AFHTTPSessionManager *manager = [self createAFHTTPSessionManager]; 30 | 31 | NSString *url = @"http://localhost/GCore.zip"; 32 | NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 33 | 34 | NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { 35 | NSLog(@"progress = %@", downloadProgress); 36 | } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { 37 | NSString *filePath = [NSString stringWithFormat:@"%@/Documents/GCore.zip", NSHomeDirectory()]; 38 | return [NSURL fileURLWithPath:filePath]; 39 | } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { 40 | NSLog(@"下载完成"); 41 | 42 | NSString *errMsg = @""; 43 | if (error == nil) { 44 | //删除原有库 45 | NSString *frameworkPath = [NSString stringWithFormat:@"%@/Documents/", NSHomeDirectory()]; 46 | if ([[NSFileManager defaultManager] fileExistsAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.framework"]]){ 47 | [[NSFileManager defaultManager] removeItemAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.framework"] error:nil]; 48 | } 49 | if ([[NSFileManager defaultManager] fileExistsAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.bundle"]]){ 50 | [[NSFileManager defaultManager] removeItemAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.bundle"] error:nil]; 51 | } 52 | 53 | //解压库 54 | NSString *zipPath = [NSString stringWithFormat:@"%@/Documents/GCore.zip", NSHomeDirectory()]; 55 | BOOL res = [SSZipArchive unzipFileAtPath:zipPath toDestination:frameworkPath]; 56 | if (res) { 57 | errMsg = @"下载并解压成功"; 58 | } else { 59 | errMsg = @"下载但解压失败"; 60 | } 61 | NSLog(@"frameworkPath = %@", frameworkPath); 62 | } else { 63 | errMsg = @"下载失败"; 64 | } 65 | 66 | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:errMsg message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil]; 67 | [alertView show]; 68 | }]; 69 | [downloadTask resume]; 70 | } 71 | 72 | /// 加载 73 | - (IBAction)loadPlugInAction:(id)sender { 74 | NSString *frameworkPath = [NSString stringWithFormat:@"%@/Documents/GCore.framework", NSHomeDirectory()]; 75 | NSError *err = nil; 76 | NSBundle *bundle = [NSBundle bundleWithPath:frameworkPath]; 77 | NSString *str = @"加载动态库失败!"; 78 | if ([bundle loadAndReturnError:&err]) { 79 | NSLog(@"bundle load framework success."); 80 | str = @"加载动态库成功!"; 81 | } else { 82 | NSLog(@"bundle load framework err:%@",err); 83 | } 84 | 85 | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:str message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil]; 86 | [alertView show]; 87 | } 88 | 89 | /// 调用 90 | - (IBAction)plugInAction:(id)sender { 91 | Class GPluginFunc = NSClassFromString(@"GPluginFunc"); 92 | if(GPluginFunc){ 93 | UIViewController *ctrl = [GPluginFunc performSelector:@selector(showUI)]; 94 | [self presentViewController:ctrl animated:true completion:nil]; 95 | } else { 96 | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"调用方法失败!" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil]; 97 | [alertView show]; 98 | } 99 | } 100 | 101 | 102 | // MARK: - 设置AFHTTPSessionManager相关属性 103 | - (AFHTTPSessionManager *)createAFHTTPSessionManager { 104 | AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 105 | manager.requestSerializer = [AFJSONRequestSerializer serializer]; 106 | manager.requestSerializer.timeoutInterval = 10.f; 107 | manager.responseSerializer = [AFJSONResponseSerializer serializer]; 108 | manager.responseSerializer.acceptableContentTypes = [NSSet setWithArray:@[@"application/json", 109 | @"text/html", 110 | @"text/json", 111 | @"text/plain", 112 | @"text/javascript", 113 | @"text/xml", 114 | @"image/*", 115 | @"application/jason/javascript"]]; 116 | return manager; 117 | } 118 | 119 | 120 | @end 121 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iOS动态库实现插件化 2 | 3 | ### 1、动态库制作 4 | 5 | ![avatar](https://github.com/lx-xi/PlugInDemo/blob/master/Image/p1.png) 6 | 7 | 选择**Framework**,创建动态库。 8 | 9 | **Framework**分*动态*、*静态*两种,可以通过下面路径查看 10 | 11 | > TARGETS->Build Settings(搜索mach-o)->Mach-O Type 12 | 13 | ![avatar](https://github.com/lx-xi/PlugInDemo/blob/master/Image/p2.png) 14 | 15 | ### 2、代码编写 16 | 17 | ![avatar](https://github.com/lx-xi/PlugInDemo/blob/master/Image/p3.png) 18 | 19 | 本例创建动态库的名字为GCore,项目会自动生成一个名为GCore.h的头文件 20 | 21 | ![avatar](https://github.com/lx-xi/PlugInDemo/blob/master/Image/p4.png) 22 | 23 | 其中可导入你想用的头文件。 24 | UI文件夹下为demo实现的简单页面,大家可自定义自己的UI界面或功能。代码写完后,可在路径**TARGETS->Build Phases->Headers**下将你需要暴露给外面调用的头文件添加到**Public**下面即可 25 | 26 | ### 3、动态库编译 27 | 28 | 编译很简单,正常的**Command + B**快捷键、Xcode右上角编译按钮均可实现编译,编译完成后,即可在**Products**目录下面看到红色的**GCore.framework**变成正常颜色了,右击选择**Show in Finder**即可找到你编译的动态库。 29 | 30 | ##### 注意点 31 | 32 | 1. 动态库编译的时候注意选择模拟器还是真机(Any iOS Device); 33 | 34 | 2. 注意release和debug状态; 35 | 36 | 3. 动态库支持的最低版本号; 37 | 38 | 4. 资源文件使用bundle文件包裹(本项目为GCore.bundle),并注意资源文件使用路径,如本项目图片调用 39 | 40 | ``` 41 | // kBundlePath为GCore.bundle的路径,可以使沙盒路径,也可以是NSBundle路径,imageName为图片名称, 42 | [UIImage imageNamed:[NSString stringWithFormat:@"%@/%@", kBundlePath, imageName]]; 43 | ``` 44 | 45 | 5. 系统在加载动态库时,会检查Framework的签名,签名中必须包含TeamIdentifier,并且Framework和主App的TeamIdentifier必须一致,***模拟器测试可忽略***; 46 | 47 | 6. 目前而言,Apple并不希望开发者绕过App Store来更新App,因此需谨慎对待插件化的使用,对于不需要上架的企业级应用,是可以使用的。 48 | 49 | ### 4、动态库实现插件化 50 | 51 | 将之前编译好的动态库放入服务器方便下载,然后在项目中下载并使用 52 | 53 | 1. 使用AFNetworking下载动态库到沙盒,并用SSZipArchive解压(注意解压路径) 54 | 55 | ``` 56 | /// 下载并解压 57 | - (IBAction)downloadPlugInAction:(id)sender { 58 | NSString *frameworkPath = [NSString stringWithFormat:@"%@/Documents/", NSHomeDirectory()]; 59 | if ([[NSFileManager defaultManager] fileExistsAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.zip"]]){ 60 | [[NSFileManager defaultManager] removeItemAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.zip"] error:nil]; 61 | } 62 | 63 | AFHTTPSessionManager *manager = [self createAFHTTPSessionManager]; 64 | 65 | NSString *url = @"http://localhost/GCore.zip"; 66 | NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 67 | 68 | NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { 69 | NSLog(@"progress = %@", downloadProgress); 70 | } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { 71 | NSString *filePath = [NSString stringWithFormat:@"%@/Documents/GCore.zip", NSHomeDirectory()]; 72 | return [NSURL fileURLWithPath:filePath]; 73 | } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { 74 | NSLog(@"下载完成"); 75 | 76 | NSString *errMsg = @""; 77 | if (error == nil) { 78 | //删除原有库 79 | NSString *frameworkPath = [NSString stringWithFormat:@"%@/Documents/", NSHomeDirectory()]; 80 | if ([[NSFileManager defaultManager] fileExistsAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.framework"]]){ 81 | [[NSFileManager defaultManager] removeItemAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.framework"] error:nil]; 82 | } 83 | if ([[NSFileManager defaultManager] fileExistsAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.bundle"]]){ 84 | [[NSFileManager defaultManager] removeItemAtPath:[frameworkPath stringByAppendingPathComponent:@"GCore.bundle"] error:nil]; 85 | } 86 | 87 | //解压库 88 | NSString *zipPath = [NSString stringWithFormat:@"%@/Documents/GCore.zip", NSHomeDirectory()]; 89 | BOOL res = [SSZipArchive unzipFileAtPath:zipPath toDestination:frameworkPath]; 90 | if (res) { 91 | errMsg = @"下载并解压成功"; 92 | } else { 93 | errMsg = @"下载但解压失败"; 94 | } 95 | NSLog(@"frameworkPath = %@", frameworkPath); 96 | } else { 97 | errMsg = @"下载失败"; 98 | } 99 | 100 | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:errMsg message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil]; 101 | [alertView show]; 102 | }]; 103 | [downloadTask resume]; 104 | } 105 | ``` 106 | 107 | 2. 使用 **[NSBundle bundleWithPath:frameworkPath]** 将之前下载好的动态库加载到内存 108 | 109 | ``` 110 | //使用NSBundle实现加载 111 | - (IBAction)loadPlugInAction:(id)sender { 112 | NSString *frameworkPath = [NSString stringWithFormat:@"%@/Documents/GCore.framework", NSHomeDirectory()]; 113 | NSError *err = nil; 114 | NSBundle *bundle = [NSBundle bundleWithPath:frameworkPath]; 115 | NSString *str = @"加载动态库失败!"; 116 | if ([bundle loadAndReturnError:&err]) { 117 | NSLog(@"bundle load framework success."); 118 | str = @"加载动态库成功!"; 119 | } else { 120 | NSLog(@"bundle load framework err:%@",err); 121 | } 122 | 123 | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:str message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil]; 124 | [alertView show]; 125 | } 126 | 127 | 128 | //使用dlopen实现加载 129 | - (IBAction)loadPlugInAction:(id)sender { 130 | NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/GCore.framework/GCore",NSHomeDirectory()]; 131 | [self dlopenLoadDylibWithPath:documentsPath]; 132 | if (dlopen([path cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW) == NULL) { 133 | char *error = dlerror(); 134 | NSLog(@"dlopen error: %s", error); 135 | } else { 136 | NSLog(@"dlopen load framework success."); 137 | } 138 | } 139 | ``` 140 | 141 | 3. 接下来就是动态库调用了 142 | 143 | ``` 144 | - (IBAction)plugInAction:(id)sender { 145 | Class GPluginFunc = NSClassFromString(@"GPluginFunc"); 146 | if(GPluginFunc){ 147 | UIViewController *ctrl = [GPluginFunc performSelector:@selector(showUI)]; 148 | [self presentViewController:ctrl animated:true completion:nil]; 149 | } else { 150 | UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"调用方法失败!" message:nil delegate:nil cancelButtonTitle:nil otherButtonTitles:@"确定", nil]; 151 | [alertView show]; 152 | } 153 | } 154 | ``` 155 | 156 | 如此,一个简单的动态库实现插件化的工作算完成了。 157 | 158 | ### 5、Mac本地服务实现下载 159 | 160 | 如果无条件试下服务器实现下载功能,可用Mac本实现本地 161 | 162 | 1. 首先mac自带apache服务,我们只需要在终端输入下面命令将服务打开即可 163 | 164 | ``` 165 | sudo apachectl start 166 | ``` 167 | 168 | 启动后在浏览器访问 http://localhost 就可以看到效果 169 | 170 | 2. apache服务默认目录在 **/Library/WebServer/Documents** ,只需要将动态库放入该目录并访问对应URL即可实现下载。比如本demo就是将动态库和bundle资源文件压缩成GCore.zip放入该目录下面,只需浏览器访问 **http://localhost/GCore.zip** 即可下载,如果使用真机测试,在同一网络下面,可将localhost缓存Mac的网路IP地址即可。 171 | 172 | 3. apache其他命令 173 | 174 | ``` 175 | //关闭服务 176 | sudo apachectl stop 177 | //重启服务 178 | sudo apachectl restart 179 | ``` 180 | 181 | 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | -------------------------------------------------------------------------------- /PlugInDemo/GCore/GCore.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 47D1E7E42644D48700D1EB33 /* GCoreNavVC.h in Headers */ = {isa = PBXBuildFile; fileRef = 47D1E7E22644D48700D1EB33 /* GCoreNavVC.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11 | 47D1E7E52644D48700D1EB33 /* GCoreNavVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47D1E7E32644D48700D1EB33 /* GCoreNavVC.m */; }; 12 | 47D1E7E82644D4B900D1EB33 /* GPluginFunc.h in Headers */ = {isa = PBXBuildFile; fileRef = 47D1E7E62644D4B900D1EB33 /* GPluginFunc.h */; }; 13 | 47D1E7E92644D4B900D1EB33 /* GPluginFunc.m in Sources */ = {isa = PBXBuildFile; fileRef = 47D1E7E72644D4B900D1EB33 /* GPluginFunc.m */; }; 14 | 47D1E7EB2644D5C300D1EB33 /* GMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 47D1E7EA2644D5C300D1EB33 /* GMacros.h */; }; 15 | 47D1E7F02644D82E00D1EB33 /* UIViewController+Ex.h in Headers */ = {isa = PBXBuildFile; fileRef = 47D1E7EE2644D82E00D1EB33 /* UIViewController+Ex.h */; }; 16 | 47D1E7F12644D82E00D1EB33 /* UIViewController+Ex.m in Sources */ = {isa = PBXBuildFile; fileRef = 47D1E7EF2644D82E00D1EB33 /* UIViewController+Ex.m */; }; 17 | 47D1E81D2644E1CA00D1EB33 /* SecShowVC.h in Headers */ = {isa = PBXBuildFile; fileRef = 47D1E81B2644E1CA00D1EB33 /* SecShowVC.h */; }; 18 | 47D1E81E2644E1CA00D1EB33 /* SecShowVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47D1E81C2644E1CA00D1EB33 /* SecShowVC.m */; }; 19 | 47F0D378264383BA0062DA6C /* GCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47F0D36E264383BA0062DA6C /* GCore.framework */; }; 20 | 47F0D37D264383BA0062DA6C /* GCoreTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F0D37C264383BA0062DA6C /* GCoreTests.m */; }; 21 | 47F0D37F264383BA0062DA6C /* GCore.h in Headers */ = {isa = PBXBuildFile; fileRef = 47F0D371264383BA0062DA6C /* GCore.h */; settings = {ATTRIBUTES = (Public, ); }; }; 22 | 47F0D3DE26439FBE0062DA6C /* ShowVC.h in Headers */ = {isa = PBXBuildFile; fileRef = 47F0D3DC26439FBE0062DA6C /* ShowVC.h */; settings = {ATTRIBUTES = (Public, ); }; }; 23 | 47F0D3DF26439FBE0062DA6C /* ShowVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F0D3DD26439FBE0062DA6C /* ShowVC.m */; }; 24 | C0DBEB9F819FB90DCB530D1F /* libPods-GCore.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A1642536A2EC0208A3568BF /* libPods-GCore.a */; }; 25 | /* End PBXBuildFile section */ 26 | 27 | /* Begin PBXContainerItemProxy section */ 28 | 47F0D379264383BA0062DA6C /* PBXContainerItemProxy */ = { 29 | isa = PBXContainerItemProxy; 30 | containerPortal = 47F0D365264383B90062DA6C /* Project object */; 31 | proxyType = 1; 32 | remoteGlobalIDString = 47F0D36D264383BA0062DA6C; 33 | remoteInfo = GCore; 34 | }; 35 | /* End PBXContainerItemProxy section */ 36 | 37 | /* Begin PBXFileReference section */ 38 | 3A1642536A2EC0208A3568BF /* libPods-GCore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-GCore.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | 47D1E7E22644D48700D1EB33 /* GCoreNavVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GCoreNavVC.h; sourceTree = ""; }; 40 | 47D1E7E32644D48700D1EB33 /* GCoreNavVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GCoreNavVC.m; sourceTree = ""; }; 41 | 47D1E7E62644D4B900D1EB33 /* GPluginFunc.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GPluginFunc.h; sourceTree = ""; }; 42 | 47D1E7E72644D4B900D1EB33 /* GPluginFunc.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GPluginFunc.m; sourceTree = ""; }; 43 | 47D1E7EA2644D5C300D1EB33 /* GMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GMacros.h; sourceTree = ""; }; 44 | 47D1E7EE2644D82E00D1EB33 /* UIViewController+Ex.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIViewController+Ex.h"; sourceTree = ""; }; 45 | 47D1E7EF2644D82E00D1EB33 /* UIViewController+Ex.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+Ex.m"; sourceTree = ""; }; 46 | 47D1E81B2644E1CA00D1EB33 /* SecShowVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SecShowVC.h; sourceTree = ""; }; 47 | 47D1E81C2644E1CA00D1EB33 /* SecShowVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SecShowVC.m; sourceTree = ""; }; 48 | 47F0D36E264383BA0062DA6C /* GCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = GCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 49 | 47F0D371264383BA0062DA6C /* GCore.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GCore.h; sourceTree = ""; }; 50 | 47F0D372264383BA0062DA6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 51 | 47F0D377264383BA0062DA6C /* GCoreTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = GCoreTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 47F0D37C264383BA0062DA6C /* GCoreTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GCoreTests.m; sourceTree = ""; }; 53 | 47F0D37E264383BA0062DA6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54 | 47F0D3DC26439FBE0062DA6C /* ShowVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ShowVC.h; sourceTree = ""; }; 55 | 47F0D3DD26439FBE0062DA6C /* ShowVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ShowVC.m; sourceTree = ""; }; 56 | 95298A0FAFFA1B7CCCC51398 /* Pods-GCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GCore.debug.xcconfig"; path = "Target Support Files/Pods-GCore/Pods-GCore.debug.xcconfig"; sourceTree = ""; }; 57 | C904BEC3D6599EBE1A62739A /* Pods-GCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-GCore.release.xcconfig"; path = "Target Support Files/Pods-GCore/Pods-GCore.release.xcconfig"; sourceTree = ""; }; 58 | /* End PBXFileReference section */ 59 | 60 | /* Begin PBXFrameworksBuildPhase section */ 61 | 47F0D36B264383BA0062DA6C /* Frameworks */ = { 62 | isa = PBXFrameworksBuildPhase; 63 | buildActionMask = 2147483647; 64 | files = ( 65 | C0DBEB9F819FB90DCB530D1F /* libPods-GCore.a in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | 47F0D374264383BA0062DA6C /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | 47F0D378264383BA0062DA6C /* GCore.framework in Frameworks */, 74 | ); 75 | runOnlyForDeploymentPostprocessing = 0; 76 | }; 77 | /* End PBXFrameworksBuildPhase section */ 78 | 79 | /* Begin PBXGroup section */ 80 | 3CA44C0A8B2B51044801F88A /* Pods */ = { 81 | isa = PBXGroup; 82 | children = ( 83 | 95298A0FAFFA1B7CCCC51398 /* Pods-GCore.debug.xcconfig */, 84 | C904BEC3D6599EBE1A62739A /* Pods-GCore.release.xcconfig */, 85 | ); 86 | name = Pods; 87 | path = ../Pods; 88 | sourceTree = ""; 89 | }; 90 | 47D1E7EC2644D80A00D1EB33 /* Tools */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | 47D1E7EA2644D5C300D1EB33 /* GMacros.h */, 94 | ); 95 | path = Tools; 96 | sourceTree = ""; 97 | }; 98 | 47D1E7ED2644D81900D1EB33 /* UI */ = { 99 | isa = PBXGroup; 100 | children = ( 101 | 47D1E7E22644D48700D1EB33 /* GCoreNavVC.h */, 102 | 47D1E7E32644D48700D1EB33 /* GCoreNavVC.m */, 103 | 47F0D3DC26439FBE0062DA6C /* ShowVC.h */, 104 | 47F0D3DD26439FBE0062DA6C /* ShowVC.m */, 105 | 47D1E7EE2644D82E00D1EB33 /* UIViewController+Ex.h */, 106 | 47D1E7EF2644D82E00D1EB33 /* UIViewController+Ex.m */, 107 | 47D1E8182644DDEE00D1EB33 /* FuncVC */, 108 | ); 109 | path = UI; 110 | sourceTree = ""; 111 | }; 112 | 47D1E8182644DDEE00D1EB33 /* FuncVC */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | 47D1E81B2644E1CA00D1EB33 /* SecShowVC.h */, 116 | 47D1E81C2644E1CA00D1EB33 /* SecShowVC.m */, 117 | ); 118 | path = FuncVC; 119 | sourceTree = ""; 120 | }; 121 | 47F0D364264383B90062DA6C = { 122 | isa = PBXGroup; 123 | children = ( 124 | 47F0D370264383BA0062DA6C /* GCore */, 125 | 47F0D37B264383BA0062DA6C /* GCoreTests */, 126 | 47F0D36F264383BA0062DA6C /* Products */, 127 | 3CA44C0A8B2B51044801F88A /* Pods */, 128 | 6F528BF4834F3C9DBD223602 /* Frameworks */, 129 | ); 130 | sourceTree = ""; 131 | }; 132 | 47F0D36F264383BA0062DA6C /* Products */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | 47F0D36E264383BA0062DA6C /* GCore.framework */, 136 | 47F0D377264383BA0062DA6C /* GCoreTests.xctest */, 137 | ); 138 | name = Products; 139 | sourceTree = ""; 140 | }; 141 | 47F0D370264383BA0062DA6C /* GCore */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | 47D1E7ED2644D81900D1EB33 /* UI */, 145 | 47D1E7EC2644D80A00D1EB33 /* Tools */, 146 | 47F0D371264383BA0062DA6C /* GCore.h */, 147 | 47D1E7E62644D4B900D1EB33 /* GPluginFunc.h */, 148 | 47D1E7E72644D4B900D1EB33 /* GPluginFunc.m */, 149 | 47F0D372264383BA0062DA6C /* Info.plist */, 150 | ); 151 | path = GCore; 152 | sourceTree = ""; 153 | }; 154 | 47F0D37B264383BA0062DA6C /* GCoreTests */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | 47F0D37C264383BA0062DA6C /* GCoreTests.m */, 158 | 47F0D37E264383BA0062DA6C /* Info.plist */, 159 | ); 160 | path = GCoreTests; 161 | sourceTree = ""; 162 | }; 163 | 6F528BF4834F3C9DBD223602 /* Frameworks */ = { 164 | isa = PBXGroup; 165 | children = ( 166 | 3A1642536A2EC0208A3568BF /* libPods-GCore.a */, 167 | ); 168 | name = Frameworks; 169 | sourceTree = ""; 170 | }; 171 | /* End PBXGroup section */ 172 | 173 | /* Begin PBXHeadersBuildPhase section */ 174 | 47F0D369264383BA0062DA6C /* Headers */ = { 175 | isa = PBXHeadersBuildPhase; 176 | buildActionMask = 2147483647; 177 | files = ( 178 | 47D1E7E42644D48700D1EB33 /* GCoreNavVC.h in Headers */, 179 | 47D1E7F02644D82E00D1EB33 /* UIViewController+Ex.h in Headers */, 180 | 47D1E7E82644D4B900D1EB33 /* GPluginFunc.h in Headers */, 181 | 47D1E7EB2644D5C300D1EB33 /* GMacros.h in Headers */, 182 | 47F0D37F264383BA0062DA6C /* GCore.h in Headers */, 183 | 47D1E81D2644E1CA00D1EB33 /* SecShowVC.h in Headers */, 184 | 47F0D3DE26439FBE0062DA6C /* ShowVC.h in Headers */, 185 | ); 186 | runOnlyForDeploymentPostprocessing = 0; 187 | }; 188 | /* End PBXHeadersBuildPhase section */ 189 | 190 | /* Begin PBXNativeTarget section */ 191 | 47F0D36D264383BA0062DA6C /* GCore */ = { 192 | isa = PBXNativeTarget; 193 | buildConfigurationList = 47F0D382264383BA0062DA6C /* Build configuration list for PBXNativeTarget "GCore" */; 194 | buildPhases = ( 195 | 46381FA1C7DBCDBB5C137E90 /* [CP] Check Pods Manifest.lock */, 196 | 47F0D369264383BA0062DA6C /* Headers */, 197 | 47F0D36A264383BA0062DA6C /* Sources */, 198 | 47F0D36B264383BA0062DA6C /* Frameworks */, 199 | 47F0D36C264383BA0062DA6C /* Resources */, 200 | ); 201 | buildRules = ( 202 | ); 203 | dependencies = ( 204 | ); 205 | name = GCore; 206 | productName = GCore; 207 | productReference = 47F0D36E264383BA0062DA6C /* GCore.framework */; 208 | productType = "com.apple.product-type.framework"; 209 | }; 210 | 47F0D376264383BA0062DA6C /* GCoreTests */ = { 211 | isa = PBXNativeTarget; 212 | buildConfigurationList = 47F0D385264383BA0062DA6C /* Build configuration list for PBXNativeTarget "GCoreTests" */; 213 | buildPhases = ( 214 | 47F0D373264383BA0062DA6C /* Sources */, 215 | 47F0D374264383BA0062DA6C /* Frameworks */, 216 | 47F0D375264383BA0062DA6C /* Resources */, 217 | ); 218 | buildRules = ( 219 | ); 220 | dependencies = ( 221 | 47F0D37A264383BA0062DA6C /* PBXTargetDependency */, 222 | ); 223 | name = GCoreTests; 224 | productName = GCoreTests; 225 | productReference = 47F0D377264383BA0062DA6C /* GCoreTests.xctest */; 226 | productType = "com.apple.product-type.bundle.unit-test"; 227 | }; 228 | /* End PBXNativeTarget section */ 229 | 230 | /* Begin PBXProject section */ 231 | 47F0D365264383B90062DA6C /* Project object */ = { 232 | isa = PBXProject; 233 | attributes = { 234 | LastUpgradeCheck = 1250; 235 | TargetAttributes = { 236 | 47F0D36D264383BA0062DA6C = { 237 | CreatedOnToolsVersion = 12.5; 238 | LastSwiftMigration = 1250; 239 | }; 240 | 47F0D376264383BA0062DA6C = { 241 | CreatedOnToolsVersion = 12.5; 242 | }; 243 | }; 244 | }; 245 | buildConfigurationList = 47F0D368264383B90062DA6C /* Build configuration list for PBXProject "GCore" */; 246 | compatibilityVersion = "Xcode 9.3"; 247 | developmentRegion = en; 248 | hasScannedForEncodings = 0; 249 | knownRegions = ( 250 | en, 251 | Base, 252 | ); 253 | mainGroup = 47F0D364264383B90062DA6C; 254 | productRefGroup = 47F0D36F264383BA0062DA6C /* Products */; 255 | projectDirPath = ""; 256 | projectRoot = ""; 257 | targets = ( 258 | 47F0D36D264383BA0062DA6C /* GCore */, 259 | 47F0D376264383BA0062DA6C /* GCoreTests */, 260 | ); 261 | }; 262 | /* End PBXProject section */ 263 | 264 | /* Begin PBXResourcesBuildPhase section */ 265 | 47F0D36C264383BA0062DA6C /* Resources */ = { 266 | isa = PBXResourcesBuildPhase; 267 | buildActionMask = 2147483647; 268 | files = ( 269 | ); 270 | runOnlyForDeploymentPostprocessing = 0; 271 | }; 272 | 47F0D375264383BA0062DA6C /* Resources */ = { 273 | isa = PBXResourcesBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | ); 277 | runOnlyForDeploymentPostprocessing = 0; 278 | }; 279 | /* End PBXResourcesBuildPhase section */ 280 | 281 | /* Begin PBXShellScriptBuildPhase section */ 282 | 46381FA1C7DBCDBB5C137E90 /* [CP] Check Pods Manifest.lock */ = { 283 | isa = PBXShellScriptBuildPhase; 284 | buildActionMask = 2147483647; 285 | files = ( 286 | ); 287 | inputFileListPaths = ( 288 | ); 289 | inputPaths = ( 290 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 291 | "${PODS_ROOT}/Manifest.lock", 292 | ); 293 | name = "[CP] Check Pods Manifest.lock"; 294 | outputFileListPaths = ( 295 | ); 296 | outputPaths = ( 297 | "$(DERIVED_FILE_DIR)/Pods-GCore-checkManifestLockResult.txt", 298 | ); 299 | runOnlyForDeploymentPostprocessing = 0; 300 | shellPath = /bin/sh; 301 | 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"; 302 | showEnvVarsInLog = 0; 303 | }; 304 | /* End PBXShellScriptBuildPhase section */ 305 | 306 | /* Begin PBXSourcesBuildPhase section */ 307 | 47F0D36A264383BA0062DA6C /* Sources */ = { 308 | isa = PBXSourcesBuildPhase; 309 | buildActionMask = 2147483647; 310 | files = ( 311 | 47D1E81E2644E1CA00D1EB33 /* SecShowVC.m in Sources */, 312 | 47D1E7E52644D48700D1EB33 /* GCoreNavVC.m in Sources */, 313 | 47F0D3DF26439FBE0062DA6C /* ShowVC.m in Sources */, 314 | 47D1E7E92644D4B900D1EB33 /* GPluginFunc.m in Sources */, 315 | 47D1E7F12644D82E00D1EB33 /* UIViewController+Ex.m in Sources */, 316 | ); 317 | runOnlyForDeploymentPostprocessing = 0; 318 | }; 319 | 47F0D373264383BA0062DA6C /* Sources */ = { 320 | isa = PBXSourcesBuildPhase; 321 | buildActionMask = 2147483647; 322 | files = ( 323 | 47F0D37D264383BA0062DA6C /* GCoreTests.m in Sources */, 324 | ); 325 | runOnlyForDeploymentPostprocessing = 0; 326 | }; 327 | /* End PBXSourcesBuildPhase section */ 328 | 329 | /* Begin PBXTargetDependency section */ 330 | 47F0D37A264383BA0062DA6C /* PBXTargetDependency */ = { 331 | isa = PBXTargetDependency; 332 | target = 47F0D36D264383BA0062DA6C /* GCore */; 333 | targetProxy = 47F0D379264383BA0062DA6C /* PBXContainerItemProxy */; 334 | }; 335 | /* End PBXTargetDependency section */ 336 | 337 | /* Begin XCBuildConfiguration section */ 338 | 47F0D380264383BA0062DA6C /* Debug */ = { 339 | isa = XCBuildConfiguration; 340 | buildSettings = { 341 | ALWAYS_SEARCH_USER_PATHS = NO; 342 | CLANG_ANALYZER_NONNULL = YES; 343 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 344 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 345 | CLANG_CXX_LIBRARY = "libc++"; 346 | CLANG_ENABLE_MODULES = YES; 347 | CLANG_ENABLE_OBJC_ARC = YES; 348 | CLANG_ENABLE_OBJC_WEAK = YES; 349 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 350 | CLANG_WARN_BOOL_CONVERSION = YES; 351 | CLANG_WARN_COMMA = YES; 352 | CLANG_WARN_CONSTANT_CONVERSION = YES; 353 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 354 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 355 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 356 | CLANG_WARN_EMPTY_BODY = YES; 357 | CLANG_WARN_ENUM_CONVERSION = YES; 358 | CLANG_WARN_INFINITE_RECURSION = YES; 359 | CLANG_WARN_INT_CONVERSION = YES; 360 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 361 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 362 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 363 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 364 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 365 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 366 | CLANG_WARN_STRICT_PROTOTYPES = YES; 367 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 368 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 369 | CLANG_WARN_UNREACHABLE_CODE = YES; 370 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 371 | COPY_PHASE_STRIP = NO; 372 | CURRENT_PROJECT_VERSION = 1; 373 | DEBUG_INFORMATION_FORMAT = dwarf; 374 | ENABLE_STRICT_OBJC_MSGSEND = YES; 375 | ENABLE_TESTABILITY = YES; 376 | GCC_C_LANGUAGE_STANDARD = gnu11; 377 | GCC_DYNAMIC_NO_PIC = NO; 378 | GCC_NO_COMMON_BLOCKS = YES; 379 | GCC_OPTIMIZATION_LEVEL = 0; 380 | GCC_PREPROCESSOR_DEFINITIONS = ( 381 | "DEBUG=1", 382 | "$(inherited)", 383 | ); 384 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 385 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 386 | GCC_WARN_UNDECLARED_SELECTOR = YES; 387 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 388 | GCC_WARN_UNUSED_FUNCTION = YES; 389 | GCC_WARN_UNUSED_VARIABLE = YES; 390 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 391 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 392 | MTL_FAST_MATH = YES; 393 | ONLY_ACTIVE_ARCH = YES; 394 | SDKROOT = iphoneos; 395 | VERSIONING_SYSTEM = "apple-generic"; 396 | VERSION_INFO_PREFIX = ""; 397 | }; 398 | name = Debug; 399 | }; 400 | 47F0D381264383BA0062DA6C /* Release */ = { 401 | isa = XCBuildConfiguration; 402 | buildSettings = { 403 | ALWAYS_SEARCH_USER_PATHS = NO; 404 | CLANG_ANALYZER_NONNULL = YES; 405 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 406 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 407 | CLANG_CXX_LIBRARY = "libc++"; 408 | CLANG_ENABLE_MODULES = YES; 409 | CLANG_ENABLE_OBJC_ARC = YES; 410 | CLANG_ENABLE_OBJC_WEAK = YES; 411 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 412 | CLANG_WARN_BOOL_CONVERSION = YES; 413 | CLANG_WARN_COMMA = YES; 414 | CLANG_WARN_CONSTANT_CONVERSION = YES; 415 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 416 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 417 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 418 | CLANG_WARN_EMPTY_BODY = YES; 419 | CLANG_WARN_ENUM_CONVERSION = YES; 420 | CLANG_WARN_INFINITE_RECURSION = YES; 421 | CLANG_WARN_INT_CONVERSION = YES; 422 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 423 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 424 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 425 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 426 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 427 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 428 | CLANG_WARN_STRICT_PROTOTYPES = YES; 429 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 430 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 431 | CLANG_WARN_UNREACHABLE_CODE = YES; 432 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 433 | COPY_PHASE_STRIP = NO; 434 | CURRENT_PROJECT_VERSION = 1; 435 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 436 | ENABLE_NS_ASSERTIONS = NO; 437 | ENABLE_STRICT_OBJC_MSGSEND = YES; 438 | GCC_C_LANGUAGE_STANDARD = gnu11; 439 | GCC_NO_COMMON_BLOCKS = YES; 440 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 441 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 442 | GCC_WARN_UNDECLARED_SELECTOR = YES; 443 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 444 | GCC_WARN_UNUSED_FUNCTION = YES; 445 | GCC_WARN_UNUSED_VARIABLE = YES; 446 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 447 | MTL_ENABLE_DEBUG_INFO = NO; 448 | MTL_FAST_MATH = YES; 449 | SDKROOT = iphoneos; 450 | VALIDATE_PRODUCT = YES; 451 | VERSIONING_SYSTEM = "apple-generic"; 452 | VERSION_INFO_PREFIX = ""; 453 | }; 454 | name = Release; 455 | }; 456 | 47F0D383264383BA0062DA6C /* Debug */ = { 457 | isa = XCBuildConfiguration; 458 | baseConfigurationReference = 95298A0FAFFA1B7CCCC51398 /* Pods-GCore.debug.xcconfig */; 459 | buildSettings = { 460 | CLANG_ENABLE_MODULES = YES; 461 | CODE_SIGN_IDENTITY = "Apple Development"; 462 | CODE_SIGN_STYLE = Automatic; 463 | CURRENT_PROJECT_VERSION = 1.0; 464 | DEFINES_MODULE = YES; 465 | DEVELOPMENT_TEAM = ""; 466 | DYLIB_COMPATIBILITY_VERSION = 1; 467 | DYLIB_CURRENT_VERSION = 1; 468 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 469 | INFOPLIST_FILE = GCore/Info.plist; 470 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 471 | LD_RUNPATH_SEARCH_PATHS = ( 472 | "$(inherited)", 473 | "@executable_path/Frameworks", 474 | "@loader_path/Frameworks", 475 | ); 476 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.iot.smartdevice; 477 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 478 | PROVISIONING_PROFILE_SPECIFIER = ""; 479 | SKIP_INSTALL = YES; 480 | SUPPORTS_MACCATALYST = NO; 481 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 482 | SWIFT_VERSION = 5.0; 483 | TARGETED_DEVICE_FAMILY = "1,2"; 484 | }; 485 | name = Debug; 486 | }; 487 | 47F0D384264383BA0062DA6C /* Release */ = { 488 | isa = XCBuildConfiguration; 489 | baseConfigurationReference = C904BEC3D6599EBE1A62739A /* Pods-GCore.release.xcconfig */; 490 | buildSettings = { 491 | CLANG_ENABLE_MODULES = YES; 492 | CODE_SIGN_IDENTITY = "Apple Development"; 493 | CODE_SIGN_STYLE = Manual; 494 | CURRENT_PROJECT_VERSION = 1.0; 495 | DEFINES_MODULE = YES; 496 | DEVELOPMENT_TEAM = ""; 497 | DYLIB_COMPATIBILITY_VERSION = 1; 498 | DYLIB_CURRENT_VERSION = 1; 499 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 500 | INFOPLIST_FILE = GCore/Info.plist; 501 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 502 | LD_RUNPATH_SEARCH_PATHS = ( 503 | "$(inherited)", 504 | "@executable_path/Frameworks", 505 | "@loader_path/Frameworks", 506 | ); 507 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.iot.smartdevice; 508 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 509 | PROVISIONING_PROFILE_SPECIFIER = ""; 510 | SKIP_INSTALL = YES; 511 | SUPPORTS_MACCATALYST = NO; 512 | SWIFT_VERSION = 5.0; 513 | TARGETED_DEVICE_FAMILY = "1,2"; 514 | }; 515 | name = Release; 516 | }; 517 | 47F0D386264383BA0062DA6C /* Debug */ = { 518 | isa = XCBuildConfiguration; 519 | buildSettings = { 520 | CODE_SIGN_STYLE = Automatic; 521 | INFOPLIST_FILE = GCoreTests/Info.plist; 522 | LD_RUNPATH_SEARCH_PATHS = ( 523 | "$(inherited)", 524 | "@executable_path/Frameworks", 525 | "@loader_path/Frameworks", 526 | ); 527 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.GCoreTests; 528 | PRODUCT_NAME = "$(TARGET_NAME)"; 529 | TARGETED_DEVICE_FAMILY = "1,2"; 530 | }; 531 | name = Debug; 532 | }; 533 | 47F0D387264383BA0062DA6C /* Release */ = { 534 | isa = XCBuildConfiguration; 535 | buildSettings = { 536 | CODE_SIGN_STYLE = Automatic; 537 | INFOPLIST_FILE = GCoreTests/Info.plist; 538 | LD_RUNPATH_SEARCH_PATHS = ( 539 | "$(inherited)", 540 | "@executable_path/Frameworks", 541 | "@loader_path/Frameworks", 542 | ); 543 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.GCoreTests; 544 | PRODUCT_NAME = "$(TARGET_NAME)"; 545 | TARGETED_DEVICE_FAMILY = "1,2"; 546 | }; 547 | name = Release; 548 | }; 549 | /* End XCBuildConfiguration section */ 550 | 551 | /* Begin XCConfigurationList section */ 552 | 47F0D368264383B90062DA6C /* Build configuration list for PBXProject "GCore" */ = { 553 | isa = XCConfigurationList; 554 | buildConfigurations = ( 555 | 47F0D380264383BA0062DA6C /* Debug */, 556 | 47F0D381264383BA0062DA6C /* Release */, 557 | ); 558 | defaultConfigurationIsVisible = 0; 559 | defaultConfigurationName = Release; 560 | }; 561 | 47F0D382264383BA0062DA6C /* Build configuration list for PBXNativeTarget "GCore" */ = { 562 | isa = XCConfigurationList; 563 | buildConfigurations = ( 564 | 47F0D383264383BA0062DA6C /* Debug */, 565 | 47F0D384264383BA0062DA6C /* Release */, 566 | ); 567 | defaultConfigurationIsVisible = 0; 568 | defaultConfigurationName = Release; 569 | }; 570 | 47F0D385264383BA0062DA6C /* Build configuration list for PBXNativeTarget "GCoreTests" */ = { 571 | isa = XCConfigurationList; 572 | buildConfigurations = ( 573 | 47F0D386264383BA0062DA6C /* Debug */, 574 | 47F0D387264383BA0062DA6C /* Release */, 575 | ); 576 | defaultConfigurationIsVisible = 0; 577 | defaultConfigurationName = Release; 578 | }; 579 | /* End XCConfigurationList section */ 580 | }; 581 | rootObject = 47F0D365264383B90062DA6C /* Project object */; 582 | } 583 | -------------------------------------------------------------------------------- /PlugInDemo/PlugInDemo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 47F0D39E26438E950062DA6C /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F0D39D26438E950062DA6C /* AppDelegate.m */; }; 11 | 47F0D3A926438E960062DA6C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 47F0D3A826438E960062DA6C /* Assets.xcassets */; }; 12 | 47F0D3AC26438E960062DA6C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 47F0D3AA26438E960062DA6C /* LaunchScreen.storyboard */; }; 13 | 47F0D3AF26438E960062DA6C /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F0D3AE26438E960062DA6C /* main.m */; }; 14 | 47F0D3B926438E970062DA6C /* PlugInDemoTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F0D3B826438E970062DA6C /* PlugInDemoTests.m */; }; 15 | 47F0D3C426438E970062DA6C /* PlugInDemoUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F0D3C326438E970062DA6C /* PlugInDemoUITests.m */; }; 16 | 47F0D3D426438F670062DA6C /* TestVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 47F0D3D226438F670062DA6C /* TestVC.m */; }; 17 | 47F0D3D526438F670062DA6C /* TestVC.xib in Resources */ = {isa = PBXBuildFile; fileRef = 47F0D3D326438F670062DA6C /* TestVC.xib */; }; 18 | 69B51C20507186FE35363964 /* Pods_PlugInDemo.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 11DBDCE7A6A49D66111938A5 /* Pods_PlugInDemo.framework */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 47F0D3B526438E970062DA6C /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 47F0D39126438E950062DA6C /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 47F0D39826438E950062DA6C; 27 | remoteInfo = PlugInDemo; 28 | }; 29 | 47F0D3C026438E970062DA6C /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = 47F0D39126438E950062DA6C /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = 47F0D39826438E950062DA6C; 34 | remoteInfo = PlugInDemo; 35 | }; 36 | /* End PBXContainerItemProxy section */ 37 | 38 | /* Begin PBXCopyFilesBuildPhase section */ 39 | 47F0D3F52644017E0062DA6C /* Embed Frameworks */ = { 40 | isa = PBXCopyFilesBuildPhase; 41 | buildActionMask = 2147483647; 42 | dstPath = ""; 43 | dstSubfolderSpec = 10; 44 | files = ( 45 | ); 46 | name = "Embed Frameworks"; 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | /* End PBXCopyFilesBuildPhase section */ 50 | 51 | /* Begin PBXFileReference section */ 52 | 0E0C6C4D503DA95E4B9696EC /* Pods-PlugInDemo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PlugInDemo.release.xcconfig"; path = "Target Support Files/Pods-PlugInDemo/Pods-PlugInDemo.release.xcconfig"; sourceTree = ""; }; 53 | 11DBDCE7A6A49D66111938A5 /* Pods_PlugInDemo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PlugInDemo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | 47F0D39926438E950062DA6C /* PlugInDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PlugInDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | 47F0D39C26438E950062DA6C /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 56 | 47F0D39D26438E950062DA6C /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 57 | 47F0D3A826438E960062DA6C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 58 | 47F0D3AB26438E960062DA6C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 59 | 47F0D3AD26438E960062DA6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 60 | 47F0D3AE26438E960062DA6C /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 61 | 47F0D3B426438E970062DA6C /* PlugInDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PlugInDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 47F0D3B826438E970062DA6C /* PlugInDemoTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlugInDemoTests.m; sourceTree = ""; }; 63 | 47F0D3BA26438E970062DA6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 64 | 47F0D3BF26438E970062DA6C /* PlugInDemoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PlugInDemoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | 47F0D3C326438E970062DA6C /* PlugInDemoUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlugInDemoUITests.m; sourceTree = ""; }; 66 | 47F0D3C526438E970062DA6C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 67 | 47F0D3D126438F670062DA6C /* TestVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestVC.h; sourceTree = ""; }; 68 | 47F0D3D226438F670062DA6C /* TestVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestVC.m; sourceTree = ""; }; 69 | 47F0D3D326438F670062DA6C /* TestVC.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TestVC.xib; sourceTree = ""; }; 70 | 6DE7F9631D783443BBC8CC05 /* Pods-PlugInDemo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PlugInDemo.debug.xcconfig"; path = "Target Support Files/Pods-PlugInDemo/Pods-PlugInDemo.debug.xcconfig"; sourceTree = ""; }; 71 | /* End PBXFileReference section */ 72 | 73 | /* Begin PBXFrameworksBuildPhase section */ 74 | 47F0D39626438E950062DA6C /* Frameworks */ = { 75 | isa = PBXFrameworksBuildPhase; 76 | buildActionMask = 2147483647; 77 | files = ( 78 | 69B51C20507186FE35363964 /* Pods_PlugInDemo.framework in Frameworks */, 79 | ); 80 | runOnlyForDeploymentPostprocessing = 0; 81 | }; 82 | 47F0D3B126438E970062DA6C /* Frameworks */ = { 83 | isa = PBXFrameworksBuildPhase; 84 | buildActionMask = 2147483647; 85 | files = ( 86 | ); 87 | runOnlyForDeploymentPostprocessing = 0; 88 | }; 89 | 47F0D3BC26438E970062DA6C /* Frameworks */ = { 90 | isa = PBXFrameworksBuildPhase; 91 | buildActionMask = 2147483647; 92 | files = ( 93 | ); 94 | runOnlyForDeploymentPostprocessing = 0; 95 | }; 96 | /* End PBXFrameworksBuildPhase section */ 97 | 98 | /* Begin PBXGroup section */ 99 | 249C75014B4FEBB4D4C0FCBB /* Pods */ = { 100 | isa = PBXGroup; 101 | children = ( 102 | 6DE7F9631D783443BBC8CC05 /* Pods-PlugInDemo.debug.xcconfig */, 103 | 0E0C6C4D503DA95E4B9696EC /* Pods-PlugInDemo.release.xcconfig */, 104 | ); 105 | path = Pods; 106 | sourceTree = ""; 107 | }; 108 | 47F0D39026438E950062DA6C = { 109 | isa = PBXGroup; 110 | children = ( 111 | 47F0D39B26438E950062DA6C /* PlugInDemo */, 112 | 47F0D3B726438E970062DA6C /* PlugInDemoTests */, 113 | 47F0D3C226438E970062DA6C /* PlugInDemoUITests */, 114 | 47F0D39A26438E950062DA6C /* Products */, 115 | 249C75014B4FEBB4D4C0FCBB /* Pods */, 116 | 503598179EEB728284AF1073 /* Frameworks */, 117 | ); 118 | sourceTree = ""; 119 | }; 120 | 47F0D39A26438E950062DA6C /* Products */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | 47F0D39926438E950062DA6C /* PlugInDemo.app */, 124 | 47F0D3B426438E970062DA6C /* PlugInDemoTests.xctest */, 125 | 47F0D3BF26438E970062DA6C /* PlugInDemoUITests.xctest */, 126 | ); 127 | name = Products; 128 | sourceTree = ""; 129 | }; 130 | 47F0D39B26438E950062DA6C /* PlugInDemo */ = { 131 | isa = PBXGroup; 132 | children = ( 133 | 47F0D39C26438E950062DA6C /* AppDelegate.h */, 134 | 47F0D39D26438E950062DA6C /* AppDelegate.m */, 135 | 47F0D3D126438F670062DA6C /* TestVC.h */, 136 | 47F0D3D226438F670062DA6C /* TestVC.m */, 137 | 47F0D3D326438F670062DA6C /* TestVC.xib */, 138 | 47F0D3A826438E960062DA6C /* Assets.xcassets */, 139 | 47F0D3AA26438E960062DA6C /* LaunchScreen.storyboard */, 140 | 47F0D3AD26438E960062DA6C /* Info.plist */, 141 | 47F0D3AE26438E960062DA6C /* main.m */, 142 | ); 143 | path = PlugInDemo; 144 | sourceTree = ""; 145 | }; 146 | 47F0D3B726438E970062DA6C /* PlugInDemoTests */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | 47F0D3B826438E970062DA6C /* PlugInDemoTests.m */, 150 | 47F0D3BA26438E970062DA6C /* Info.plist */, 151 | ); 152 | path = PlugInDemoTests; 153 | sourceTree = ""; 154 | }; 155 | 47F0D3C226438E970062DA6C /* PlugInDemoUITests */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 47F0D3C326438E970062DA6C /* PlugInDemoUITests.m */, 159 | 47F0D3C526438E970062DA6C /* Info.plist */, 160 | ); 161 | path = PlugInDemoUITests; 162 | sourceTree = ""; 163 | }; 164 | 503598179EEB728284AF1073 /* Frameworks */ = { 165 | isa = PBXGroup; 166 | children = ( 167 | 11DBDCE7A6A49D66111938A5 /* Pods_PlugInDemo.framework */, 168 | ); 169 | name = Frameworks; 170 | sourceTree = ""; 171 | }; 172 | /* End PBXGroup section */ 173 | 174 | /* Begin PBXNativeTarget section */ 175 | 47F0D39826438E950062DA6C /* PlugInDemo */ = { 176 | isa = PBXNativeTarget; 177 | buildConfigurationList = 47F0D3C826438E970062DA6C /* Build configuration list for PBXNativeTarget "PlugInDemo" */; 178 | buildPhases = ( 179 | 32B44F0FF21CC1D5D4D34C09 /* [CP] Check Pods Manifest.lock */, 180 | 47F0D39526438E950062DA6C /* Sources */, 181 | 47F0D39626438E950062DA6C /* Frameworks */, 182 | 47F0D39726438E950062DA6C /* Resources */, 183 | 6D754DDEC60830273E5B1B37 /* [CP] Embed Pods Frameworks */, 184 | 47F0D3F52644017E0062DA6C /* Embed Frameworks */, 185 | ); 186 | buildRules = ( 187 | ); 188 | dependencies = ( 189 | ); 190 | name = PlugInDemo; 191 | productName = PlugInDemo; 192 | productReference = 47F0D39926438E950062DA6C /* PlugInDemo.app */; 193 | productType = "com.apple.product-type.application"; 194 | }; 195 | 47F0D3B326438E970062DA6C /* PlugInDemoTests */ = { 196 | isa = PBXNativeTarget; 197 | buildConfigurationList = 47F0D3CB26438E970062DA6C /* Build configuration list for PBXNativeTarget "PlugInDemoTests" */; 198 | buildPhases = ( 199 | 47F0D3B026438E970062DA6C /* Sources */, 200 | 47F0D3B126438E970062DA6C /* Frameworks */, 201 | 47F0D3B226438E970062DA6C /* Resources */, 202 | ); 203 | buildRules = ( 204 | ); 205 | dependencies = ( 206 | 47F0D3B626438E970062DA6C /* PBXTargetDependency */, 207 | ); 208 | name = PlugInDemoTests; 209 | productName = PlugInDemoTests; 210 | productReference = 47F0D3B426438E970062DA6C /* PlugInDemoTests.xctest */; 211 | productType = "com.apple.product-type.bundle.unit-test"; 212 | }; 213 | 47F0D3BE26438E970062DA6C /* PlugInDemoUITests */ = { 214 | isa = PBXNativeTarget; 215 | buildConfigurationList = 47F0D3CE26438E970062DA6C /* Build configuration list for PBXNativeTarget "PlugInDemoUITests" */; 216 | buildPhases = ( 217 | 47F0D3BB26438E970062DA6C /* Sources */, 218 | 47F0D3BC26438E970062DA6C /* Frameworks */, 219 | 47F0D3BD26438E970062DA6C /* Resources */, 220 | ); 221 | buildRules = ( 222 | ); 223 | dependencies = ( 224 | 47F0D3C126438E970062DA6C /* PBXTargetDependency */, 225 | ); 226 | name = PlugInDemoUITests; 227 | productName = PlugInDemoUITests; 228 | productReference = 47F0D3BF26438E970062DA6C /* PlugInDemoUITests.xctest */; 229 | productType = "com.apple.product-type.bundle.ui-testing"; 230 | }; 231 | /* End PBXNativeTarget section */ 232 | 233 | /* Begin PBXProject section */ 234 | 47F0D39126438E950062DA6C /* Project object */ = { 235 | isa = PBXProject; 236 | attributes = { 237 | LastUpgradeCheck = 1250; 238 | TargetAttributes = { 239 | 47F0D39826438E950062DA6C = { 240 | CreatedOnToolsVersion = 12.5; 241 | }; 242 | 47F0D3B326438E970062DA6C = { 243 | CreatedOnToolsVersion = 12.5; 244 | TestTargetID = 47F0D39826438E950062DA6C; 245 | }; 246 | 47F0D3BE26438E970062DA6C = { 247 | CreatedOnToolsVersion = 12.5; 248 | TestTargetID = 47F0D39826438E950062DA6C; 249 | }; 250 | }; 251 | }; 252 | buildConfigurationList = 47F0D39426438E950062DA6C /* Build configuration list for PBXProject "PlugInDemo" */; 253 | compatibilityVersion = "Xcode 9.3"; 254 | developmentRegion = en; 255 | hasScannedForEncodings = 0; 256 | knownRegions = ( 257 | en, 258 | Base, 259 | ); 260 | mainGroup = 47F0D39026438E950062DA6C; 261 | productRefGroup = 47F0D39A26438E950062DA6C /* Products */; 262 | projectDirPath = ""; 263 | projectRoot = ""; 264 | targets = ( 265 | 47F0D39826438E950062DA6C /* PlugInDemo */, 266 | 47F0D3B326438E970062DA6C /* PlugInDemoTests */, 267 | 47F0D3BE26438E970062DA6C /* PlugInDemoUITests */, 268 | ); 269 | }; 270 | /* End PBXProject section */ 271 | 272 | /* Begin PBXResourcesBuildPhase section */ 273 | 47F0D39726438E950062DA6C /* Resources */ = { 274 | isa = PBXResourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | 47F0D3AC26438E960062DA6C /* LaunchScreen.storyboard in Resources */, 278 | 47F0D3A926438E960062DA6C /* Assets.xcassets in Resources */, 279 | 47F0D3D526438F670062DA6C /* TestVC.xib in Resources */, 280 | ); 281 | runOnlyForDeploymentPostprocessing = 0; 282 | }; 283 | 47F0D3B226438E970062DA6C /* Resources */ = { 284 | isa = PBXResourcesBuildPhase; 285 | buildActionMask = 2147483647; 286 | files = ( 287 | ); 288 | runOnlyForDeploymentPostprocessing = 0; 289 | }; 290 | 47F0D3BD26438E970062DA6C /* Resources */ = { 291 | isa = PBXResourcesBuildPhase; 292 | buildActionMask = 2147483647; 293 | files = ( 294 | ); 295 | runOnlyForDeploymentPostprocessing = 0; 296 | }; 297 | /* End PBXResourcesBuildPhase section */ 298 | 299 | /* Begin PBXShellScriptBuildPhase section */ 300 | 32B44F0FF21CC1D5D4D34C09 /* [CP] Check Pods Manifest.lock */ = { 301 | isa = PBXShellScriptBuildPhase; 302 | buildActionMask = 2147483647; 303 | files = ( 304 | ); 305 | inputFileListPaths = ( 306 | ); 307 | inputPaths = ( 308 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 309 | "${PODS_ROOT}/Manifest.lock", 310 | ); 311 | name = "[CP] Check Pods Manifest.lock"; 312 | outputFileListPaths = ( 313 | ); 314 | outputPaths = ( 315 | "$(DERIVED_FILE_DIR)/Pods-PlugInDemo-checkManifestLockResult.txt", 316 | ); 317 | runOnlyForDeploymentPostprocessing = 0; 318 | shellPath = /bin/sh; 319 | 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"; 320 | showEnvVarsInLog = 0; 321 | }; 322 | 6D754DDEC60830273E5B1B37 /* [CP] Embed Pods Frameworks */ = { 323 | isa = PBXShellScriptBuildPhase; 324 | buildActionMask = 2147483647; 325 | files = ( 326 | ); 327 | inputFileListPaths = ( 328 | "${PODS_ROOT}/Target Support Files/Pods-PlugInDemo/Pods-PlugInDemo-frameworks-${CONFIGURATION}-input-files.xcfilelist", 329 | ); 330 | name = "[CP] Embed Pods Frameworks"; 331 | outputFileListPaths = ( 332 | "${PODS_ROOT}/Target Support Files/Pods-PlugInDemo/Pods-PlugInDemo-frameworks-${CONFIGURATION}-output-files.xcfilelist", 333 | ); 334 | runOnlyForDeploymentPostprocessing = 0; 335 | shellPath = /bin/sh; 336 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PlugInDemo/Pods-PlugInDemo-frameworks.sh\"\n"; 337 | showEnvVarsInLog = 0; 338 | }; 339 | /* End PBXShellScriptBuildPhase section */ 340 | 341 | /* Begin PBXSourcesBuildPhase section */ 342 | 47F0D39526438E950062DA6C /* Sources */ = { 343 | isa = PBXSourcesBuildPhase; 344 | buildActionMask = 2147483647; 345 | files = ( 346 | 47F0D3D426438F670062DA6C /* TestVC.m in Sources */, 347 | 47F0D39E26438E950062DA6C /* AppDelegate.m in Sources */, 348 | 47F0D3AF26438E960062DA6C /* main.m in Sources */, 349 | ); 350 | runOnlyForDeploymentPostprocessing = 0; 351 | }; 352 | 47F0D3B026438E970062DA6C /* Sources */ = { 353 | isa = PBXSourcesBuildPhase; 354 | buildActionMask = 2147483647; 355 | files = ( 356 | 47F0D3B926438E970062DA6C /* PlugInDemoTests.m in Sources */, 357 | ); 358 | runOnlyForDeploymentPostprocessing = 0; 359 | }; 360 | 47F0D3BB26438E970062DA6C /* Sources */ = { 361 | isa = PBXSourcesBuildPhase; 362 | buildActionMask = 2147483647; 363 | files = ( 364 | 47F0D3C426438E970062DA6C /* PlugInDemoUITests.m in Sources */, 365 | ); 366 | runOnlyForDeploymentPostprocessing = 0; 367 | }; 368 | /* End PBXSourcesBuildPhase section */ 369 | 370 | /* Begin PBXTargetDependency section */ 371 | 47F0D3B626438E970062DA6C /* PBXTargetDependency */ = { 372 | isa = PBXTargetDependency; 373 | target = 47F0D39826438E950062DA6C /* PlugInDemo */; 374 | targetProxy = 47F0D3B526438E970062DA6C /* PBXContainerItemProxy */; 375 | }; 376 | 47F0D3C126438E970062DA6C /* PBXTargetDependency */ = { 377 | isa = PBXTargetDependency; 378 | target = 47F0D39826438E950062DA6C /* PlugInDemo */; 379 | targetProxy = 47F0D3C026438E970062DA6C /* PBXContainerItemProxy */; 380 | }; 381 | /* End PBXTargetDependency section */ 382 | 383 | /* Begin PBXVariantGroup section */ 384 | 47F0D3AA26438E960062DA6C /* LaunchScreen.storyboard */ = { 385 | isa = PBXVariantGroup; 386 | children = ( 387 | 47F0D3AB26438E960062DA6C /* Base */, 388 | ); 389 | name = LaunchScreen.storyboard; 390 | sourceTree = ""; 391 | }; 392 | /* End PBXVariantGroup section */ 393 | 394 | /* Begin XCBuildConfiguration section */ 395 | 47F0D3C626438E970062DA6C /* Debug */ = { 396 | isa = XCBuildConfiguration; 397 | buildSettings = { 398 | ALWAYS_SEARCH_USER_PATHS = NO; 399 | CLANG_ANALYZER_NONNULL = YES; 400 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 401 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 402 | CLANG_CXX_LIBRARY = "libc++"; 403 | CLANG_ENABLE_MODULES = YES; 404 | CLANG_ENABLE_OBJC_ARC = YES; 405 | CLANG_ENABLE_OBJC_WEAK = YES; 406 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 407 | CLANG_WARN_BOOL_CONVERSION = YES; 408 | CLANG_WARN_COMMA = YES; 409 | CLANG_WARN_CONSTANT_CONVERSION = YES; 410 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 411 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 412 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 413 | CLANG_WARN_EMPTY_BODY = YES; 414 | CLANG_WARN_ENUM_CONVERSION = YES; 415 | CLANG_WARN_INFINITE_RECURSION = YES; 416 | CLANG_WARN_INT_CONVERSION = YES; 417 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 418 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 419 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 420 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 421 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 422 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 423 | CLANG_WARN_STRICT_PROTOTYPES = YES; 424 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 425 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 426 | CLANG_WARN_UNREACHABLE_CODE = YES; 427 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 428 | COPY_PHASE_STRIP = NO; 429 | DEBUG_INFORMATION_FORMAT = dwarf; 430 | ENABLE_STRICT_OBJC_MSGSEND = YES; 431 | ENABLE_TESTABILITY = YES; 432 | GCC_C_LANGUAGE_STANDARD = gnu11; 433 | GCC_DYNAMIC_NO_PIC = NO; 434 | GCC_NO_COMMON_BLOCKS = YES; 435 | GCC_OPTIMIZATION_LEVEL = 0; 436 | GCC_PREPROCESSOR_DEFINITIONS = ( 437 | "DEBUG=1", 438 | "$(inherited)", 439 | ); 440 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 441 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 442 | GCC_WARN_UNDECLARED_SELECTOR = YES; 443 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 444 | GCC_WARN_UNUSED_FUNCTION = YES; 445 | GCC_WARN_UNUSED_VARIABLE = YES; 446 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 447 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 448 | MTL_FAST_MATH = YES; 449 | ONLY_ACTIVE_ARCH = YES; 450 | SDKROOT = iphoneos; 451 | }; 452 | name = Debug; 453 | }; 454 | 47F0D3C726438E970062DA6C /* Release */ = { 455 | isa = XCBuildConfiguration; 456 | buildSettings = { 457 | ALWAYS_SEARCH_USER_PATHS = NO; 458 | CLANG_ANALYZER_NONNULL = YES; 459 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 460 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 461 | CLANG_CXX_LIBRARY = "libc++"; 462 | CLANG_ENABLE_MODULES = YES; 463 | CLANG_ENABLE_OBJC_ARC = YES; 464 | CLANG_ENABLE_OBJC_WEAK = YES; 465 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 466 | CLANG_WARN_BOOL_CONVERSION = YES; 467 | CLANG_WARN_COMMA = YES; 468 | CLANG_WARN_CONSTANT_CONVERSION = YES; 469 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 470 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 471 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 472 | CLANG_WARN_EMPTY_BODY = YES; 473 | CLANG_WARN_ENUM_CONVERSION = YES; 474 | CLANG_WARN_INFINITE_RECURSION = YES; 475 | CLANG_WARN_INT_CONVERSION = YES; 476 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 477 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 478 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 479 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 480 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 481 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 482 | CLANG_WARN_STRICT_PROTOTYPES = YES; 483 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 484 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 485 | CLANG_WARN_UNREACHABLE_CODE = YES; 486 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 487 | COPY_PHASE_STRIP = NO; 488 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 489 | ENABLE_NS_ASSERTIONS = NO; 490 | ENABLE_STRICT_OBJC_MSGSEND = YES; 491 | GCC_C_LANGUAGE_STANDARD = gnu11; 492 | GCC_NO_COMMON_BLOCKS = YES; 493 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 494 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 495 | GCC_WARN_UNDECLARED_SELECTOR = YES; 496 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 497 | GCC_WARN_UNUSED_FUNCTION = YES; 498 | GCC_WARN_UNUSED_VARIABLE = YES; 499 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 500 | MTL_ENABLE_DEBUG_INFO = NO; 501 | MTL_FAST_MATH = YES; 502 | SDKROOT = iphoneos; 503 | VALIDATE_PRODUCT = YES; 504 | }; 505 | name = Release; 506 | }; 507 | 47F0D3C926438E970062DA6C /* Debug */ = { 508 | isa = XCBuildConfiguration; 509 | baseConfigurationReference = 6DE7F9631D783443BBC8CC05 /* Pods-PlugInDemo.debug.xcconfig */; 510 | buildSettings = { 511 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 512 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 513 | CODE_SIGN_STYLE = Automatic; 514 | FRAMEWORK_SEARCH_PATHS = ( 515 | "$(inherited)", 516 | "$(PROJECT_DIR)/PlugInDemo", 517 | ); 518 | INFOPLIST_FILE = PlugInDemo/Info.plist; 519 | LD_RUNPATH_SEARCH_PATHS = ( 520 | "$(inherited)", 521 | "@executable_path/Frameworks", 522 | ); 523 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.PlugInDemo; 524 | PRODUCT_NAME = "$(TARGET_NAME)"; 525 | TARGETED_DEVICE_FAMILY = "1,2"; 526 | }; 527 | name = Debug; 528 | }; 529 | 47F0D3CA26438E970062DA6C /* Release */ = { 530 | isa = XCBuildConfiguration; 531 | baseConfigurationReference = 0E0C6C4D503DA95E4B9696EC /* Pods-PlugInDemo.release.xcconfig */; 532 | buildSettings = { 533 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 534 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 535 | CODE_SIGN_STYLE = Automatic; 536 | FRAMEWORK_SEARCH_PATHS = ( 537 | "$(inherited)", 538 | "$(PROJECT_DIR)/PlugInDemo", 539 | ); 540 | INFOPLIST_FILE = PlugInDemo/Info.plist; 541 | LD_RUNPATH_SEARCH_PATHS = ( 542 | "$(inherited)", 543 | "@executable_path/Frameworks", 544 | ); 545 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.PlugInDemo; 546 | PRODUCT_NAME = "$(TARGET_NAME)"; 547 | TARGETED_DEVICE_FAMILY = "1,2"; 548 | }; 549 | name = Release; 550 | }; 551 | 47F0D3CC26438E970062DA6C /* Debug */ = { 552 | isa = XCBuildConfiguration; 553 | buildSettings = { 554 | BUNDLE_LOADER = "$(TEST_HOST)"; 555 | CODE_SIGN_STYLE = Automatic; 556 | INFOPLIST_FILE = PlugInDemoTests/Info.plist; 557 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 558 | LD_RUNPATH_SEARCH_PATHS = ( 559 | "$(inherited)", 560 | "@executable_path/Frameworks", 561 | "@loader_path/Frameworks", 562 | ); 563 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.PlugInDemoTests; 564 | PRODUCT_NAME = "$(TARGET_NAME)"; 565 | TARGETED_DEVICE_FAMILY = "1,2"; 566 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PlugInDemo.app/PlugInDemo"; 567 | }; 568 | name = Debug; 569 | }; 570 | 47F0D3CD26438E970062DA6C /* Release */ = { 571 | isa = XCBuildConfiguration; 572 | buildSettings = { 573 | BUNDLE_LOADER = "$(TEST_HOST)"; 574 | CODE_SIGN_STYLE = Automatic; 575 | INFOPLIST_FILE = PlugInDemoTests/Info.plist; 576 | IPHONEOS_DEPLOYMENT_TARGET = 14.5; 577 | LD_RUNPATH_SEARCH_PATHS = ( 578 | "$(inherited)", 579 | "@executable_path/Frameworks", 580 | "@loader_path/Frameworks", 581 | ); 582 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.PlugInDemoTests; 583 | PRODUCT_NAME = "$(TARGET_NAME)"; 584 | TARGETED_DEVICE_FAMILY = "1,2"; 585 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PlugInDemo.app/PlugInDemo"; 586 | }; 587 | name = Release; 588 | }; 589 | 47F0D3CF26438E970062DA6C /* Debug */ = { 590 | isa = XCBuildConfiguration; 591 | buildSettings = { 592 | CODE_SIGN_STYLE = Automatic; 593 | INFOPLIST_FILE = PlugInDemoUITests/Info.plist; 594 | LD_RUNPATH_SEARCH_PATHS = ( 595 | "$(inherited)", 596 | "@executable_path/Frameworks", 597 | "@loader_path/Frameworks", 598 | ); 599 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.PlugInDemoUITests; 600 | PRODUCT_NAME = "$(TARGET_NAME)"; 601 | TARGETED_DEVICE_FAMILY = "1,2"; 602 | TEST_TARGET_NAME = PlugInDemo; 603 | }; 604 | name = Debug; 605 | }; 606 | 47F0D3D026438E970062DA6C /* Release */ = { 607 | isa = XCBuildConfiguration; 608 | buildSettings = { 609 | CODE_SIGN_STYLE = Automatic; 610 | INFOPLIST_FILE = PlugInDemoUITests/Info.plist; 611 | LD_RUNPATH_SEARCH_PATHS = ( 612 | "$(inherited)", 613 | "@executable_path/Frameworks", 614 | "@loader_path/Frameworks", 615 | ); 616 | PRODUCT_BUNDLE_IDENTIFIER = com.gree.PlugInDemoUITests; 617 | PRODUCT_NAME = "$(TARGET_NAME)"; 618 | TARGETED_DEVICE_FAMILY = "1,2"; 619 | TEST_TARGET_NAME = PlugInDemo; 620 | }; 621 | name = Release; 622 | }; 623 | /* End XCBuildConfiguration section */ 624 | 625 | /* Begin XCConfigurationList section */ 626 | 47F0D39426438E950062DA6C /* Build configuration list for PBXProject "PlugInDemo" */ = { 627 | isa = XCConfigurationList; 628 | buildConfigurations = ( 629 | 47F0D3C626438E970062DA6C /* Debug */, 630 | 47F0D3C726438E970062DA6C /* Release */, 631 | ); 632 | defaultConfigurationIsVisible = 0; 633 | defaultConfigurationName = Release; 634 | }; 635 | 47F0D3C826438E970062DA6C /* Build configuration list for PBXNativeTarget "PlugInDemo" */ = { 636 | isa = XCConfigurationList; 637 | buildConfigurations = ( 638 | 47F0D3C926438E970062DA6C /* Debug */, 639 | 47F0D3CA26438E970062DA6C /* Release */, 640 | ); 641 | defaultConfigurationIsVisible = 0; 642 | defaultConfigurationName = Release; 643 | }; 644 | 47F0D3CB26438E970062DA6C /* Build configuration list for PBXNativeTarget "PlugInDemoTests" */ = { 645 | isa = XCConfigurationList; 646 | buildConfigurations = ( 647 | 47F0D3CC26438E970062DA6C /* Debug */, 648 | 47F0D3CD26438E970062DA6C /* Release */, 649 | ); 650 | defaultConfigurationIsVisible = 0; 651 | defaultConfigurationName = Release; 652 | }; 653 | 47F0D3CE26438E970062DA6C /* Build configuration list for PBXNativeTarget "PlugInDemoUITests" */ = { 654 | isa = XCConfigurationList; 655 | buildConfigurations = ( 656 | 47F0D3CF26438E970062DA6C /* Debug */, 657 | 47F0D3D026438E970062DA6C /* Release */, 658 | ); 659 | defaultConfigurationIsVisible = 0; 660 | defaultConfigurationName = Release; 661 | }; 662 | /* End XCConfigurationList section */ 663 | }; 664 | rootObject = 47F0D39126438E950062DA6C /* Project object */; 665 | } 666 | --------------------------------------------------------------------------------