Repository: appwoodpecker/woodpecker-ios Branch: master Commit: ddcafd89d7cf Files: 145 Total size: 374.8 KB Directory structure: gitextract_e3o85i2l/ ├── .gitignore ├── LICENSE ├── Package.swift ├── README.md ├── WoodPeckerDemo/ │ ├── WoodPeckerDemo/ │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Assets.xcassets/ │ │ │ └── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ └── LaunchScreen.storyboard │ │ ├── Info.plist │ │ ├── Modules/ │ │ │ ├── Console/ │ │ │ │ ├── ConsoleViewController.h │ │ │ │ ├── ConsoleViewController.m │ │ │ │ └── ConsoleViewController.xib │ │ │ ├── Controller/ │ │ │ │ ├── ControllerHierarchyViewController.h │ │ │ │ ├── ControllerHierarchyViewController.m │ │ │ │ └── ControllerHierarchyViewController.xib │ │ │ ├── Device/ │ │ │ │ ├── DeviceInfoViewController.h │ │ │ │ ├── DeviceInfoViewController.m │ │ │ │ └── DeviceInfoViewController.xib │ │ │ ├── IO/ │ │ │ │ ├── EchoService.h │ │ │ │ ├── EchoService.m │ │ │ │ ├── IOViewController.h │ │ │ │ ├── IOViewController.m │ │ │ │ └── IOViewController.xib │ │ │ ├── Network/ │ │ │ │ ├── NetworkViewController.h │ │ │ │ ├── NetworkViewController.m │ │ │ │ └── NetworkViewController.xib │ │ │ ├── Notification/ │ │ │ │ ├── NotificationViewController.h │ │ │ │ ├── NotificationViewController.m │ │ │ │ └── NotificationViewController.xib │ │ │ ├── Sandbox/ │ │ │ │ ├── SandBoxViewController.h │ │ │ │ ├── SandBoxViewController.m │ │ │ │ └── SandBoxViewController.xib │ │ │ └── UserDefaults/ │ │ │ ├── UserDefaultsViewController.h │ │ │ ├── UserDefaultsViewController.m │ │ │ └── UserDefaultsViewController.xib │ │ ├── Structure/ │ │ │ ├── IndexViewController.h │ │ │ ├── IndexViewController.m │ │ │ └── IndexViewController.xib │ │ ├── images.xcassets/ │ │ │ ├── Contents.json │ │ │ ├── tool_device.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_io.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_network.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_notification.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_sandbox.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_userdefaults.imageset/ │ │ │ │ └── Contents.json │ │ │ └── tool_webconsole.imageset/ │ │ │ └── Contents.json │ │ └── main.m │ └── WoodPeckerDemo.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ ├── contents.xcworkspacedata │ └── xcshareddata/ │ └── IDEWorkspaceChecks.plist ├── WoodPeckerSwiftDemo/ │ ├── WoodPeckerSwiftDemo/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ └── AppIcon.appiconset/ │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ └── LaunchScreen.storyboard │ │ ├── Info.plist │ │ ├── Modules/ │ │ │ ├── IO/ │ │ │ │ ├── EchoService.swift │ │ │ │ ├── IOViewController.swift │ │ │ │ └── IOViewController.xib │ │ │ ├── Network/ │ │ │ │ ├── NetworkViewController.swift │ │ │ │ └── NetworkViewController.xib │ │ │ └── SandBox/ │ │ │ ├── SandBoxViewController.swift │ │ │ ├── SandboxViewController.temp_caseinsensitive_rename.swift │ │ │ ├── SandboxViewController.temp_caseinsensitive_rename.xib │ │ │ └── SandboxViewController.xib │ │ ├── Structure/ │ │ │ ├── IndexViewController.swift │ │ │ └── IndexViewController.xib │ │ ├── WoodPeckerSwiftDemo-Bridging-Header.h │ │ └── images.xcassets/ │ │ ├── Contents.json │ │ ├── tool_io.imageset/ │ │ │ └── Contents.json │ │ ├── tool_network.imageset/ │ │ │ └── Contents.json │ │ ├── tool_sandbox.imageset/ │ │ │ └── Contents.json │ │ └── tool_webconsole.imageset/ │ │ └── Contents.json │ └── WoodPeckerSwiftDemo.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ ├── contents.xcworkspacedata │ └── xcshareddata/ │ └── IDEWorkspaceChecks.plist ├── WoodPeckeriOS-Carthage.json ├── WoodPeckeriOS.podspec ├── WoodPeckeriOS.xcframework/ │ ├── Info.plist │ ├── ios-arm64/ │ │ └── WoodPeckeriOS.framework/ │ │ ├── ADHConnectViewController.nib │ │ ├── ADHRemoteServiceCell.nib │ │ ├── Headers/ │ │ │ ├── ADHLogger.h │ │ │ ├── ADHOrganizer.h │ │ │ ├── ADHRequest.h │ │ │ ├── ADHService.h │ │ │ └── WoodPeckeriOS.h │ │ ├── Info.plist │ │ ├── Modules/ │ │ │ └── module.modulemap │ │ ├── WoodPeckeriOS │ │ ├── _CodeSignature/ │ │ │ └── CodeResources │ │ └── adhwebdebugger.bundle/ │ │ └── mock.js │ └── ios-arm64_x86_64-simulator/ │ └── WoodPeckeriOS.framework/ │ ├── ADHConnectViewController.nib │ ├── ADHRemoteServiceCell.nib │ ├── Headers/ │ │ ├── ADHLogger.h │ │ ├── ADHOrganizer.h │ │ ├── ADHRequest.h │ │ ├── ADHService.h │ │ └── WoodPeckeriOS.h │ ├── Info.plist │ ├── Modules/ │ │ └── module.modulemap │ ├── WoodPeckeriOS │ ├── _CodeSignature/ │ │ └── CodeResources │ └── adhwebdebugger.bundle/ │ └── mock.js ├── WoodpeckerMacDemo/ │ ├── WoodpeckerMacDemo/ │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets/ │ │ │ ├── AppIcon.appiconset/ │ │ │ │ └── Contents.json │ │ │ ├── Contents.json │ │ │ ├── tool_bundle.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_localization.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_network.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_notification.imageset/ │ │ │ │ └── Contents.json │ │ │ ├── tool_sandbox.imageset/ │ │ │ │ └── Contents.json │ │ │ └── tool_userdefaults.imageset/ │ │ │ └── Contents.json │ │ ├── Base.lproj/ │ │ │ └── MainMenu.xib │ │ ├── Info.plist │ │ ├── Pages/ │ │ │ ├── Bundle/ │ │ │ │ ├── BundleViewController.swift │ │ │ │ └── BundleViewController.xib │ │ │ ├── Localization/ │ │ │ │ ├── LocalizationViewController.swift │ │ │ │ └── LocalizationViewController.xib │ │ │ ├── NetworkViewController.swift │ │ │ ├── NetworkViewController.xib │ │ │ ├── Notification/ │ │ │ │ ├── NotificationViewController.swift │ │ │ │ └── NotificationViewController.xib │ │ │ ├── Sandbox/ │ │ │ │ ├── SandboxViewController.swift │ │ │ │ └── SandboxViewController.xib │ │ │ └── UserDefaults/ │ │ │ ├── UserDefaultsViewController.swift │ │ │ └── UserDefaultsViewController.xib │ │ ├── WoodpeckerMacDemo.entitlements │ │ ├── de.lproj/ │ │ │ └── Localizable.strings │ │ ├── en.lproj/ │ │ │ ├── Localizable.strings │ │ │ └── MainMenu.xib │ │ ├── fr.lproj/ │ │ │ ├── Localizable.strings │ │ │ └── MainMenu.strings │ │ └── zh-Hans.lproj/ │ │ ├── Localizable.strings │ │ └── MainMenu.strings │ └── WoodpeckerMacDemo.xcodeproj/ │ ├── project.pbxproj │ └── project.xcworkspace/ │ ├── contents.xcworkspacedata │ └── xcshareddata/ │ └── IDEWorkspaceChecks.plist ├── WoodpeckerMacOS-Carthage.json ├── WoodpeckerMacOS.framework/ │ └── Versions/ │ └── A/ │ ├── Headers/ │ │ └── WoodpeckerMacOS.h │ ├── Modules/ │ │ └── module.modulemap │ ├── Resources/ │ │ ├── ADHMacConnectViewController.nib │ │ ├── ADHMacRemoteServiceCell.nib │ │ ├── Assets.car │ │ └── Info.plist │ ├── WoodpeckerMacOS │ └── _CodeSignature/ │ └── CodeResources └── WoodpeckerMacOS.podspec ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Xcode # # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore ## Build generated build/ DerivedData/ ## Various settings *.pbxuser !default.pbxuser *.mode1v3 !default.mode1v3 *.mode2v3 !default.mode2v3 *.perspectivev3 !default.perspectivev3 xcuserdata/ ## Other *.moved-aside *.xccheckout *.xcscmblueprint ## Obj-C/Swift specific *.hmap *.ipa *.dSYM.zip *.dSYM # CocoaPods # # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # # Pods/ # Carthage # # Add this line if you want to avoid checking in source code from Carthage dependencies. # Carthage/Checkouts Carthage/Build # fastlane # # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the # screenshots whenever they are needed. # For more information about the recommended setup visit: # https://docs.fastlane.tools/best-practices/source-control/#source-control fastlane/report.xml fastlane/Preview.html fastlane/screenshots fastlane/test_output # Code Injection # # After new code Injection tools there's a generated folder /iOSInjectionProject # https://github.com/johnno1962/injectionforxcode iOSInjectionProject/ ================================================ FILE: LICENSE ================================================ ================================================ FILE: Package.swift ================================================ // swift-tools-version:5.3 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription let package = Package( name: "WoodpeckeriOS", platforms: [.iOS(SupportedPlatform.IOSVersion.v11)], products: [ // Products define the executables and libraries a package produces, and make them visible to other packages. .library( name: "WoodpeckeriOS", targets: ["WoodPeckeriOS"]), ], dependencies: [ // Dependencies declare other packages that this package depends on. // .package(url: /* package url */, from: "1.0.0"), ], targets: [ // Targets are the basic building blocks of a package. A target can define a module or a test suite. // Targets can depend on other targets in this package, and on products in packages this package depends on. .target( name: "WoodpeckeriOS", dependencies: []), .testTarget( name: "WoodpeckeriOSTests", dependencies: ["WoodpeckeriOS"]), .binaryTarget( name: "WoodPeckeriOS", path: "WoodPeckeriOS.xcframework"), ] ) ================================================ FILE: README.md ================================================ ![logo](http://www.woodpeck.cn/assets/img/logo.png) Hi! this is a demo app for **Woodpecker** ([open source](https://github.com/appwoodpecker/woodpecker-client)) **Woodpecker** is a tool for iOS, MacOS developer, it provides some handy and productive tools which Xcode doesn't. It can helps you: - view, modify sandbox files; - view UserDefaults items; - view controller hierarchy; - debug webview online; - monitor network; - more... Free download at [App Store](https://itunes.apple.com/cn/app/woodpecker/id1333548463?l=en&mt=12) and talk with us at [Telegram](https://t.me/appwoodpecker) or [QQ(303015262) ](https://jq.qq.com/?_wv=1027&k=QXuhxDs0) ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/AppDelegate.h ================================================ // // AppDelegate.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface AppDelegate : UIResponder @property (strong, nonatomic) UIWindow *window; @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/AppDelegate.m ================================================ // // AppDelegate.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "AppDelegate.h" #import "IndexViewController.h" @import UserNotifications; @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIWindow * window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; window.backgroundColor = [UIColor whiteColor]; IndexViewController * indexVC = [[IndexViewController alloc] init]; UINavigationController * nvc = [[UINavigationController alloc] initWithRootViewController:indexVC]; self.window = window; self.window.rootViewController = nvc; [self.window makeKeyAndVisible]; [self setupNotification]; return YES; } - (void)setupNotification { if (@available(iOS 10.0, *)) { UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter]; notiCenter.delegate = self; UNNotificationAction *openAction = [UNNotificationAction actionWithIdentifier:UNNotificationDefaultActionIdentifier title:@"Okay" options:0]; UNNotificationAction *customAction = [UNNotificationAction actionWithIdentifier:@"custum action" title:@"Do Something" options:0]; UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"actionCategory" actions:@[openAction,customAction] intentIdentifiers:@[] options:0]; NSSet *set = [NSSet setWithObjects:category, nil]; [notiCenter setNotificationCategories:set]; } } /** The method will be called on the delegate only if the application is in the foreground. If the method is not implemented or the handler is not called in a timely manner then the notification will not be presented. The application can choose to have the notification presented as a sound, badge, alert and/or in the notification list. This decision should be based on whether the information in the notification is otherwise visible to the user. */ - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler API_AVAILABLE(ios(10.0)){ NSLog(@"will present notification"); completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionBadge); } /** The method will be called on the delegate when the user responded to the notification by opening the application, dismissing the notification or choosing a UNNotificationAction. The delegate must be set before the application returns from application:didFinishLaunchingWithOptions:. */ - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler API_AVAILABLE(ios(10.0)){ NSLog(@"did receive notification response"); completionHandler(); } - (void)applicationWillResignActive:(UIApplication *)application { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } - (void)applicationDidEnterBackground:(UIApplication *)application { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - (void)applicationWillEnterForeground:(UIApplication *)application { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } - (void)applicationDidBecomeActive:(UIApplication *)application { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - (void)applicationWillTerminate:(UIApplication *)application { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "20x20", "scale" : "2x" }, { "idiom" : "iphone", "size" : "20x20", "scale" : "3x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "120.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "180.png", "scale" : "3x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "1x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "2x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "76.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "152.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", "filename" : "167.png", "scale" : "2x" }, { "idiom" : "ios-marketing", "size" : "1024x1024", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "pre-rendered" : true } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Base.lproj/LaunchScreen.storyboard ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString $(MARKETING_VERSION) CFBundleVersion 1 LSRequiresIPhoneOS NSAppTransportSecurity NSAllowsArbitraryLoads NSBonjourServices _adhp._tcp NSLocalNetworkUsageDescription Debug my app UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.h ================================================ // // ConsoleViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/6/9. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface ConsoleViewController : UIViewController @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.m ================================================ // // ConsoleViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/6/9. // Copyright © 2018年 lifebetter. All rights reserved. // #import "ConsoleViewController.h" @interface ConsoleViewController () @property (nonatomic, strong) NSTimer *timer; @property (nonatomic, assign) NSInteger count; @property (weak, nonatomic) IBOutlet UIButton *countButton; @end @implementation ConsoleViewController - (void)viewDidLoad { [super viewDidLoad]; self.count = 0; [self updateTimerCountButtonUI]; } - (IBAction)logButtonPressed:(id)sender { [self logCount]; NSLog(@"Woodpecker home page: http://www.woodpeck.cn, \nContact me: woodpeckerapp@163.com"); } - (IBAction)counterLogButtonPressed:(id)sender { if(!self.timer) { self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(logCount) userInfo:nil repeats:YES]; }else { [self.timer invalidate]; self.timer = nil; } [self updateTimerCountButtonUI]; } - (void)updateTimerCountButtonUI { if(self.timer) { [self.countButton setTitle:@"Stop" forState:UIControlStateNormal]; }else { [self.countButton setTitle:@"Start Count" forState:UIControlStateNormal]; } } - (void)logCount { NSLog(@"count: %zd",self.count++); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.h ================================================ // // ControllerHierarchyViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/5/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface ControllerHierarchyViewController : UIViewController @property (nonatomic, assign) NSInteger pageIndex; @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.m ================================================ // // ControllerHierarchyViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/5/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "ControllerHierarchyViewController.h" @interface ControllerHierarchyViewController () @end @implementation ControllerHierarchyViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = [NSString stringWithFormat:@"Page %zd",self.pageIndex]; } - (IBAction)nextButtonPressed:(id)sender { ControllerHierarchyViewController *nextVC = [[ControllerHierarchyViewController alloc] init]; nextVC.pageIndex = self.pageIndex+1; [self.navigationController pushViewController:nextVC animated:YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.h ================================================ // // DeviceInfoViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/3/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface DeviceInfoViewController : UIViewController @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.m ================================================ // // DeviceInfoViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/3/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "DeviceInfoViewController.h" @interface DeviceInfoViewController () @end @implementation DeviceInfoViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)actionButton:(id)sender { NSString * message = @"click me on Mac or iPhone ?"; UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Alert" message:message preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction * cancel = [UIAlertAction actionWithTitle:@"iPhone" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { self.view.backgroundColor = [UIColor grayColor]; }]; UIAlertAction * confirm = [UIAlertAction actionWithTitle:@"Mac" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { float red = arc4random() % 255 / 255.0f; float green = arc4random() % 255 / 255.0f; float blue = arc4random() % 255 / 255.0f; self.view.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; }]; [alert addAction:cancel]; [alert addAction:confirm]; [self presentViewController:alert animated:YES completion:nil]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/EchoService.h ================================================ // // EchoService.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import /** show how to create a custom service http://www.woodpeck.cn/plugin.html */ @interface EchoService : ADHService @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/EchoService.m ================================================ // // EchoService.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "EchoService.h" @implementation EchoService + (void)load { [[ADHOrganizer sharedOrganizer] registerService:[EchoService class]]; } + (NSString *)serviceName { return @"adh.EchoService"; } + (NSDictionary *)actionList { return @{ @"echo" : NSStringFromSelector(@selector(onRequestEcho:)), }; } - (void)onRequestEcho: (ADHRequest *)request { NSDictionary * data = @{ @"response" : @"hi, I`m App, What`s up", }; [request finishWithBody:data]; } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.h ================================================ // // IOViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface IOViewController : UIViewController @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.m ================================================ // // IOViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "IOViewController.h" #import "WoodPeckeriOS/WoodPeckeriOS.h" #import "EchoService.h" @interface IOViewController () @end @implementation IOViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)logButtonPressed:(id)sender { NSString * text = @"A channel between mac and your app, you can transfer data, call service in you app, or log message to mac client, try log something, or you create a custom ADHService"; // log to mac [[ADHLogger sharedLogger] logText:text]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.h ================================================ // // NetworkViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface NetworkViewController : UIViewController @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.m ================================================ // // NetworkViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "NetworkViewController.h" @interface NetworkViewController () @end @implementation NetworkViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)startRequest:(id)sender { //url connection NSURL * requestURL = [NSURL URLWithString:@"https://api.github.com"]; NSURLRequest * request = [NSURLRequest requestWithURL:requestURL]; NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [connection start]; //url session [self sessionRequest]; } - (void)sessionRequest { // NSURLSession NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; config.timeoutIntervalForRequest = 10.0; NSURLSession *mySession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; NSString * url = @"https://api.github.com/emojis"; NSURL * requestURL = [NSURL URLWithString:url]; NSMutableURLRequest * uploadRequest = [NSMutableURLRequest requestWithURL:requestURL]; uploadRequest.HTTPMethod = @"POST"; NSString * formText = [NSString stringWithFormat:@"q=%.f",[[NSDate date] timeIntervalSince1970]]; NSData * data = [formText dataUsingEncoding:NSUTF8StringEncoding]; NSURLSessionTask * task = [mySession uploadTaskWithRequest:uploadRequest fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { }]; [task resume]; } - (nullable NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(nullable NSURLResponse *)response { return request; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { } - (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler { completionHandler(NSURLSessionResponseAllow); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.h ================================================ // // NotificationViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/6/4. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface NotificationViewController : UIViewController @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.m ================================================ // // NotificationViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/6/4. // Copyright © 2018年 lifebetter. All rights reserved. // #import "NotificationViewController.h" @import UserNotifications; @interface NotificationViewController () @end @implementation NotificationViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)fireButtonPressed:(id)sender { if (@available(iOS 10.0, *)) { UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter]; [notiCenter requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) { if(granted){ UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter]; NSString * identifier = [NSString stringWithFormat:@"%d",arc4random()]; NSString * requestIdentifier = [NSString stringWithFormat:@"request identifier%@",identifier]; UNMutableNotificationContent * content = [[UNMutableNotificationContent alloc] init]; content.badge = [NSNumber numberWithInteger:arc4random()%10]; content.body = [NSString stringWithFormat:@"Thanks for using woodpecker %@",identifier]; content.title = [NSString stringWithFormat:@"This is title %@",identifier]; content.subtitle = [NSString stringWithFormat:@"This is subtitle %@",identifier]; content.userInfo = @{ @"identifier" : identifier, }; content.categoryIdentifier = @"actionCategory"; UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO]; UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:requestIdentifier content:content trigger:trigger]; [notiCenter addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { if(error){ NSLog(@"add local notification error: %@",error); }else{ NSLog(@"add local notification success"); } }]; }else{ NSLog(@"not granted. error: %@",error); } }]; } else { NSString *message = @"Sorry, this tool only support iOS 10+"; UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Alert" message:message preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction * confirm = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil]; [alert addAction:confirm]; [self presentViewController:alert animated:YES completion:nil]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.h ================================================ // // SandBoxViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface SandBoxViewController : UIViewController @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.m ================================================ // // SandBoxViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "SandBoxViewController.h" @interface SandBoxViewController () @end @implementation SandBoxViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)addFileButtonPressed:(id)sender { NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSDate * date = [NSDate date]; NSString * text = [formatter stringFromDate:date]; //file name [formatter setDateFormat:@"HH-mm-ss"]; NSString * fileName = [NSString stringWithFormat:@"%@.txt",[formatter stringFromDate:date]]; NSString * documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSString * filePath = [documentPath stringByAppendingPathComponent:fileName]; NSURL * fileURL = [NSURL fileURLWithPath:filePath]; NSError * error = nil; [text writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:&error]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.h ================================================ // // UserDefaultsViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/3/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface UserDefaultsViewController : UIViewController @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.m ================================================ // // UserDefaultsViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/3/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "UserDefaultsViewController.h" @interface UserDefaultsViewController () @end @implementation UserDefaultsViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction)addButtonPressed:(id)sender { NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults]; NSString * key = [NSString stringWithFormat:@"key%d",arc4random()]; NSString * value = [NSString stringWithFormat:@"value%d",arc4random()]; [userDefaults setObject:value forKey:key]; [userDefaults synchronize]; } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.h ================================================ // // IndexViewController.h // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import @interface IndexViewController : UIViewController @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.m ================================================ // // IndexViewController.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import "IndexViewController.h" #import "SandBoxViewController.h" #import "NetworkViewController.h" #import "IOViewController.h" #import "UserDefaultsViewController.h" #import "DeviceInfoViewController.h" #import "ControllerHierarchyViewController.h" #import "NotificationViewController.h" #import "ConsoleViewController.h" static NSString * const kIndexCellIdentifier = @"kIndexCellIdentifier"; @interface IndexViewController () @property (nonatomic, strong) NSArray * actionList; @property (weak, nonatomic) IBOutlet UITableView *tableView; @end @implementation IndexViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"Woodpecker Demo"; self.tableView.rowHeight = 60.0f; [self loadData]; } - (void)loadData { self.actionList = @[ @{ @"title" : @"Sandbox", @"action" : NSStringFromSelector(@selector(sandBox)), }, @{ @"title" : @"Network", @"action" : NSStringFromSelector(@selector(network)), }, @{ @"title" : @"I/O", @"action" : NSStringFromSelector(@selector(doIO)), }, @{ @"title" : @"Console", @"action" : NSStringFromSelector(@selector(console)), }, @{ @"title" : @"UserDefaults", @"action" : NSStringFromSelector(@selector(userDefaults)), }, @{ @"title" : @"Device", @"action" : NSStringFromSelector(@selector(device)), }, @{ @"title" : @"Controller Hierarchy", @"action" : NSStringFromSelector(@selector(controller)), }, @{ @"title" : @"Notification", @"action" : NSStringFromSelector(@selector(notification)), }, ]; } - (void)sandBox { SandBoxViewController * vc = [[SandBoxViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; } - (void)network { NetworkViewController * vc = [[NetworkViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; } - (void)doIO { IOViewController * vc = [[IOViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; } - (void)console { ConsoleViewController *vc = [[ConsoleViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; } - (void)userDefaults { UserDefaultsViewController * vc = [[UserDefaultsViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; } - (void)device { DeviceInfoViewController * vc = [[DeviceInfoViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; } - (void)controller { ControllerHierarchyViewController *nextVC = [[ControllerHierarchyViewController alloc] init]; nextVC.pageIndex = 0; [self.navigationController pushViewController:nextVC animated:YES]; } - (void)notification { NotificationViewController *notificationVC = [[NotificationViewController alloc] init]; [self.navigationController pushViewController:notificationVC animated:YES]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.actionList.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:kIndexCellIdentifier]; if(!cell){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kIndexCellIdentifier]; } NSDictionary * data = self.actionList[indexPath.row]; NSString * title = data[@"title"]; cell.textLabel.text = title; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSDictionary * data = self.actionList[indexPath.row]; SEL selector = NSSelectorFromString(data[@"action"]); #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" [self performSelector:selector]; #pragma clang diagnostic pop [tableView deselectRowAtIndexPath:indexPath animated:NO]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.xib ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_device.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_device.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_io.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_io.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_network.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_network.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_notification.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_notification.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_sandbox.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_sandbox.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_userdefaults.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_userdefaults.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_webconsole.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_webconsole.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo/main.m ================================================ // // main.m // WoodPeckerDemo // // Created by xiaogang zhang on 2018/1/17. // Copyright © 2018年 lifebetter. All rights reserved. // #import #import "AppDelegate.h" int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 52; objects = { /* Begin PBXBuildFile section */ 1F3A946420C570C7008AE09A /* NotificationViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F3A946220C570C7008AE09A /* NotificationViewController.m */; }; 1F3A946520C570C7008AE09A /* NotificationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F3A946320C570C7008AE09A /* NotificationViewController.xib */; }; 1F46EBE120CBEA980037445F /* ConsoleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F46EBDF20CBEA980037445F /* ConsoleViewController.m */; }; 1F46EBE220CBEA980037445F /* ConsoleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F46EBE020CBEA980037445F /* ConsoleViewController.xib */; }; 1F66F00426D25BDB00ADBBBE /* WoodPeckeriOS.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F66F00226D25BD600ADBBBE /* WoodPeckeriOS.xcframework */; }; 1F66F00526D25BDB00ADBBBE /* WoodPeckeriOS.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1F66F00226D25BD600ADBBBE /* WoodPeckeriOS.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1F9DC462200F83C700DFC64E /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC461200F83C700DFC64E /* AppDelegate.m */; }; 1F9DC46A200F83C700DFC64E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC469200F83C700DFC64E /* Assets.xcassets */; }; 1F9DC46D200F83C700DFC64E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC46B200F83C700DFC64E /* LaunchScreen.storyboard */; }; 1F9DC470200F83C700DFC64E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC46F200F83C700DFC64E /* main.m */; }; 1F9DC47B200F846100DFC64E /* IndexViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC479200F846100DFC64E /* IndexViewController.m */; }; 1F9DC47C200F846100DFC64E /* IndexViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC47A200F846100DFC64E /* IndexViewController.xib */; }; 1F9DC484200F8BBE00DFC64E /* SandBoxViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC482200F8BBE00DFC64E /* SandBoxViewController.m */; }; 1F9DC485200F8BBE00DFC64E /* SandBoxViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC483200F8BBE00DFC64E /* SandBoxViewController.xib */; }; 1F9DC487200F914100DFC64E /* images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC486200F914100DFC64E /* images.xcassets */; }; 1F9DC495200F94FB00DFC64E /* NetworkViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC493200F94FB00DFC64E /* NetworkViewController.m */; }; 1F9DC496200F94FB00DFC64E /* NetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC494200F94FB00DFC64E /* NetworkViewController.xib */; }; 1F9DC49A200F99C300DFC64E /* IOViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC498200F99C300DFC64E /* IOViewController.m */; }; 1F9DC49B200F99C300DFC64E /* IOViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F9DC499200F99C300DFC64E /* IOViewController.xib */; }; 1F9DC49E200F9AF400DFC64E /* EchoService.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F9DC49D200F9AF400DFC64E /* EchoService.m */; }; 1FB43ABF20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FB43ABD20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m */; }; 1FB43AC020ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FB43ABE20ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib */; }; 1FE5C58F205CC1CF000EC631 /* UserDefaultsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FE5C58D205CC1CF000EC631 /* UserDefaultsViewController.m */; }; 1FE5C590205CC1CF000EC631 /* UserDefaultsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FE5C58E205CC1CF000EC631 /* UserDefaultsViewController.xib */; }; 1FE5C595205CC35D000EC631 /* DeviceInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FE5C593205CC35D000EC631 /* DeviceInfoViewController.m */; }; 1FE5C596205CC35D000EC631 /* DeviceInfoViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1FE5C594205CC35D000EC631 /* DeviceInfoViewController.xib */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 1F06B75C21736E02000CAD80 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 1F66F00526D25BDB00ADBBBE /* WoodPeckeriOS.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 1F3A946120C570C7008AE09A /* NotificationViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NotificationViewController.h; sourceTree = ""; }; 1F3A946220C570C7008AE09A /* NotificationViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NotificationViewController.m; sourceTree = ""; }; 1F3A946320C570C7008AE09A /* NotificationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NotificationViewController.xib; sourceTree = ""; }; 1F46EBDE20CBEA980037445F /* ConsoleViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ConsoleViewController.h; sourceTree = ""; }; 1F46EBDF20CBEA980037445F /* ConsoleViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ConsoleViewController.m; sourceTree = ""; }; 1F46EBE020CBEA980037445F /* ConsoleViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ConsoleViewController.xib; sourceTree = ""; }; 1F66F00226D25BD600ADBBBE /* WoodPeckeriOS.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WoodPeckeriOS.xcframework; path = ../WoodPeckeriOS.xcframework; sourceTree = ""; }; 1F9DC45D200F83C700DFC64E /* WoodPeckerDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WoodPeckerDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1F9DC460200F83C700DFC64E /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 1F9DC461200F83C700DFC64E /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 1F9DC469200F83C700DFC64E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1F9DC46C200F83C700DFC64E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 1F9DC46E200F83C700DFC64E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1F9DC46F200F83C700DFC64E /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 1F9DC478200F846100DFC64E /* IndexViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IndexViewController.h; sourceTree = ""; }; 1F9DC479200F846100DFC64E /* IndexViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IndexViewController.m; sourceTree = ""; }; 1F9DC47A200F846100DFC64E /* IndexViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IndexViewController.xib; sourceTree = ""; }; 1F9DC481200F8BBE00DFC64E /* SandBoxViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SandBoxViewController.h; sourceTree = ""; }; 1F9DC482200F8BBE00DFC64E /* SandBoxViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SandBoxViewController.m; sourceTree = ""; }; 1F9DC483200F8BBE00DFC64E /* SandBoxViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SandBoxViewController.xib; sourceTree = ""; }; 1F9DC486200F914100DFC64E /* images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = images.xcassets; sourceTree = ""; }; 1F9DC492200F94FB00DFC64E /* NetworkViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NetworkViewController.h; sourceTree = ""; }; 1F9DC493200F94FB00DFC64E /* NetworkViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = NetworkViewController.m; sourceTree = ""; }; 1F9DC494200F94FB00DFC64E /* NetworkViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NetworkViewController.xib; sourceTree = ""; }; 1F9DC497200F99C300DFC64E /* IOViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IOViewController.h; sourceTree = ""; }; 1F9DC498200F99C300DFC64E /* IOViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IOViewController.m; sourceTree = ""; }; 1F9DC499200F99C300DFC64E /* IOViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IOViewController.xib; sourceTree = ""; }; 1F9DC49C200F9AF400DFC64E /* EchoService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EchoService.h; sourceTree = ""; }; 1F9DC49D200F9AF400DFC64E /* EchoService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EchoService.m; sourceTree = ""; }; 1FB43ABC20ADCA9E00BD5B85 /* ControllerHierarchyViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ControllerHierarchyViewController.h; sourceTree = ""; }; 1FB43ABD20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ControllerHierarchyViewController.m; sourceTree = ""; }; 1FB43ABE20ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ControllerHierarchyViewController.xib; sourceTree = ""; }; 1FE5C58C205CC1CF000EC631 /* UserDefaultsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UserDefaultsViewController.h; sourceTree = ""; }; 1FE5C58D205CC1CF000EC631 /* UserDefaultsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UserDefaultsViewController.m; sourceTree = ""; }; 1FE5C58E205CC1CF000EC631 /* UserDefaultsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UserDefaultsViewController.xib; sourceTree = ""; }; 1FE5C592205CC35D000EC631 /* DeviceInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeviceInfoViewController.h; sourceTree = ""; }; 1FE5C593205CC35D000EC631 /* DeviceInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DeviceInfoViewController.m; sourceTree = ""; }; 1FE5C594205CC35D000EC631 /* DeviceInfoViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DeviceInfoViewController.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1F9DC45A200F83C700DFC64E /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 1F66F00426D25BDB00ADBBBE /* WoodPeckeriOS.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1F3A946020C5709E008AE09A /* Notification */ = { isa = PBXGroup; children = ( 1F3A946120C570C7008AE09A /* NotificationViewController.h */, 1F3A946220C570C7008AE09A /* NotificationViewController.m */, 1F3A946320C570C7008AE09A /* NotificationViewController.xib */, ); path = Notification; sourceTree = ""; }; 1F46EBDD20CBEA880037445F /* Console */ = { isa = PBXGroup; children = ( 1F46EBDE20CBEA980037445F /* ConsoleViewController.h */, 1F46EBDF20CBEA980037445F /* ConsoleViewController.m */, 1F46EBE020CBEA980037445F /* ConsoleViewController.xib */, ); path = Console; sourceTree = ""; }; 1F9DC454200F83C700DFC64E = { isa = PBXGroup; children = ( 1F66F00226D25BD600ADBBBE /* WoodPeckeriOS.xcframework */, 1F9DC45F200F83C700DFC64E /* WoodPeckerDemo */, 1F9DC45E200F83C700DFC64E /* Products */, ); sourceTree = ""; }; 1F9DC45E200F83C700DFC64E /* Products */ = { isa = PBXGroup; children = ( 1F9DC45D200F83C700DFC64E /* WoodPeckerDemo.app */, ); name = Products; sourceTree = ""; }; 1F9DC45F200F83C700DFC64E /* WoodPeckerDemo */ = { isa = PBXGroup; children = ( 1F9DC476200F842A00DFC64E /* Modules */, 1F9DC477200F843400DFC64E /* Structure */, 1F9DC460200F83C700DFC64E /* AppDelegate.h */, 1F9DC461200F83C700DFC64E /* AppDelegate.m */, 1F9DC469200F83C700DFC64E /* Assets.xcassets */, 1F9DC486200F914100DFC64E /* images.xcassets */, 1F9DC46B200F83C700DFC64E /* LaunchScreen.storyboard */, 1F9DC46E200F83C700DFC64E /* Info.plist */, 1F9DC46F200F83C700DFC64E /* main.m */, ); path = WoodPeckerDemo; sourceTree = ""; }; 1F9DC476200F842A00DFC64E /* Modules */ = { isa = PBXGroup; children = ( 1F46EBDD20CBEA880037445F /* Console */, 1F3A946020C5709E008AE09A /* Notification */, 1FB43ABB20ADCA7600BD5B85 /* Controller */, 1FE5C591205CC350000EC631 /* Device */, 1FE5C58B205CC1B9000EC631 /* UserDefaults */, 1F9DC47D200F872700DFC64E /* Sandbox */, 1F9DC47E200F872C00DFC64E /* Network */, 1F9DC47F200F873100DFC64E /* IO */, ); path = Modules; sourceTree = ""; }; 1F9DC477200F843400DFC64E /* Structure */ = { isa = PBXGroup; children = ( 1F9DC478200F846100DFC64E /* IndexViewController.h */, 1F9DC479200F846100DFC64E /* IndexViewController.m */, 1F9DC47A200F846100DFC64E /* IndexViewController.xib */, ); path = Structure; sourceTree = ""; }; 1F9DC47D200F872700DFC64E /* Sandbox */ = { isa = PBXGroup; children = ( 1F9DC481200F8BBE00DFC64E /* SandBoxViewController.h */, 1F9DC482200F8BBE00DFC64E /* SandBoxViewController.m */, 1F9DC483200F8BBE00DFC64E /* SandBoxViewController.xib */, ); path = Sandbox; sourceTree = ""; }; 1F9DC47E200F872C00DFC64E /* Network */ = { isa = PBXGroup; children = ( 1F9DC492200F94FB00DFC64E /* NetworkViewController.h */, 1F9DC493200F94FB00DFC64E /* NetworkViewController.m */, 1F9DC494200F94FB00DFC64E /* NetworkViewController.xib */, ); path = Network; sourceTree = ""; }; 1F9DC47F200F873100DFC64E /* IO */ = { isa = PBXGroup; children = ( 1F9DC497200F99C300DFC64E /* IOViewController.h */, 1F9DC498200F99C300DFC64E /* IOViewController.m */, 1F9DC499200F99C300DFC64E /* IOViewController.xib */, 1F9DC49C200F9AF400DFC64E /* EchoService.h */, 1F9DC49D200F9AF400DFC64E /* EchoService.m */, ); path = IO; sourceTree = ""; }; 1FB43ABB20ADCA7600BD5B85 /* Controller */ = { isa = PBXGroup; children = ( 1FB43ABC20ADCA9E00BD5B85 /* ControllerHierarchyViewController.h */, 1FB43ABD20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m */, 1FB43ABE20ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib */, ); path = Controller; sourceTree = ""; }; 1FE5C58B205CC1B9000EC631 /* UserDefaults */ = { isa = PBXGroup; children = ( 1FE5C58C205CC1CF000EC631 /* UserDefaultsViewController.h */, 1FE5C58D205CC1CF000EC631 /* UserDefaultsViewController.m */, 1FE5C58E205CC1CF000EC631 /* UserDefaultsViewController.xib */, ); path = UserDefaults; sourceTree = ""; }; 1FE5C591205CC350000EC631 /* Device */ = { isa = PBXGroup; children = ( 1FE5C592205CC35D000EC631 /* DeviceInfoViewController.h */, 1FE5C593205CC35D000EC631 /* DeviceInfoViewController.m */, 1FE5C594205CC35D000EC631 /* DeviceInfoViewController.xib */, ); path = Device; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1F9DC45C200F83C700DFC64E /* WoodPeckerDemo */ = { isa = PBXNativeTarget; buildConfigurationList = 1F9DC473200F83C700DFC64E /* Build configuration list for PBXNativeTarget "WoodPeckerDemo" */; buildPhases = ( 1F9DC459200F83C700DFC64E /* Sources */, 1F9DC45A200F83C700DFC64E /* Frameworks */, 1F9DC45B200F83C700DFC64E /* Resources */, 1F06B75C21736E02000CAD80 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( ); name = WoodPeckerDemo; productName = WoodPeckerDemo; productReference = 1F9DC45D200F83C700DFC64E /* WoodPeckerDemo.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 1F9DC455200F83C700DFC64E /* Project object */ = { isa = PBXProject; attributes = { LastUpgradeCheck = 0920; ORGANIZATIONNAME = lifebetter; TargetAttributes = { 1F9DC45C200F83C700DFC64E = { CreatedOnToolsVersion = 9.2; ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = 1F9DC458200F83C700DFC64E /* Build configuration list for PBXProject "WoodPeckerDemo" */; compatibilityVersion = "Xcode 8.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 1F9DC454200F83C700DFC64E; productRefGroup = 1F9DC45E200F83C700DFC64E /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 1F9DC45C200F83C700DFC64E /* WoodPeckerDemo */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1F9DC45B200F83C700DFC64E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 1F46EBE220CBEA980037445F /* ConsoleViewController.xib in Resources */, 1FB43AC020ADCA9E00BD5B85 /* ControllerHierarchyViewController.xib in Resources */, 1F9DC485200F8BBE00DFC64E /* SandBoxViewController.xib in Resources */, 1F9DC47C200F846100DFC64E /* IndexViewController.xib in Resources */, 1F9DC46D200F83C700DFC64E /* LaunchScreen.storyboard in Resources */, 1F9DC46A200F83C700DFC64E /* Assets.xcassets in Resources */, 1F9DC487200F914100DFC64E /* images.xcassets in Resources */, 1F9DC49B200F99C300DFC64E /* IOViewController.xib in Resources */, 1FE5C590205CC1CF000EC631 /* UserDefaultsViewController.xib in Resources */, 1FE5C596205CC35D000EC631 /* DeviceInfoViewController.xib in Resources */, 1F9DC496200F94FB00DFC64E /* NetworkViewController.xib in Resources */, 1F3A946520C570C7008AE09A /* NotificationViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1F9DC459200F83C700DFC64E /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1F9DC49E200F9AF400DFC64E /* EchoService.m in Sources */, 1F9DC484200F8BBE00DFC64E /* SandBoxViewController.m in Sources */, 1F9DC470200F83C700DFC64E /* main.m in Sources */, 1FE5C595205CC35D000EC631 /* DeviceInfoViewController.m in Sources */, 1FE5C58F205CC1CF000EC631 /* UserDefaultsViewController.m in Sources */, 1F3A946420C570C7008AE09A /* NotificationViewController.m in Sources */, 1F9DC49A200F99C300DFC64E /* IOViewController.m in Sources */, 1F46EBE120CBEA980037445F /* ConsoleViewController.m in Sources */, 1FB43ABF20ADCA9E00BD5B85 /* ControllerHierarchyViewController.m in Sources */, 1F9DC462200F83C700DFC64E /* AppDelegate.m in Sources */, 1F9DC47B200F846100DFC64E /* IndexViewController.m in Sources */, 1F9DC495200F94FB00DFC64E /* NetworkViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 1F9DC46B200F83C700DFC64E /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( 1F9DC46C200F83C700DFC64E /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 1F9DC471200F83C700DFC64E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", "DEBUG=1", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.2; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; }; 1F9DC472200F83C700DFC64E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.2; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; name = Release; }; 1F9DC474200F83C700DFC64E /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 8HG49Q463F; EXCLUDED_ARCHS = ""; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", ); GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; INFOPLIST_FILE = WoodPeckerDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.2.5; PRODUCT_BUNDLE_IDENTIFIER = lifebetter.WoodPeckerDemo; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 1F9DC475200F83C700DFC64E /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 8HG49Q463F; "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)", ); INFOPLIST_FILE = WoodPeckerDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); MARKETING_VERSION = 1.2.5; PRODUCT_BUNDLE_IDENTIFIER = lifebetter.WoodPeckerDemo; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1F9DC458200F83C700DFC64E /* Build configuration list for PBXProject "WoodPeckerDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 1F9DC471200F83C700DFC64E /* Debug */, 1F9DC472200F83C700DFC64E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1F9DC473200F83C700DFC64E /* Build configuration list for PBXNativeTarget "WoodPeckerDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 1F9DC474200F83C700DFC64E /* Debug */, 1F9DC475200F83C700DFC64E /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 1F9DC455200F83C700DFC64E /* Project object */; } ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/AppDelegate.swift ================================================ // // AppDelegate.swift // WoodPeckerSwiftDemo // // Created by xiaogang zhang on 2018/1/20. // Copyright © 2018年 lifebetter. All rights reserved. // import UIKit import WoodPeckeriOS @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) window!.backgroundColor = UIColor.white let vc = IndexViewController() let nvc = UINavigationController(rootViewController: vc) window!.rootViewController = nvc; window!.makeKeyAndVisible() return true } func caculate(A:Double,B:Double) -> Double { return A + B; } func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. } func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. } func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "iphone", "size" : "20x20", "scale" : "2x" }, { "idiom" : "iphone", "size" : "20x20", "scale" : "3x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "2x" }, { "idiom" : "iphone", "size" : "29x29", "scale" : "3x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "2x" }, { "idiom" : "iphone", "size" : "40x40", "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "120.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", "filename" : "180.png", "scale" : "3x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "1x" }, { "idiom" : "ipad", "size" : "20x20", "scale" : "2x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "1x" }, { "idiom" : "ipad", "size" : "29x29", "scale" : "2x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "1x" }, { "idiom" : "ipad", "size" : "40x40", "scale" : "2x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "76.png", "scale" : "1x" }, { "size" : "76x76", "idiom" : "ipad", "filename" : "152.png", "scale" : "2x" }, { "size" : "83.5x83.5", "idiom" : "ipad", "filename" : "167.png", "scale" : "2x" }, { "idiom" : "ios-marketing", "size" : "1024x1024", "scale" : "1x" } ], "info" : { "version" : 1, "author" : "xcode" }, "properties" : { "pre-rendered" : true } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Base.lproj/LaunchScreen.storyboard ================================================ ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.2.1 CFBundleVersion 1 LSRequiresIPhoneOS NSAppTransportSecurity NSAllowsArbitraryLoads UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities armv7 UISupportedInterfaceOrientations UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortraitUpsideDown UISupportedInterfaceOrientations~ipad UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight NSLocalNetworkUsageDescription your description here NSBonjourServices _adhp._tcp ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/EchoService.swift ================================================ // // EchoService.swift // WoodPeckerSwiftDemo // // Created by xiaogang zhang on 2018/1/21. // Copyright © 2018年 lifebetter. All rights reserved. // import UIKit class EchoService: ADHService { override class func serviceName() -> String { return "adh.EchoService"; } override class func actionList() -> ([String:String]) { return ["echo": NSStringFromSelector(#selector(EchoService.onRequestEcho(request:)))] } @objc func onRequestEcho(request: ADHRequest) { let data = ["response" : "Hi, I`m App, what`s up ?"] request.finish(withBody: data) } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/IOViewController.swift ================================================ // // IOViewController.swift // WoodPeckerSwiftDemo // // Created by xiaogang zhang on 2018/1/21. // Copyright © 2018年 lifebetter. All rights reserved. // import UIKit class IOViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //register custom service ADHOrganizer.shared().registerService(EchoService.classForCoder()) } @IBAction func logButtonPressed(_ sender: Any) { let text = "A channel between mac and your app, you can transfer data, call service in you app, or log message to mac client, try log something, or you create a custom ADHService" // log to mac ADHLogger.shared().logText(text) } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/IOViewController.xib ================================================ ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/Network/NetworkViewController.swift ================================================ // // NetworkViewController.swift // WoodPeckerSwiftDemo // // Created by xiaogang zhang on 2018/1/21. // Copyright © 2018年 lifebetter. All rights reserved. // import UIKit class NetworkViewController: UIViewController,NSURLConnectionDataDelegate,URLSessionDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } @IBAction func startRequest(_ sender: Any) { //url connection let requestURL = URL.init(string: "https://api.github.com") let request = URLRequest.init(url: requestURL!) let connection = NSURLConnection.init(request: request, delegate: self) connection?.start() //session request self.sessionRequest() } func sessionRequest(){ let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = 10.0 let mySession = URLSession.init(configuration: config, delegate: self, delegateQueue: OperationQueue.main) let url = "https://api.github.com/emojis" let requestURL = URL.init(string: url) let uploadRequest = NSMutableURLRequest.init(url: requestURL!) uploadRequest.httpMethod = "POST" let formText = "q=\(arc4random())" let data = formText.data(using: String.Encoding.utf8) let task = mySession.uploadTask(with: uploadRequest as URLRequest, from: data) { (data:Data?, response:URLResponse?, error:Error?) in } task.resume() } func connection(_ connection: NSURLConnection, willSend request: URLRequest, redirectResponse response: URLResponse?) -> URLRequest? { return request } func connection(_ connection: NSURLConnection, didReceive response: URLResponse) { } func connection(_ connection: NSURLConnection, didSendBodyData bytesWritten: Int, totalBytesWritten: Int, totalBytesExpectedToWrite: Int) { } func connection(_ connection: NSURLConnection, didReceive data: Data) { } func connectionDidFinishLoading(_ connection: NSURLConnection) { } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/Network/NetworkViewController.xib ================================================ ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandBoxViewController.swift ================================================ // // SandBoxViewController.swift // WoodPeckerSwiftDemo // // Created by xiaogang zhang on 2018/1/20. // Copyright © 2018年 lifebetter. All rights reserved. // import UIKit class SandboxViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func addFileButtonPressed(_ sender: Any) { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" let date = Date() let text = formatter.string(from: date) //file name formatter.dateFormat = "HH-mm-ss" let fileName = "\(formatter.string(from: date)).txt" let documentPath = (NSHomeDirectory() as NSString).appendingPathComponent("Documents") let filePath = (documentPath as NSString).appendingPathComponent(fileName) let fileURL = NSURL.fileURL(withPath: filePath) do { try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8) } catch { } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.temp_caseinsensitive_rename.swift ================================================ // // SandBoxViewController.swift // WoodPeckerSwiftDemo // // Created by xiaogang zhang on 2018/1/20. // Copyright © 2018年 lifebetter. All rights reserved. // import UIKit class SandboxViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func addFileButtonPressed(_ sender: Any) { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" let date = Date() let text = formatter.string(from: date) //file name formatter.dateFormat = "HH-mm-ss" let fileName = "\(formatter.string(from: date)).txt" let documentPath = (NSHomeDirectory() as NSString).appendingPathComponent("Documents") let filePath = (documentPath as NSString).appendingPathComponent(fileName) let fileURL = NSURL.fileURL(withPath: filePath) do { try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8) } catch { } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.temp_caseinsensitive_rename.xib ================================================ ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.xib ================================================ ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Structure/IndexViewController.swift ================================================ // // IndexViewController.swift // WoodPeckerSwiftDemo // // Created by xiaogang zhang on 2018/1/20. // Copyright © 2018年 lifebetter. All rights reserved. // import UIKit class IndexViewController: UIViewController,UITableViewDelegate, UITableViewDataSource { @IBOutlet weak var tableView: UITableView! var actionList: [[String:Any]]? init() { super.init(nibName: nil, bundle: nil) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } override func viewDidLoad() { super.viewDidLoad() self.navigationItem.title = "Woodpecker Demo"; self.tableView.rowHeight = 60.0; self.loadData() } func loadData() { self.actionList = [ [ "title" : "Sandbox", "action" : #selector(IndexViewController.sandbox) ], [ "title" : "Network", "action" : #selector(IndexViewController.network) ], [ "title" : "I/O", "action" : #selector(IndexViewController.doIO) ], [ "title" : "More tools", "action" : #selector(IndexViewController.more) ] ] } @objc func sandbox(){ let vc = SandboxViewController() self.navigationController!.pushViewController(vc, animated: true) } @objc func network(){ let vc = NetworkViewController() self.navigationController!.pushViewController(vc, animated:true) } @objc func doIO(){ let vc = IOViewController() self.navigationController!.pushViewController(vc, animated:true) } @objc func more(){ let message = "You can learn more in the Objective-C demo"; let alert = UIAlertController.init(title: "Alert", message: message, preferredStyle: UIAlertControllerStyle.alert); let confirm = UIAlertAction.init(title: "Ok", style: UIAlertActionStyle.default) { (action) in } alert.addAction(confirm); self.present(alert, animated: true, completion: nil); } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let count = self.actionList!.count return count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let kIndexCellIdentifier = "kIndexCellIdentifier" let cell = tableView.dequeueReusableCell(withIdentifier: kIndexCellIdentifier) ?? UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: kIndexCellIdentifier) var data = self.actionList![indexPath.row] let title = data["title"]; cell.textLabel?.text = (title as! String) return cell; } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { var data = self.actionList![indexPath.row]; let action = data["action"] self.perform(action as? Selector) tableView.deselectRow(at: indexPath, animated: false) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Structure/IndexViewController.xib ================================================ ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo-Bridging-Header.h ================================================ // // objcBridge.h // WoodPeckerSwiftDemo // // Created by xiaogang zhang on 2018/1/21. // Copyright © 2018年 lifebetter. All rights reserved. // #import ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_io.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_io.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_network.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_network.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_sandbox.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_sandbox.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_webconsole.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_webconsole.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 52; objects = { /* Begin PBXBuildFile section */ 1F66F00826D25CA200ADBBBE /* WoodPeckeriOS.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F66F00626D25C7100ADBBBE /* WoodPeckeriOS.xcframework */; }; 1F66F00926D25CA200ADBBBE /* WoodPeckeriOS.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1F66F00626D25C7100ADBBBE /* WoodPeckeriOS.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1F84227920133FD4003BFF5A /* IndexViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F84227820133FD4003BFF5A /* IndexViewController.swift */; }; 1F842296201340FE003BFF5A /* IOViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F842285201340FE003BFF5A /* IOViewController.xib */; }; 1F84229A201340FE003BFF5A /* SandboxViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F84228C201340FE003BFF5A /* SandboxViewController.xib */; }; 1F84229C201340FE003BFF5A /* NetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F842291201340FE003BFF5A /* NetworkViewController.xib */; }; 1F84229E20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F84229D20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift */; }; 1F8422A02013468D003BFF5A /* IndexViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F84229F2013468D003BFF5A /* IndexViewController.xib */; }; 1F8422A2201353E1003BFF5A /* images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F8422A1201353E1003BFF5A /* images.xcassets */; }; 1F8422A420143E28003BFF5A /* NetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8422A320143E28003BFF5A /* NetworkViewController.swift */; }; 1F8422A620144831003BFF5A /* IOViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8422A520144831003BFF5A /* IOViewController.swift */; }; 1F8422B020145079003BFF5A /* EchoService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F8422AF20145079003BFF5A /* EchoService.swift */; }; 1F90227520131F84007335EA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F90227420131F84007335EA /* AppDelegate.swift */; }; 1F90227C20131F84007335EA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F90227B20131F84007335EA /* Assets.xcassets */; }; 1F90227F20131F84007335EA /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F90227D20131F84007335EA /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 1F90228A2013243B007335EA /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( 1F66F00926D25CA200ADBBBE /* WoodPeckeriOS.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 1F66F00626D25C7100ADBBBE /* WoodPeckeriOS.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = WoodPeckeriOS.xcframework; path = ../WoodPeckeriOS.xcframework; sourceTree = ""; }; 1F84227820133FD4003BFF5A /* IndexViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IndexViewController.swift; sourceTree = ""; }; 1F842285201340FE003BFF5A /* IOViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IOViewController.xib; sourceTree = ""; }; 1F84228C201340FE003BFF5A /* SandboxViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = SandboxViewController.xib; sourceTree = ""; }; 1F842291201340FE003BFF5A /* NetworkViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = NetworkViewController.xib; sourceTree = ""; }; 1F84229D20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SandboxViewController.temp_caseinsensitive_rename.swift; sourceTree = ""; }; 1F84229F2013468D003BFF5A /* IndexViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IndexViewController.xib; sourceTree = ""; }; 1F8422A1201353E1003BFF5A /* images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = images.xcassets; sourceTree = ""; }; 1F8422A320143E28003BFF5A /* NetworkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkViewController.swift; sourceTree = ""; }; 1F8422A520144831003BFF5A /* IOViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOViewController.swift; sourceTree = ""; }; 1F8422A820144B9C003BFF5A /* WoodPeckerSwiftDemo-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WoodPeckerSwiftDemo-Bridging-Header.h"; sourceTree = ""; }; 1F8422AF20145079003BFF5A /* EchoService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EchoService.swift; sourceTree = ""; }; 1F90227120131F84007335EA /* WoodPeckerSwiftDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WoodPeckerSwiftDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1F90227420131F84007335EA /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1F90227B20131F84007335EA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1F90227E20131F84007335EA /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 1F90228020131F84007335EA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1F90226E20131F84007335EA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 1F66F00826D25CA200ADBBBE /* WoodPeckeriOS.xcframework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1F84227520133F5B003BFF5A /* Structure */ = { isa = PBXGroup; children = ( 1F84227820133FD4003BFF5A /* IndexViewController.swift */, 1F84229F2013468D003BFF5A /* IndexViewController.xib */, ); path = Structure; sourceTree = ""; }; 1F84227A201340C9003BFF5A /* Modules */ = { isa = PBXGroup; children = ( 1F84228A201340FE003BFF5A /* SandBox */, 1F84228E201340FE003BFF5A /* Network */, 1F842284201340FE003BFF5A /* IO */, ); path = Modules; sourceTree = ""; }; 1F842284201340FE003BFF5A /* IO */ = { isa = PBXGroup; children = ( 1F8422A520144831003BFF5A /* IOViewController.swift */, 1F842285201340FE003BFF5A /* IOViewController.xib */, 1F8422AF20145079003BFF5A /* EchoService.swift */, ); path = IO; sourceTree = ""; }; 1F84228A201340FE003BFF5A /* SandBox */ = { isa = PBXGroup; children = ( 1F84229D20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift */, 1F84228C201340FE003BFF5A /* SandboxViewController.xib */, ); path = SandBox; sourceTree = ""; }; 1F84228E201340FE003BFF5A /* Network */ = { isa = PBXGroup; children = ( 1F842291201340FE003BFF5A /* NetworkViewController.xib */, 1F8422A320143E28003BFF5A /* NetworkViewController.swift */, ); path = Network; sourceTree = ""; }; 1F90226820131F84007335EA = { isa = PBXGroup; children = ( 1F66F00626D25C7100ADBBBE /* WoodPeckeriOS.xcframework */, 1F90227320131F84007335EA /* WoodPeckerSwiftDemo */, 1F90227220131F84007335EA /* Products */, ); sourceTree = ""; }; 1F90227220131F84007335EA /* Products */ = { isa = PBXGroup; children = ( 1F90227120131F84007335EA /* WoodPeckerSwiftDemo.app */, ); name = Products; sourceTree = ""; }; 1F90227320131F84007335EA /* WoodPeckerSwiftDemo */ = { isa = PBXGroup; children = ( 1F84227A201340C9003BFF5A /* Modules */, 1F84227520133F5B003BFF5A /* Structure */, 1F90227420131F84007335EA /* AppDelegate.swift */, 1F90227B20131F84007335EA /* Assets.xcassets */, 1F8422A1201353E1003BFF5A /* images.xcassets */, 1F90227D20131F84007335EA /* LaunchScreen.storyboard */, 1F90228020131F84007335EA /* Info.plist */, 1F8422A820144B9C003BFF5A /* WoodPeckerSwiftDemo-Bridging-Header.h */, ); path = WoodPeckerSwiftDemo; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1F90227020131F84007335EA /* WoodPeckerSwiftDemo */ = { isa = PBXNativeTarget; buildConfigurationList = 1F90228320131F84007335EA /* Build configuration list for PBXNativeTarget "WoodPeckerSwiftDemo" */; buildPhases = ( 1F90226D20131F84007335EA /* Sources */, 1F90226E20131F84007335EA /* Frameworks */, 1F90226F20131F84007335EA /* Resources */, 1F90228A2013243B007335EA /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( ); name = WoodPeckerSwiftDemo; productName = WoodPeckerSwiftDemo; productReference = 1F90227120131F84007335EA /* WoodPeckerSwiftDemo.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 1F90226920131F84007335EA /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; LastUpgradeCheck = 0920; ORGANIZATIONNAME = lifebetter; TargetAttributes = { 1F90227020131F84007335EA = { CreatedOnToolsVersion = 9.2; ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = 1F90226C20131F84007335EA /* Build configuration list for PBXProject "WoodPeckerSwiftDemo" */; compatibilityVersion = "Xcode 8.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); mainGroup = 1F90226820131F84007335EA; productRefGroup = 1F90227220131F84007335EA /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 1F90227020131F84007335EA /* WoodPeckerSwiftDemo */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1F90226F20131F84007335EA /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 1F84229A201340FE003BFF5A /* SandboxViewController.xib in Resources */, 1F8422A2201353E1003BFF5A /* images.xcassets in Resources */, 1F84229C201340FE003BFF5A /* NetworkViewController.xib in Resources */, 1F90227F20131F84007335EA /* LaunchScreen.storyboard in Resources */, 1F90227C20131F84007335EA /* Assets.xcassets in Resources */, 1F842296201340FE003BFF5A /* IOViewController.xib in Resources */, 1F8422A02013468D003BFF5A /* IndexViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1F90226D20131F84007335EA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1F8422B020145079003BFF5A /* EchoService.swift in Sources */, 1F84229E20134115003BFF5A /* SandboxViewController.temp_caseinsensitive_rename.swift in Sources */, 1F8422A420143E28003BFF5A /* NetworkViewController.swift in Sources */, 1F8422A620144831003BFF5A /* IOViewController.swift in Sources */, 1F90227520131F84007335EA /* AppDelegate.swift in Sources */, 1F84227920133FD4003BFF5A /* IndexViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 1F90227D20131F84007335EA /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( 1F90227E20131F84007335EA /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 1F90228120131F84007335EA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.2; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 1F90228220131F84007335EA /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.2; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; }; name = Release; }; 1F90228420131F84007335EA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 8HG49Q463F; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/../", ); INFOPLIST_FILE = WoodPeckerSwiftDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = lifebetter.WoodPeckerSwiftDemo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_OBJC_BRIDGING_HEADER = "${PROJECT_DIR}/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo-Bridging-Header.h"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; 1F90228520131F84007335EA /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = 8HG49Q463F; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/../", ); INFOPLIST_FILE = WoodPeckerSwiftDemo/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = lifebetter.WoodPeckerSwiftDemo; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_INSTALL_OBJC_HEADER = YES; SWIFT_OBJC_BRIDGING_HEADER = "${PROJECT_DIR}/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo-Bridging-Header.h"; SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1F90226C20131F84007335EA /* Build configuration list for PBXProject "WoodPeckerSwiftDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 1F90228120131F84007335EA /* Debug */, 1F90228220131F84007335EA /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1F90228320131F84007335EA /* Build configuration list for PBXNativeTarget "WoodPeckerSwiftDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 1F90228420131F84007335EA /* Debug */, 1F90228520131F84007335EA /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 1F90226920131F84007335EA /* Project object */; } ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: WoodPeckeriOS-Carthage.json ================================================ { "1.0.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.3/WoodPeckeriOS.framework.zip", "1.0.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.6/WoodPeckeriOS.framework.zip", "1.0.7": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.7/WoodPeckeriOS.framework.zip", "1.0.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.8/WoodPeckeriOS.framework.zip", "1.0.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.9/WoodPeckeriOS.framework.zip", "1.1.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.0/WoodPeckeriOS.framework.zip", "1.1.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.1/WoodPeckeriOS.framework.zip", "1.1.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.2/WoodPeckeriOS.framework.zip", "1.1.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.3/WoodPeckeriOS.framework.zip", "1.1.4": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.4/WoodPeckeriOS.framework.zip", "1.1.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.6/WoodPeckeriOS.framework.zip", "1.1.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.8/WoodPeckeriOS.framework.zip", "1.1.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.9/WoodPeckeriOS.framework.zip", "1.2.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.0/WoodPeckeriOS.framework.zip", "1.2.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.1/WoodPeckeriOS.framework.zip", "1.2.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.2/WoodPeckeriOS.framework.zip", "1.2.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.3/WoodPeckeriOS.framework.zip", "1.2.4": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.4/WoodPeckeriOS.framework.zip", "1.2.5": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.5/WoodPeckeriOS.framework.zip", "1.2.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.6.1/WoodPeckeriOS.framework.zip", "1.2.7": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.7/WoodPeckeriOS.framework.zip", "1.2.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.8/WoodPeckeriOS.framework.zip", "1.2.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.9/WoodPeckeriOS.framework.zip", "1.2.92": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.92/WoodPeckeriOS.xcframework.zip", "1.2.93": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.93/WoodPeckeriOS.xcframework.zip", "1.3.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.0/WoodPeckeriOS.xcframework.zip", "1.3.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.1/WoodPeckeriOS.xcframework.zip", "1.3.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.3/WoodPeckeriOS.xcframework.zip", "1.4.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.0/WoodPeckeriOS.xcframework.zip", "1.4.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.1/WoodPeckeriOS.xcframework.zip", "1.4.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.2/WoodPeckeriOS.xcframework.zip", "1.4.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.3/WoodPeckeriOS.xcframework.zip" } ================================================ FILE: WoodPeckeriOS.podspec ================================================ Pod::Spec.new do |s| s.name = "WoodPeckeriOS" s.version = "1.4.3" s.summary = "iOS framework for Woodpekcer Mac App" s.description = "Woodpecker is a handy, powerful Mac app for iOS developer, it helps you view, modify sandbox files, monitor network, run javascript in WebView, and more..." s.homepage = "http://www.woodpeck.cn" s.authors = { "Woodpecker" => "woodperckerapp@163.com" } s.platform = :ios, "11.0" s.source = { :git => "https://github.com/appwoodpecker/woodpecker-ios.git", :tag => "#{s.version}" } s.vendored_frameworks = "WoodPeckeriOS.xcframework" s.license = { :type => 'Copyright', :file => 'LICENSE' } s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } end ================================================ FILE: WoodPeckeriOS.xcframework/Info.plist ================================================ AvailableLibraries LibraryIdentifier ios-arm64_x86_64-simulator LibraryPath WoodPeckeriOS.framework SupportedArchitectures arm64 x86_64 SupportedPlatform ios SupportedPlatformVariant simulator LibraryIdentifier ios-arm64 LibraryPath WoodPeckeriOS.framework SupportedArchitectures arm64 SupportedPlatform ios CFBundlePackageType XFWK XCFrameworkFormatVersion 1.0 ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHLogger.h ================================================ // // ADHLogger.h // ADHClient // // Created by 张小刚 on 2017/12/30. // Copyright © 2017年 lifebetter. All rights reserved. // #if TARGET_OS_IPHONE #import #endif @interface ADHLogger : NSObject + (ADHLogger *)sharedLogger; - (void)logText: (NSString *)text; - (void)logFileWithData:(NSData *)fileData fileName:(NSString *)fileName text: (NSString *)text; #if TARGET_OS_IPHONE - (void)logText: (NSString *)text color: (UIColor *)color; #endif @end ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHOrganizer.h ================================================ // // AppOrganizer.h // ADHClient // // Created by woodpecker on 2017/11/5. // Copyright © 2017年 lifebetter. All rights reserved. // #import #import /** * parameters that specify which mac client you'd like connect to * learn more at http://www.woodpeck.cn/connection.html */ extern NSString *const kADHHostName; extern NSString *const kADHHostAddress; extern NSString *const kADHAutoConnectEnabled; extern NSString *const kADHUIGestureEnabled; @interface ADHOrganizer : NSObject + (ADHOrganizer *)sharedOrganizer; /** * register your own ADHService * learn more about custom service, please visit http://www.woodpeck.cn/plugin.html */ - (void)registerService: (Class)serviceClazz; /** * show connection setup window manually, also you can use gesture too, * just long press with two fingers at anywhere of your app. */ - (void)showUI; @end ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHRequest.h ================================================ // // ADHRequest.h // ADHClient // // Created by woodpecker on 2017/11/4. // Copyright © 2017年 lifebetter. All rights reserved. // #import @class ADHRequest; @class ADHSession; @class ADHService; @interface ADHRequest : NSObject @property (nonatomic, strong) NSString * service; @property (nonatomic, strong) NSString * action; @property (nonatomic, strong) NSDictionary * body; @property (nonatomic, strong) NSData * payload; //must call at the end of a request - (void)finish; - (void)finishWithBody: (NSDictionary *)body; - (void)finishWithBody: (NSDictionary *)body payload: (NSData *)payload; @end ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHService.h ================================================ // // ADHService.h // AppDevelopHelper // // Created by woodpecker on 2017/11/4. // Copyright © 2017年 lifebetter. All rights reserved. // #import @interface ADHService : NSObject /** service name */ + (NSString *)serviceName; /** action list return @{ @"actionName1" : selector1 string, @"actionName2" : selector2 string, }; */ + (NSDictionary *)actionList; /** YES: all request use one shared service instance. NO: each request use a new service instance. */ + (BOOL)isShared; /** called on service init */ - (void)onServiceInit; @end @interface ADHAction: NSObject @property (nonatomic, strong) NSString * service; @property (nonatomic, strong) NSString * name; @property (nonatomic, strong) NSString * handler; + (ADHAction *)actionWithService: (NSString *)service name: (NSString *)name handler: (NSString *)handler; @end ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/WoodPeckeriOS.h ================================================ // // WoodPeckeriOS.h // WoodPeckeriOS // // Created by woodpecker on 2018/1/7. // Copyright © 2018年 lifebetter. All rights reserved. // #import //! Project version number for WoodPeckeriOS. FOUNDATION_EXPORT double WoodPeckeriOSVersionNumber; //! Project version string for WoodPeckeriOS. FOUNDATION_EXPORT const unsigned char WoodPeckeriOSVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import #import #import #import #import ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Modules/module.modulemap ================================================ framework module WoodPeckeriOS { umbrella header "WoodPeckeriOS.h" export * module * { export * } } ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/_CodeSignature/CodeResources ================================================ files ADHConnectViewController.nib pqKfhkAkrBNujLZE2Ee203g6yQ8= ADHRemoteServiceCell.nib 4EZm1JVZi6H8//9xa6WvF0M3POc= Headers/ADHLogger.h tr7ZIT8mFwHtfZNYOU7gcSui7M0= Headers/ADHOrganizer.h xjxX+wbxgeNkXtwk1oUJrkYJQuo= Headers/ADHRequest.h ImkUqO+N052g2ypMPoBtobY4s6g= Headers/ADHService.h 6SENU3Ad9+OcQ0slfAzrqpYzx9s= Headers/WoodPeckeriOS.h 725LXPFZloMNOizfCL/tkXqCgiQ= Info.plist EY+6I+c2ifIwpaBm8D3Lq+75SSM= Modules/module.modulemap uytDu9Ql07vN0alhWqpDzzrojIs= adhwebdebugger.bundle/mock.js YIsJN3YRR6UMoFhsBgb4JdY6tpg= files2 ADHConnectViewController.nib hash2 FE5aUJkN1d13EzbgXbaQBtY3OQSGwW5XZtSSb5Clyxw= ADHRemoteServiceCell.nib hash2 Po7DobIgRzXW62+4vL8El1TIzc5uGTIMIC2NLxTwmqk= Headers/ADHLogger.h hash2 I/Vh0EI2tIImYyjGDjEHMp4wAfoq8upkDFOD97tr7tU= Headers/ADHOrganizer.h hash2 DPmD7L8x7uJCdrgXHiQ6ztxVhsxW9ItGP/NS3pAQDpM= Headers/ADHRequest.h hash2 kxMpI4TuI/X4D1lz6txphCFANrdR4pWSFVOT/ORLEqc= Headers/ADHService.h hash2 9dlef+1QknEeYNfSnzmCv5MRj2e85DI2fA1BGlfdiDE= Headers/WoodPeckeriOS.h hash2 u/8B5RVVynf7ouOSIM9W2I1djZC82Xvo0/XS3WDACzk= Modules/module.modulemap hash2 1PST2FmpFCkiPZ3i3V5g1CguJHZwfC2IwIxxLUV68nY= adhwebdebugger.bundle/mock.js hash2 EML+wVyc32okro6yPkBnzQAG83hZugzIxJDI5qjNgNI= rules ^.* ^.*\.lproj/ optional weight 1000 ^.*\.lproj/locversion.plist$ omit weight 1100 ^Base\.lproj/ weight 1010 ^version.plist$ rules2 .*\.dSYM($|/) weight 11 ^(.*/)?\.DS_Store$ omit weight 2000 ^.* ^.*\.lproj/ optional weight 1000 ^.*\.lproj/locversion.plist$ omit weight 1100 ^Base\.lproj/ weight 1010 ^Info\.plist$ omit weight 20 ^PkgInfo$ omit weight 20 ^embedded\.provisionprofile$ weight 20 ^version\.plist$ weight 20 ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js ================================================ /** * mock window's console methods(log,info,warn,debug,error) and window.onerror */ function mockedMethodList () { const methodList = ['log', 'info', 'warn', 'debug', 'error']; return methodList; } //mock console methods function mockConsole() { if(window.adhOriginConsole) { return; } window.adhOriginConsole = {}; var methodList = mockedMethodList(); if(!window.console) { window.console = {}; }else { //save origin method methodList.map(function (method) { window.adhOriginConsole[method] = window.console[method]; }); } methodList.map(method => { window.console[method] = (...args) => { printLog({ logType: method, logs: args }); }; }); } function mockWindowError() { if(window.adhOriginOnError) { return } if(window.onerror) { window.adhOriginOnError = window.onerror; } window.onerror = printError; } function restoreWindowError() { window.onerror = window.adhOriginOnError; } /** * @param {String} errorMessage * @param {String} scriptURI * @param {Long} lineNumber * @param {Long} columnNumber * @param {Object} errorObj */ function printError(errorMessage, scriptURI, lineNumber,columnNumber) { var content = ''; content += 'message: ' + errorMessage + '
'; content += 'scriptURI: ' + scriptURI + '
'; content += 'line: ' + lineNumber + '
'; content += 'column: ' + columnNumber; console.error(content); } //restore console methods function restoreConsole() { var methodList = mockedMethodList(); methodList.map(function (method) { window.console[method] = window.adhOriginConsole[method]; }); } //mocked log function printLog(item) { var logType = item.logType; let logs = item.logs || []; if (!logs.length) { return; } var content = ''; for (let i = 0; i < logs.length; i++) { var value = logs[i]; if (typeof(value) == "undefined") { result = "undefined"; }else if (!value && value!=0) { result = "null"; }else if(typeof(value) == 'object'){ if(logs.length == 1) { result = JSON.stringify(value,null,4); }else { result = JSON.stringify(value,null); } }else { result = value.toString(); } content += result; } var data = {}; data['logType'] = logType; data['content'] = content; // data['date'] = new Date().toString(); //webkit if(window.webkit) { if(window.webkit.messageHandlers.wkwebviewjsHandler) { window.webkit.messageHandlers.wkwebviewjsHandler.postMessage(data); } } //uiwebview if(window.webviewjsHandler) { webviewjsHandler(data); } } function adhMock() { mockConsole(); mockWindowError(); } adhMock(); ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHLogger.h ================================================ // // ADHLogger.h // ADHClient // // Created by 张小刚 on 2017/12/30. // Copyright © 2017年 lifebetter. All rights reserved. // #if TARGET_OS_IPHONE #import #endif @interface ADHLogger : NSObject + (ADHLogger *)sharedLogger; - (void)logText: (NSString *)text; - (void)logFileWithData:(NSData *)fileData fileName:(NSString *)fileName text: (NSString *)text; #if TARGET_OS_IPHONE - (void)logText: (NSString *)text color: (UIColor *)color; #endif @end ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHOrganizer.h ================================================ // // AppOrganizer.h // ADHClient // // Created by woodpecker on 2017/11/5. // Copyright © 2017年 lifebetter. All rights reserved. // #import #import /** * parameters that specify which mac client you'd like connect to * learn more at http://www.woodpeck.cn/connection.html */ extern NSString *const kADHHostName; extern NSString *const kADHHostAddress; extern NSString *const kADHAutoConnectEnabled; extern NSString *const kADHUIGestureEnabled; @interface ADHOrganizer : NSObject + (ADHOrganizer *)sharedOrganizer; /** * register your own ADHService * learn more about custom service, please visit http://www.woodpeck.cn/plugin.html */ - (void)registerService: (Class)serviceClazz; /** * show connection setup window manually, also you can use gesture too, * just long press with two fingers at anywhere of your app. */ - (void)showUI; @end ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHRequest.h ================================================ // // ADHRequest.h // ADHClient // // Created by woodpecker on 2017/11/4. // Copyright © 2017年 lifebetter. All rights reserved. // #import @class ADHRequest; @class ADHSession; @class ADHService; @interface ADHRequest : NSObject @property (nonatomic, strong) NSString * service; @property (nonatomic, strong) NSString * action; @property (nonatomic, strong) NSDictionary * body; @property (nonatomic, strong) NSData * payload; //must call at the end of a request - (void)finish; - (void)finishWithBody: (NSDictionary *)body; - (void)finishWithBody: (NSDictionary *)body payload: (NSData *)payload; @end ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHService.h ================================================ // // ADHService.h // AppDevelopHelper // // Created by woodpecker on 2017/11/4. // Copyright © 2017年 lifebetter. All rights reserved. // #import @interface ADHService : NSObject /** service name */ + (NSString *)serviceName; /** action list return @{ @"actionName1" : selector1 string, @"actionName2" : selector2 string, }; */ + (NSDictionary *)actionList; /** YES: all request use one shared service instance. NO: each request use a new service instance. */ + (BOOL)isShared; /** called on service init */ - (void)onServiceInit; @end @interface ADHAction: NSObject @property (nonatomic, strong) NSString * service; @property (nonatomic, strong) NSString * name; @property (nonatomic, strong) NSString * handler; + (ADHAction *)actionWithService: (NSString *)service name: (NSString *)name handler: (NSString *)handler; @end ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/WoodPeckeriOS.h ================================================ // // WoodPeckeriOS.h // WoodPeckeriOS // // Created by woodpecker on 2018/1/7. // Copyright © 2018年 lifebetter. All rights reserved. // #import //! Project version number for WoodPeckeriOS. FOUNDATION_EXPORT double WoodPeckeriOSVersionNumber; //! Project version string for WoodPeckeriOS. FOUNDATION_EXPORT const unsigned char WoodPeckeriOSVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import #import #import #import #import ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Modules/module.modulemap ================================================ framework module WoodPeckeriOS { umbrella header "WoodPeckeriOS.h" export * module * { export * } } ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/_CodeSignature/CodeResources ================================================ files ADHConnectViewController.nib pqKfhkAkrBNujLZE2Ee203g6yQ8= ADHRemoteServiceCell.nib 4EZm1JVZi6H8//9xa6WvF0M3POc= Headers/ADHLogger.h tr7ZIT8mFwHtfZNYOU7gcSui7M0= Headers/ADHOrganizer.h xjxX+wbxgeNkXtwk1oUJrkYJQuo= Headers/ADHRequest.h ImkUqO+N052g2ypMPoBtobY4s6g= Headers/ADHService.h 6SENU3Ad9+OcQ0slfAzrqpYzx9s= Headers/WoodPeckeriOS.h 725LXPFZloMNOizfCL/tkXqCgiQ= Info.plist oMaB50N6kkDT7PV6DFqHL1IW2gw= Modules/module.modulemap uytDu9Ql07vN0alhWqpDzzrojIs= adhwebdebugger.bundle/mock.js YIsJN3YRR6UMoFhsBgb4JdY6tpg= files2 ADHConnectViewController.nib hash2 FE5aUJkN1d13EzbgXbaQBtY3OQSGwW5XZtSSb5Clyxw= ADHRemoteServiceCell.nib hash2 Po7DobIgRzXW62+4vL8El1TIzc5uGTIMIC2NLxTwmqk= Headers/ADHLogger.h hash2 I/Vh0EI2tIImYyjGDjEHMp4wAfoq8upkDFOD97tr7tU= Headers/ADHOrganizer.h hash2 DPmD7L8x7uJCdrgXHiQ6ztxVhsxW9ItGP/NS3pAQDpM= Headers/ADHRequest.h hash2 kxMpI4TuI/X4D1lz6txphCFANrdR4pWSFVOT/ORLEqc= Headers/ADHService.h hash2 9dlef+1QknEeYNfSnzmCv5MRj2e85DI2fA1BGlfdiDE= Headers/WoodPeckeriOS.h hash2 u/8B5RVVynf7ouOSIM9W2I1djZC82Xvo0/XS3WDACzk= Modules/module.modulemap hash2 1PST2FmpFCkiPZ3i3V5g1CguJHZwfC2IwIxxLUV68nY= adhwebdebugger.bundle/mock.js hash2 EML+wVyc32okro6yPkBnzQAG83hZugzIxJDI5qjNgNI= rules ^.* ^.*\.lproj/ optional weight 1000 ^.*\.lproj/locversion.plist$ omit weight 1100 ^Base\.lproj/ weight 1010 ^version.plist$ rules2 .*\.dSYM($|/) weight 11 ^(.*/)?\.DS_Store$ omit weight 2000 ^.* ^.*\.lproj/ optional weight 1000 ^.*\.lproj/locversion.plist$ omit weight 1100 ^Base\.lproj/ weight 1010 ^Info\.plist$ omit weight 20 ^PkgInfo$ omit weight 20 ^embedded\.provisionprofile$ weight 20 ^version\.plist$ weight 20 ================================================ FILE: WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js ================================================ /** * mock window's console methods(log,info,warn,debug,error) and window.onerror */ function mockedMethodList () { const methodList = ['log', 'info', 'warn', 'debug', 'error']; return methodList; } //mock console methods function mockConsole() { if(window.adhOriginConsole) { return; } window.adhOriginConsole = {}; var methodList = mockedMethodList(); if(!window.console) { window.console = {}; }else { //save origin method methodList.map(function (method) { window.adhOriginConsole[method] = window.console[method]; }); } methodList.map(method => { window.console[method] = (...args) => { printLog({ logType: method, logs: args }); }; }); } function mockWindowError() { if(window.adhOriginOnError) { return } if(window.onerror) { window.adhOriginOnError = window.onerror; } window.onerror = printError; } function restoreWindowError() { window.onerror = window.adhOriginOnError; } /** * @param {String} errorMessage * @param {String} scriptURI * @param {Long} lineNumber * @param {Long} columnNumber * @param {Object} errorObj */ function printError(errorMessage, scriptURI, lineNumber,columnNumber) { var content = ''; content += 'message: ' + errorMessage + '
'; content += 'scriptURI: ' + scriptURI + '
'; content += 'line: ' + lineNumber + '
'; content += 'column: ' + columnNumber; console.error(content); } //restore console methods function restoreConsole() { var methodList = mockedMethodList(); methodList.map(function (method) { window.console[method] = window.adhOriginConsole[method]; }); } //mocked log function printLog(item) { var logType = item.logType; let logs = item.logs || []; if (!logs.length) { return; } var content = ''; for (let i = 0; i < logs.length; i++) { var value = logs[i]; if (typeof(value) == "undefined") { result = "undefined"; }else if (!value && value!=0) { result = "null"; }else if(typeof(value) == 'object'){ if(logs.length == 1) { result = JSON.stringify(value,null,4); }else { result = JSON.stringify(value,null); } }else { result = value.toString(); } content += result; } var data = {}; data['logType'] = logType; data['content'] = content; // data['date'] = new Date().toString(); //webkit if(window.webkit) { if(window.webkit.messageHandlers.wkwebviewjsHandler) { window.webkit.messageHandlers.wkwebviewjsHandler.postMessage(data); } } //uiwebview if(window.webviewjsHandler) { webviewjsHandler(data); } } function adhMock() { mockConsole(); mockWindowError(); } adhMock(); ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/AppDelegate.swift ================================================ // // AppDelegate.swift // WoodpeckerMacDemo // // Created by xiaogang zhang on 2019/6/1. // Copyright © 2019 LIFE BETTER. All rights reserved. // import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { @IBOutlet weak var window: NSWindow! @IBOutlet weak var tabView: NSTabView! var list : Array>? func applicationDidFinishLaunching(_ aNotification: Notification) { initValue() loadContent() } func initValue() { self.list = [ [ "title" : "Sandbox", "page" : "SandboxViewController" ], [ "title" : "UserDefaults", "page" : "UserDefaultsViewController" ], [ "title" : "Network", "page" : "NetworkViewController" ], [ "title" : "Bundle", "page" : "BundleViewController" ], [ "title" : "Notification", "page" : "NotificationViewController" ], [ "title" : "Localization", "page" : "LocalizationViewController" ], ]; } func loadContent() { var tabItems = [NSTabViewItem]() for data in self.list! { let title = data["title"] let page = data["page"] let nibName = page let clazz = getClass(pageName:page!) let vc = clazz.init(nibName: nibName, bundle: nil) vc.title = title let tabItem = NSTabViewItem.init(viewController: vc) tabItems.append(tabItem) } self.tabView.tabViewItems = tabItems } func getClass(pageName: String) -> NSViewController.Type { let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String let clazzName = namespace + "." + pageName; let clazz = NSClassFromString(clazzName) as! NSViewController.Type return clazz; } func applicationWillTerminate(_ aNotification: Notification) { // Insert code here to tear down your application } func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { return true } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/AppIcon.appiconset/Contents.json ================================================ { "images" : [ { "idiom" : "mac", "size" : "16x16", "scale" : "1x" }, { "idiom" : "mac", "size" : "16x16", "scale" : "2x" }, { "idiom" : "mac", "size" : "32x32", "scale" : "1x" }, { "idiom" : "mac", "size" : "32x32", "scale" : "2x" }, { "idiom" : "mac", "size" : "128x128", "scale" : "1x" }, { "idiom" : "mac", "size" : "128x128", "scale" : "2x" }, { "idiom" : "mac", "size" : "256x256", "scale" : "1x" }, { "idiom" : "mac", "size" : "256x256", "scale" : "2x" }, { "idiom" : "mac", "size" : "512x512", "scale" : "1x" }, { "idiom" : "mac", "size" : "512x512", "scale" : "2x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/Contents.json ================================================ { "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_bundle.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_bundle.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_localization.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_localization.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_network.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_network.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_notification.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_notification.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_sandbox.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_sandbox.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_userdefaults.imageset/Contents.json ================================================ { "images" : [ { "idiom" : "universal", "filename" : "tool_userdefaults.png", "scale" : "1x" }, { "idiom" : "universal", "scale" : "2x" }, { "idiom" : "universal", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Base.lproj/MainMenu.xib ================================================ Default Left to Right Right to Left Default Left to Right Right to Left ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Info.plist ================================================ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName $(PRODUCT_NAME) CFBundlePackageType APPL CFBundleShortVersionString 1.0.0 CFBundleVersion 1 LSApplicationCategoryType public.app-category.developer-tools LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) NSHumanReadableCopyright Copyright © 2019 LIFE BETTER. All rights reserved. NSMainNibFile MainMenu NSPrincipalClass NSApplication ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Bundle/BundleViewController.swift ================================================ // // BundleViewController.swift // WoodpeckerMacDemo // // Created by xiaogang zhang on 2019/6/1. // Copyright © 2019 LIFE BETTER. All rights reserved. // import Cocoa class BundleViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() // Do view setup here. } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Bundle/BundleViewController.xib ================================================ ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Localization/LocalizationViewController.swift ================================================ // // LocalizationViewController.swift // WoodpeckerMacDemo // // Created by xiaogang zhang on 2019/6/1. // Copyright © 2019 LIFE BETTER. All rights reserved. // import Cocoa class LocalizationViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() // Do view setup here. } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Localization/LocalizationViewController.xib ================================================ ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/NetworkViewController.swift ================================================ // // NetworkViewController.swift // WoodpeckerMacDemo // // Created by xiaogang zhang on 2019/6/1. // Copyright © 2019 LIFE BETTER. All rights reserved. // import Cocoa class NetworkViewController: NSViewController,NSURLConnectionDataDelegate,URLSessionDelegate { override func viewDidLoad() { super.viewDidLoad() } @IBAction func requestButtonClicked(_ sender: Any) { //url connection let requestURL = URL.init(string: "https://api.github.com") let request = URLRequest.init(url: requestURL!) let connection = NSURLConnection.init(request: request, delegate: self) connection?.start() //session request self.sessionRequest() } func sessionRequest(){ let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = 10.0 let mySession = URLSession.init(configuration: config, delegate: self, delegateQueue: OperationQueue.main) let url = "https://api.github.com/emojis" let requestURL = URL.init(string: url) let uploadRequest = NSMutableURLRequest.init(url: requestURL!) uploadRequest.httpMethod = "POST" let formText = "q=\(arc4random())" let data = formText.data(using: String.Encoding.utf8) let task = mySession.uploadTask(with: uploadRequest as URLRequest, from: data) { (data:Data?, response:URLResponse?, error:Error?) in } task.resume() } func connectionDidFinishLoading(_ connection: NSURLConnection) { } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/NetworkViewController.xib ================================================ ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Notification/NotificationViewController.swift ================================================ // // NotificationViewController.swift // WoodpeckerMacDemo // // Created by xiaogang zhang on 2019/6/1. // Copyright © 2019 LIFE BETTER. All rights reserved. // import Cocoa import UserNotifications class NotificationViewController: NSViewController, UNUserNotificationCenterDelegate { override func viewDidLoad() { super.viewDidLoad() setup() } func setup() { let notiCenter = UNUserNotificationCenter.current() notiCenter.delegate = self let openAction = UNNotificationAction.init(identifier: UNNotificationDefaultActionIdentifier, title: "Okay", options: UNNotificationActionOptions.init(rawValue: 0)) let category = UNNotificationCategory.init(identifier: "category_id", actions: [openAction], intentIdentifiers: [], options: UNNotificationCategoryOptions.init(rawValue: 0)) let set = Set.init([category]) notiCenter.setNotificationCategories(set) } @IBAction func scheduleButtonClicked(_ sender: Any) { let notiCenter = UNUserNotificationCenter.current() notiCenter.requestAuthorization(options: [UNAuthorizationOptions.alert,UNAuthorizationOptions.badge,UNAuthorizationOptions.sound]) { (okay, error) in if okay { self.schedule() } if let err = error { print(err) let alert = NSAlert.init() alert.messageText = "request authorization failed, you can try in your own project later" alert.addButton(withTitle: "Okay") alert.runModal(); } } } func schedule () { let notiCenter = UNUserNotificationCenter.current() let content = UNMutableNotificationContent.init() content.badge = 3 content.body = "I'm body" content.title = "I'm title" content.subtitle = "I'm subtitle" content.userInfo = [ "key" : "value" ] content.categoryIdentifier = "category_id"; //60s let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60, repeats: true) let identifier = String(arc4random()) let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: trigger) notiCenter.add(request) { (error) in } } public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { } @IBAction func removeAllButtonClicked(_ sender: Any) { let notiCenter = UNUserNotificationCenter.current() notiCenter.removeAllPendingNotificationRequests(); } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Notification/NotificationViewController.xib ================================================ ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Sandbox/SandboxViewController.swift ================================================ // // SandboxViewController.swift // WoodpeckerMacDemo // // Created by xiaogang zhang on 2019/6/1. // Copyright © 2019 LIFE BETTER. All rights reserved. // import Cocoa class SandboxViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func addButtonClicked(_ sender: Any) { let formatter = DateFormatter() formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" let date = Date() let text = formatter.string(from: date) //file name formatter.dateFormat = "HH-mm-ss" let fileName = "\(formatter.string(from: date)).txt" let documentPath = (NSHomeDirectory() as NSString).appendingPathComponent("Documents") let filePath = (documentPath as NSString).appendingPathComponent(fileName) let fileURL = NSURL.fileURL(withPath: filePath) do { try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8) } catch { } } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Sandbox/SandboxViewController.xib ================================================ ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/UserDefaults/UserDefaultsViewController.swift ================================================ // // UserDefaultsViewController.swift // WoodpeckerMacDemo // // Created by xiaogang zhang on 2019/6/1. // Copyright © 2019 LIFE BETTER. All rights reserved. // import Cocoa class UserDefaultsViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() } @IBAction func addButtonClicked(_ sender: Any) { UserDefaults.standard.set(Date.init(), forKey: "time") UserDefaults.standard.synchronize() } } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/UserDefaults/UserDefaultsViewController.xib ================================================ ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/WoodpeckerMacDemo.entitlements ================================================ com.apple.security.app-sandbox com.apple.security.files.user-selected.read-only com.apple.security.network.client com.apple.security.network.server ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/de.lproj/Localizable.strings ================================================ /* Localizable.strings WoodpeckerMacDemo Created by 张小刚 on 2019/6/1. Copyright © 2019 LIFE BETTER. All rights reserved. */ "hi"="bonjour"; ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/en.lproj/Localizable.strings ================================================ /* Localizable.strings WoodpeckerMacDemo Created by xiaogang zhang on 2019/6/1. Copyright © 2019 LIFE BETTER. All rights reserved. */ "hi"="Hi"; ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/en.lproj/MainMenu.xib ================================================ Default Left to Right Right to Left Default Left to Right Right to Left ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/fr.lproj/Localizable.strings ================================================ /* Localizable.strings WoodpeckerMacDemo Created by xiaogang zhang on 2019/6/1. Copyright © 2019 LIFE BETTER. All rights reserved. */ "hi"="Bonjour"; ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/fr.lproj/MainMenu.strings ================================================ /* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */ "1UK-8n-QPP.title" = "Customize Toolbar…"; /* Class = "NSMenuItem"; title = "WoodpeckerMacDemo"; ObjectID = "1Xt-HY-uBw"; */ "1Xt-HY-uBw.title" = "WoodpeckerMacDemo"; /* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */ "1b7-l0-nxx.title" = "Find"; /* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */ "1tx-W0-xDw.title" = "Lower"; /* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */ "2h7-ER-AoG.title" = "Raise"; /* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */ "2oI-Rn-ZJC.title" = "Transformations"; /* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */ "3IN-sU-3Bg.title" = "Spelling"; /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */ "3Om-Ey-2VK.title" = "Use Default"; /* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */ "3rS-ZA-NoH.title" = "Speech"; /* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */ "46P-cB-AYj.title" = "Tighten"; /* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */ "4EN-yA-p0u.title" = "Find"; /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */ "4J7-dP-txa.title" = "Enter Full Screen"; /* Class = "NSMenuItem"; title = "Quit WoodpeckerMacDemo"; ObjectID = "4sb-4s-VLi"; */ "4sb-4s-VLi.title" = "Quit WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */ "5QF-Oa-p0T.title" = "Edit"; /* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */ "5Vv-lz-BsD.title" = "Copy Style"; /* Class = "NSMenuItem"; title = "About WoodpeckerMacDemo"; ObjectID = "5kV-Vb-QxS"; */ "5kV-Vb-QxS.title" = "About WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */ "6dh-zS-Vam.title" = "Redo"; /* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */ "78Y-hA-62v.title" = "Correct Spelling Automatically"; /* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */ "8mr-sm-Yjd.title" = "Writing Direction"; /* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */ "9ic-FL-obx.title" = "Substitutions"; /* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */ "9yt-4B-nSM.title" = "Smart Copy/Paste"; /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ "AYu-sK-qS6.title" = "Main Menu"; /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ "BOF-NM-1cW.title" = "Preferences…"; /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */ "BgM-ve-c93.title" = "\tLeft to Right"; /* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */ "Bw7-FT-i3A.title" = "Save As…"; /* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */ "DVo-aG-piG.title" = "Close"; /* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */ "Dv1-io-Yv7.title" = "Spelling and Grammar"; /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ "F2S-fz-NVQ.title" = "Help"; /* Class = "NSMenuItem"; title = "WoodpeckerMacDemo Help"; ObjectID = "FKE-Sm-Kum"; */ "FKE-Sm-Kum.title" = "WoodpeckerMacDemo Help"; /* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */ "Fal-I4-PZk.title" = "Text"; /* Class = "NSTabViewItem"; label = "Tab"; ObjectID = "Fc1-Q2-KuF"; */ "Fc1-Q2-KuF.label" = "Tab"; /* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */ "FeM-D8-WVr.title" = "Substitutions"; /* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */ "GB9-OM-e27.title" = "Bold"; /* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */ "GEO-Iw-cKr.title" = "Format"; /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */ "GUa-eO-cwY.title" = "Use Default"; /* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */ "Gi5-1S-RQB.title" = "Font"; /* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */ "H1b-Si-o9J.title" = "Writing Direction"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */ "H8h-7b-M4v.title" = "View"; /* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */ "HFQ-gK-NFA.title" = "Text Replacement"; /* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */ "HFo-cy-zxI.title" = "Show Spelling and Grammar"; /* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */ "HyV-fh-RgO.title" = "View"; /* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */ "I0S-gh-46l.title" = "Subscript"; /* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */ "IAo-SY-fd9.title" = "Open…"; /* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */ "J5U-5w-g23.title" = "Justify"; /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */ "J7y-lM-qPV.title" = "Use None"; /* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */ "KaW-ft-85H.title" = "Revert to Saved"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ "Kd2-mp-pUS.title" = "Show All"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ "LE2-aR-0XJ.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */ "LVM-kO-fVI.title" = "Paste Ruler"; /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */ "Lbh-J2-qVU.title" = "\tLeft to Right"; /* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */ "MkV-Pr-PK5.title" = "Copy Ruler"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ "NMo-om-nkz.title" = "Services"; /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */ "Nop-cj-93Q.title" = "\tDefault"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ "OY7-WF-poV.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */ "OaQ-X3-Vso.title" = "Baseline"; /* Class = "NSMenuItem"; title = "Hide WoodpeckerMacDemo"; ObjectID = "Olw-nP-bQN"; */ "Olw-nP-bQN.title" = "Hide WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */ "OwM-mh-QMV.title" = "Find Previous"; /* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */ "Oyz-dy-DGm.title" = "Stop Speaking"; /* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */ "Ptp-SP-VEL.title" = "Bigger"; /* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */ "Q5e-8K-NDq.title" = "Show Fonts"; /* Class = "NSWindow"; title = "WoodpeckerMacDemo"; ObjectID = "QvC-M9-y7g"; */ "QvC-M9-y7g.title" = "WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ "R4o-n2-Eq4.title" = "Zoom"; /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */ "RB4-Sm-HuC.title" = "\tRight to Left"; /* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */ "Rqc-34-cIF.title" = "Superscript"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */ "Ruw-6m-B2m.title" = "Select All"; /* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */ "S0p-oC-mLd.title" = "Jump to Selection"; /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ "Td7-aD-5lo.title" = "Window"; /* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */ "UEZ-Bs-lqG.title" = "Capitalize"; /* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */ "VIY-Ag-zcb.title" = "Center"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ "Vdr-fp-XzO.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */ "Vjx-xi-njq.title" = "Italic"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */ "W48-6f-4Dl.title" = "Edit"; /* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */ "WRG-CD-K1S.title" = "Underline"; /* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */ "Was-JA-tGl.title" = "New"; /* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */ "WeT-3V-zwk.title" = "Paste and Match Style"; /* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */ "Xz5-n4-O0W.title" = "Find…"; /* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */ "YEy-JH-Tfz.title" = "Find and Replace…"; /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */ "YGs-j5-SAR.title" = "\tDefault"; /* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */ "Ynk-f8-cLZ.title" = "Start Speaking"; /* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */ "ZM1-6Q-yy1.title" = "Align Left"; /* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */ "ZvO-Gk-QUH.title" = "Paragraph"; /* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */ "aTl-1u-JFS.title" = "Print…"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ "aUF-d1-5bR.title" = "Window"; /* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */ "aXa-aM-Jaq.title" = "Font"; /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */ "agt-UL-0e3.title" = "Use Default"; /* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */ "bgn-CT-cEk.title" = "Show Colors"; /* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */ "bib-Uj-vzu.title" = "File"; /* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */ "buJ-ug-pKt.title" = "Use Selection for Find"; /* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */ "c8a-y6-VQd.title" = "Transformations"; /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */ "cDB-IK-hbR.title" = "Use None"; /* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */ "cqv-fj-IhA.title" = "Selection"; /* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */ "cwL-P1-jid.title" = "Smart Links"; /* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */ "d9M-CD-aMd.title" = "Make Lower Case"; /* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */ "d9c-me-L2H.title" = "Text"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */ "dMs-cI-mzQ.title" = "File"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */ "dRJ-4n-Yzg.title" = "Undo"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */ "gVA-U4-sdL.title" = "Paste"; /* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */ "hQb-2v-fYv.title" = "Smart Quotes"; /* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */ "hz2-CU-CR7.title" = "Check Document Now"; /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ "hz9-B4-Xy5.title" = "Services"; /* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */ "i1d-Er-qST.title" = "Smaller"; /* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */ "ijk-EB-dga.title" = "Baseline"; /* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */ "jBQ-r6-VK2.title" = "Kern"; /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */ "jFq-tB-4Kx.title" = "\tRight to Left"; /* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */ "jxT-CU-nIS.title" = "Format"; /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */ "kIP-vf-haE.title" = "Show Sidebar"; /* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */ "mK6-2p-4JG.title" = "Check Grammar With Spelling"; /* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */ "o6e-r0-MWq.title" = "Ligatures"; /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */ "oas-Oc-fiZ.title" = "Open Recent"; /* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */ "ogc-rX-tC1.title" = "Loosen"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */ "pa3-QI-u2k.title" = "Delete"; /* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */ "pxx-59-PXV.title" = "Save…"; /* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */ "q09-fT-Sye.title" = "Find Next"; /* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */ "qIS-W8-SiK.title" = "Page Setup…"; /* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */ "rbD-Rh-wIN.title" = "Check Spelling While Typing"; /* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */ "rgM-f4-ycn.title" = "Smart Dashes"; /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */ "snW-S8-Cw5.title" = "Show Toolbar"; /* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */ "tRr-pd-1PS.title" = "Data Detectors"; /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */ "tXI-mr-wws.title" = "Open Recent"; /* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */ "tlD-Oa-oAM.title" = "Kern"; /* Class = "NSMenu"; title = "WoodpeckerMacDemo"; ObjectID = "uQy-DD-JDr"; */ "uQy-DD-JDr.title" = "WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */ "uRl-iY-unG.title" = "Cut"; /* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */ "vKC-jM-MkH.title" = "Paste Style"; /* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */ "vLm-3I-IUL.title" = "Show Ruler"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */ "vNY-rz-j42.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */ "vmV-6d-7jI.title" = "Make Upper Case"; /* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */ "w0m-vy-SC9.title" = "Ligatures"; /* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */ "wb2-vD-lq4.title" = "Align Right"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ "wpr-3q-Mcd.title" = "Help"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */ "x3v-GG-iWU.title" = "Copy"; /* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */ "xQD-1f-W4t.title" = "Use All"; /* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */ "xrE-MZ-jX0.title" = "Speech"; /* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */ "z6F-FW-3nz.title" = "Show Substitutions"; ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/zh-Hans.lproj/Localizable.strings ================================================ /* Localizable.strings WoodpeckerMacDemo Created by xiaogang zhang on 2019/6/1. Copyright © 2019 LIFE BETTER. All rights reserved. */ "hi"="你好"; ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo/zh-Hans.lproj/MainMenu.strings ================================================ /* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */ "1UK-8n-QPP.title" = "Customize Toolbar…"; /* Class = "NSMenuItem"; title = "WoodpeckerMacDemo"; ObjectID = "1Xt-HY-uBw"; */ "1Xt-HY-uBw.title" = "WoodpeckerMacDemo"; /* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */ "1b7-l0-nxx.title" = "Find"; /* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */ "1tx-W0-xDw.title" = "Lower"; /* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */ "2h7-ER-AoG.title" = "Raise"; /* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */ "2oI-Rn-ZJC.title" = "Transformations"; /* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */ "3IN-sU-3Bg.title" = "Spelling"; /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */ "3Om-Ey-2VK.title" = "Use Default"; /* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */ "3rS-ZA-NoH.title" = "Speech"; /* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */ "46P-cB-AYj.title" = "Tighten"; /* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */ "4EN-yA-p0u.title" = "Find"; /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */ "4J7-dP-txa.title" = "Enter Full Screen"; /* Class = "NSMenuItem"; title = "Quit WoodpeckerMacDemo"; ObjectID = "4sb-4s-VLi"; */ "4sb-4s-VLi.title" = "Quit WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */ "5QF-Oa-p0T.title" = "Edit"; /* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */ "5Vv-lz-BsD.title" = "Copy Style"; /* Class = "NSMenuItem"; title = "About WoodpeckerMacDemo"; ObjectID = "5kV-Vb-QxS"; */ "5kV-Vb-QxS.title" = "About WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */ "6dh-zS-Vam.title" = "Redo"; /* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */ "78Y-hA-62v.title" = "Correct Spelling Automatically"; /* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */ "8mr-sm-Yjd.title" = "Writing Direction"; /* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */ "9ic-FL-obx.title" = "Substitutions"; /* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */ "9yt-4B-nSM.title" = "Smart Copy/Paste"; /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ "AYu-sK-qS6.title" = "Main Menu"; /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ "BOF-NM-1cW.title" = "Preferences…"; /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */ "BgM-ve-c93.title" = "\tLeft to Right"; /* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */ "Bw7-FT-i3A.title" = "Save As…"; /* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */ "DVo-aG-piG.title" = "Close"; /* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */ "Dv1-io-Yv7.title" = "Spelling and Grammar"; /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ "F2S-fz-NVQ.title" = "Help"; /* Class = "NSMenuItem"; title = "WoodpeckerMacDemo Help"; ObjectID = "FKE-Sm-Kum"; */ "FKE-Sm-Kum.title" = "WoodpeckerMacDemo Help"; /* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */ "Fal-I4-PZk.title" = "Text"; /* Class = "NSTabViewItem"; label = "Tab"; ObjectID = "Fc1-Q2-KuF"; */ "Fc1-Q2-KuF.label" = "Tab"; /* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */ "FeM-D8-WVr.title" = "Substitutions"; /* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */ "GB9-OM-e27.title" = "Bold"; /* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */ "GEO-Iw-cKr.title" = "Format"; /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */ "GUa-eO-cwY.title" = "Use Default"; /* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */ "Gi5-1S-RQB.title" = "Font"; /* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */ "H1b-Si-o9J.title" = "Writing Direction"; /* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */ "H8h-7b-M4v.title" = "View"; /* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */ "HFQ-gK-NFA.title" = "Text Replacement"; /* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */ "HFo-cy-zxI.title" = "Show Spelling and Grammar"; /* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */ "HyV-fh-RgO.title" = "View"; /* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */ "I0S-gh-46l.title" = "Subscript"; /* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */ "IAo-SY-fd9.title" = "Open…"; /* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */ "J5U-5w-g23.title" = "Justify"; /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */ "J7y-lM-qPV.title" = "Use None"; /* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */ "KaW-ft-85H.title" = "Revert to Saved"; /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ "Kd2-mp-pUS.title" = "Show All"; /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ "LE2-aR-0XJ.title" = "Bring All to Front"; /* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */ "LVM-kO-fVI.title" = "Paste Ruler"; /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */ "Lbh-J2-qVU.title" = "\tLeft to Right"; /* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */ "MkV-Pr-PK5.title" = "Copy Ruler"; /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ "NMo-om-nkz.title" = "Services"; /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */ "Nop-cj-93Q.title" = "\tDefault"; /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ "OY7-WF-poV.title" = "Minimize"; /* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */ "OaQ-X3-Vso.title" = "Baseline"; /* Class = "NSMenuItem"; title = "Hide WoodpeckerMacDemo"; ObjectID = "Olw-nP-bQN"; */ "Olw-nP-bQN.title" = "Hide WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */ "OwM-mh-QMV.title" = "Find Previous"; /* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */ "Oyz-dy-DGm.title" = "Stop Speaking"; /* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */ "Ptp-SP-VEL.title" = "Bigger"; /* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */ "Q5e-8K-NDq.title" = "Show Fonts"; /* Class = "NSWindow"; title = "WoodpeckerMacDemo"; ObjectID = "QvC-M9-y7g"; */ "QvC-M9-y7g.title" = "WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ "R4o-n2-Eq4.title" = "Zoom"; /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */ "RB4-Sm-HuC.title" = "\tRight to Left"; /* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */ "Rqc-34-cIF.title" = "Superscript"; /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */ "Ruw-6m-B2m.title" = "Select All"; /* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */ "S0p-oC-mLd.title" = "Jump to Selection"; /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ "Td7-aD-5lo.title" = "Window"; /* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */ "UEZ-Bs-lqG.title" = "Capitalize"; /* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */ "VIY-Ag-zcb.title" = "Center"; /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ "Vdr-fp-XzO.title" = "Hide Others"; /* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */ "Vjx-xi-njq.title" = "Italic"; /* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */ "W48-6f-4Dl.title" = "Edit"; /* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */ "WRG-CD-K1S.title" = "Underline"; /* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */ "Was-JA-tGl.title" = "New"; /* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */ "WeT-3V-zwk.title" = "Paste and Match Style"; /* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */ "Xz5-n4-O0W.title" = "Find…"; /* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */ "YEy-JH-Tfz.title" = "Find and Replace…"; /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */ "YGs-j5-SAR.title" = "\tDefault"; /* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */ "Ynk-f8-cLZ.title" = "Start Speaking"; /* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */ "ZM1-6Q-yy1.title" = "Align Left"; /* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */ "ZvO-Gk-QUH.title" = "Paragraph"; /* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */ "aTl-1u-JFS.title" = "Print…"; /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ "aUF-d1-5bR.title" = "Window"; /* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */ "aXa-aM-Jaq.title" = "Font"; /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */ "agt-UL-0e3.title" = "Use Default"; /* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */ "bgn-CT-cEk.title" = "Show Colors"; /* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */ "bib-Uj-vzu.title" = "File"; /* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */ "buJ-ug-pKt.title" = "Use Selection for Find"; /* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */ "c8a-y6-VQd.title" = "Transformations"; /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */ "cDB-IK-hbR.title" = "Use None"; /* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */ "cqv-fj-IhA.title" = "Selection"; /* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */ "cwL-P1-jid.title" = "Smart Links"; /* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */ "d9M-CD-aMd.title" = "Make Lower Case"; /* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */ "d9c-me-L2H.title" = "Text"; /* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */ "dMs-cI-mzQ.title" = "File"; /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */ "dRJ-4n-Yzg.title" = "Undo"; /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */ "gVA-U4-sdL.title" = "Paste"; /* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */ "hQb-2v-fYv.title" = "Smart Quotes"; /* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */ "hz2-CU-CR7.title" = "Check Document Now"; /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ "hz9-B4-Xy5.title" = "Services"; /* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */ "i1d-Er-qST.title" = "Smaller"; /* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */ "ijk-EB-dga.title" = "Baseline"; /* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */ "jBQ-r6-VK2.title" = "Kern"; /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */ "jFq-tB-4Kx.title" = "\tRight to Left"; /* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */ "jxT-CU-nIS.title" = "Format"; /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */ "kIP-vf-haE.title" = "Show Sidebar"; /* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */ "mK6-2p-4JG.title" = "Check Grammar With Spelling"; /* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */ "o6e-r0-MWq.title" = "Ligatures"; /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */ "oas-Oc-fiZ.title" = "Open Recent"; /* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */ "ogc-rX-tC1.title" = "Loosen"; /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */ "pa3-QI-u2k.title" = "Delete"; /* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */ "pxx-59-PXV.title" = "Save…"; /* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */ "q09-fT-Sye.title" = "Find Next"; /* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */ "qIS-W8-SiK.title" = "Page Setup…"; /* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */ "rbD-Rh-wIN.title" = "Check Spelling While Typing"; /* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */ "rgM-f4-ycn.title" = "Smart Dashes"; /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */ "snW-S8-Cw5.title" = "Show Toolbar"; /* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */ "tRr-pd-1PS.title" = "Data Detectors"; /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */ "tXI-mr-wws.title" = "Open Recent"; /* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */ "tlD-Oa-oAM.title" = "Kern"; /* Class = "NSMenu"; title = "WoodpeckerMacDemo"; ObjectID = "uQy-DD-JDr"; */ "uQy-DD-JDr.title" = "WoodpeckerMacDemo"; /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */ "uRl-iY-unG.title" = "Cut"; /* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */ "vKC-jM-MkH.title" = "Paste Style"; /* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */ "vLm-3I-IUL.title" = "Show Ruler"; /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */ "vNY-rz-j42.title" = "Clear Menu"; /* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */ "vmV-6d-7jI.title" = "Make Upper Case"; /* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */ "w0m-vy-SC9.title" = "Ligatures"; /* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */ "wb2-vD-lq4.title" = "Align Right"; /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ "wpr-3q-Mcd.title" = "Help"; /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */ "x3v-GG-iWU.title" = "Copy"; /* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */ "xQD-1f-W4t.title" = "Use All"; /* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */ "xrE-MZ-jX0.title" = "Speech"; /* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */ "z6F-FW-3nz.title" = "Show Substitutions"; ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo.xcodeproj/project.pbxproj ================================================ // !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 50; objects = { /* Begin PBXBuildFile section */ 1F28FB5822A293E700C2CF25 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F28FB5722A293E700C2CF25 /* AppDelegate.swift */; }; 1F28FB5A22A293E900C2CF25 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB5922A293E900C2CF25 /* Assets.xcassets */; }; 1F28FB5D22A293E900C2CF25 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB5B22A293E900C2CF25 /* MainMenu.xib */; }; 1F28FB6922A2ABAE00C2CF25 /* SandboxViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F28FB6722A2ABAE00C2CF25 /* SandboxViewController.swift */; }; 1F28FB6A22A2ABAE00C2CF25 /* SandboxViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB6822A2ABAE00C2CF25 /* SandboxViewController.xib */; }; 1F28FB6E22A2B21000C2CF25 /* NetworkViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F28FB6C22A2B21000C2CF25 /* NetworkViewController.swift */; }; 1F28FB6F22A2B21000C2CF25 /* NetworkViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB6D22A2B21000C2CF25 /* NetworkViewController.xib */; }; 1F28FB7322A2B31F00C2CF25 /* UserDefaultsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F28FB7122A2B31F00C2CF25 /* UserDefaultsViewController.swift */; }; 1F28FB7422A2B31F00C2CF25 /* UserDefaultsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB7222A2B31F00C2CF25 /* UserDefaultsViewController.xib */; }; 1F28FB7822A2B47400C2CF25 /* BundleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F28FB7622A2B47400C2CF25 /* BundleViewController.swift */; }; 1F28FB7922A2B47400C2CF25 /* BundleViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB7722A2B47400C2CF25 /* BundleViewController.xib */; }; 1F28FB7D22A2B50B00C2CF25 /* NotificationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F28FB7B22A2B50B00C2CF25 /* NotificationViewController.swift */; }; 1F28FB7E22A2B50B00C2CF25 /* NotificationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB7C22A2B50B00C2CF25 /* NotificationViewController.xib */; }; 1F28FB8222A2B94200C2CF25 /* LocalizationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F28FB8022A2B94200C2CF25 /* LocalizationViewController.swift */; }; 1F28FB8322A2B94200C2CF25 /* LocalizationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB8122A2B94200C2CF25 /* LocalizationViewController.xib */; }; 1F28FB8E22A2C1C800C2CF25 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 1F28FB9022A2C1C800C2CF25 /* Localizable.strings */; }; 1F28FBB622A3F9CC00C2CF25 /* WoodpeckerMacOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1F28FBB522A3F9CC00C2CF25 /* WoodpeckerMacOS.framework */; }; 1F28FBB722A3F9CC00C2CF25 /* WoodpeckerMacOS.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1F28FBB522A3F9CC00C2CF25 /* WoodpeckerMacOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ 1F28FBB422A3F99700C2CF25 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 12; dstPath = ""; dstSubfolderSpec = 10; files = ( 1F28FBB722A3F9CC00C2CF25 /* WoodpeckerMacOS.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ 1F28FB5422A293E700C2CF25 /* WoodpeckerMacDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WoodpeckerMacDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1F28FB5722A293E700C2CF25 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1F28FB5922A293E900C2CF25 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1F28FB5E22A293E900C2CF25 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1F28FB5F22A293E900C2CF25 /* WoodpeckerMacDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = WoodpeckerMacDemo.entitlements; sourceTree = ""; }; 1F28FB6722A2ABAE00C2CF25 /* SandboxViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SandboxViewController.swift; sourceTree = ""; }; 1F28FB6822A2ABAE00C2CF25 /* SandboxViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SandboxViewController.xib; sourceTree = ""; }; 1F28FB6C22A2B21000C2CF25 /* NetworkViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkViewController.swift; sourceTree = ""; }; 1F28FB6D22A2B21000C2CF25 /* NetworkViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NetworkViewController.xib; sourceTree = ""; }; 1F28FB7122A2B31F00C2CF25 /* UserDefaultsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserDefaultsViewController.swift; sourceTree = ""; }; 1F28FB7222A2B31F00C2CF25 /* UserDefaultsViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = UserDefaultsViewController.xib; sourceTree = ""; }; 1F28FB7622A2B47400C2CF25 /* BundleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BundleViewController.swift; sourceTree = ""; }; 1F28FB7722A2B47400C2CF25 /* BundleViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BundleViewController.xib; sourceTree = ""; }; 1F28FB7B22A2B50B00C2CF25 /* NotificationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationViewController.swift; sourceTree = ""; }; 1F28FB7C22A2B50B00C2CF25 /* NotificationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = NotificationViewController.xib; sourceTree = ""; }; 1F28FB8022A2B94200C2CF25 /* LocalizationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationViewController.swift; sourceTree = ""; }; 1F28FB8122A2B94200C2CF25 /* LocalizationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = LocalizationViewController.xib; sourceTree = ""; }; 1F28FB8F22A2C1C800C2CF25 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; 1F28FB9122A2C1C900C2CF25 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; 1F28FB9422A2C22F00C2CF25 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; 1F28FB9622A2C29A00C2CF25 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; 1F28FB9722A2C2AC00C2CF25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 1F28FB9D22A2C4FA00C2CF25 /* UserNotifications.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UserNotifications.framework; path = System/Library/Frameworks/UserNotifications.framework; sourceTree = SDKROOT; }; 1F28FBB522A3F9CC00C2CF25 /* WoodpeckerMacOS.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WoodpeckerMacOS.framework; path = ../WoodpeckerMacOS.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 1F28FB5122A293E700C2CF25 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 1F28FBB622A3F9CC00C2CF25 /* WoodpeckerMacOS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 1F28FB4B22A293E700C2CF25 = { isa = PBXGroup; children = ( 1F28FBB522A3F9CC00C2CF25 /* WoodpeckerMacOS.framework */, 1F28FB5622A293E700C2CF25 /* WoodpeckerMacDemo */, 1F28FB5522A293E700C2CF25 /* Products */, 1F28FB9C22A2C4F900C2CF25 /* Frameworks */, ); sourceTree = ""; }; 1F28FB5522A293E700C2CF25 /* Products */ = { isa = PBXGroup; children = ( 1F28FB5422A293E700C2CF25 /* WoodpeckerMacDemo.app */, ); name = Products; sourceTree = ""; }; 1F28FB5622A293E700C2CF25 /* WoodpeckerMacDemo */ = { isa = PBXGroup; children = ( 1F28FB6522A2AA1B00C2CF25 /* Pages */, 1F28FB5722A293E700C2CF25 /* AppDelegate.swift */, 1F28FB5922A293E900C2CF25 /* Assets.xcassets */, 1F28FB5B22A293E900C2CF25 /* MainMenu.xib */, 1F28FB5E22A293E900C2CF25 /* Info.plist */, 1F28FB9022A2C1C800C2CF25 /* Localizable.strings */, 1F28FB5F22A293E900C2CF25 /* WoodpeckerMacDemo.entitlements */, ); path = WoodpeckerMacDemo; sourceTree = ""; }; 1F28FB6522A2AA1B00C2CF25 /* Pages */ = { isa = PBXGroup; children = ( 1F28FB6622A2AA2000C2CF25 /* Sandbox */, 1F28FB7022A2B2F900C2CF25 /* UserDefaults */, 1F28FB6B22A2B20000C2CF25 /* Network */, 1F28FB7522A2B46700C2CF25 /* Bundle */, 1F28FB7A22A2B4F900C2CF25 /* Notification */, 1F28FB7F22A2B93400C2CF25 /* Localization */, ); path = Pages; sourceTree = ""; }; 1F28FB6622A2AA2000C2CF25 /* Sandbox */ = { isa = PBXGroup; children = ( 1F28FB6722A2ABAE00C2CF25 /* SandboxViewController.swift */, 1F28FB6822A2ABAE00C2CF25 /* SandboxViewController.xib */, ); path = Sandbox; sourceTree = ""; }; 1F28FB6B22A2B20000C2CF25 /* Network */ = { isa = PBXGroup; children = ( 1F28FB6C22A2B21000C2CF25 /* NetworkViewController.swift */, 1F28FB6D22A2B21000C2CF25 /* NetworkViewController.xib */, ); name = Network; sourceTree = ""; }; 1F28FB7022A2B2F900C2CF25 /* UserDefaults */ = { isa = PBXGroup; children = ( 1F28FB7122A2B31F00C2CF25 /* UserDefaultsViewController.swift */, 1F28FB7222A2B31F00C2CF25 /* UserDefaultsViewController.xib */, ); path = UserDefaults; sourceTree = ""; }; 1F28FB7522A2B46700C2CF25 /* Bundle */ = { isa = PBXGroup; children = ( 1F28FB7622A2B47400C2CF25 /* BundleViewController.swift */, 1F28FB7722A2B47400C2CF25 /* BundleViewController.xib */, ); path = Bundle; sourceTree = ""; }; 1F28FB7A22A2B4F900C2CF25 /* Notification */ = { isa = PBXGroup; children = ( 1F28FB7B22A2B50B00C2CF25 /* NotificationViewController.swift */, 1F28FB7C22A2B50B00C2CF25 /* NotificationViewController.xib */, ); path = Notification; sourceTree = ""; }; 1F28FB7F22A2B93400C2CF25 /* Localization */ = { isa = PBXGroup; children = ( 1F28FB8022A2B94200C2CF25 /* LocalizationViewController.swift */, 1F28FB8122A2B94200C2CF25 /* LocalizationViewController.xib */, ); path = Localization; sourceTree = ""; }; 1F28FB9C22A2C4F900C2CF25 /* Frameworks */ = { isa = PBXGroup; children = ( 1F28FB9D22A2C4FA00C2CF25 /* UserNotifications.framework */, ); name = Frameworks; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ 1F28FB5322A293E700C2CF25 /* WoodpeckerMacDemo */ = { isa = PBXNativeTarget; buildConfigurationList = 1F28FB6222A293E900C2CF25 /* Build configuration list for PBXNativeTarget "WoodpeckerMacDemo" */; buildPhases = ( 1F28FB5022A293E700C2CF25 /* Sources */, 1F28FB5122A293E700C2CF25 /* Frameworks */, 1F28FB5222A293E700C2CF25 /* Resources */, 1F28FBB422A3F99700C2CF25 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( ); name = WoodpeckerMacDemo; productName = WoodpeckerMacDemo; productReference = 1F28FB5422A293E700C2CF25 /* WoodpeckerMacDemo.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 1F28FB4C22A293E700C2CF25 /* Project object */ = { isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1010; LastUpgradeCheck = 1010; ORGANIZATIONNAME = "LIFE BETTER"; TargetAttributes = { 1F28FB5322A293E700C2CF25 = { CreatedOnToolsVersion = 10.1; SystemCapabilities = { com.apple.Push = { enabled = 0; }; com.apple.Sandbox = { enabled = 1; }; }; }; }; }; buildConfigurationList = 1F28FB4F22A293E700C2CF25 /* Build configuration list for PBXProject "WoodpeckerMacDemo" */; compatibilityVersion = "Xcode 9.3"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, "zh-Hans", fr, ); mainGroup = 1F28FB4B22A293E700C2CF25; productRefGroup = 1F28FB5522A293E700C2CF25 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 1F28FB5322A293E700C2CF25 /* WoodpeckerMacDemo */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 1F28FB5222A293E700C2CF25 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 1F28FB6A22A2ABAE00C2CF25 /* SandboxViewController.xib in Resources */, 1F28FB5A22A293E900C2CF25 /* Assets.xcassets in Resources */, 1F28FB7422A2B31F00C2CF25 /* UserDefaultsViewController.xib in Resources */, 1F28FB5D22A293E900C2CF25 /* MainMenu.xib in Resources */, 1F28FB8E22A2C1C800C2CF25 /* Localizable.strings in Resources */, 1F28FB7922A2B47400C2CF25 /* BundleViewController.xib in Resources */, 1F28FB6F22A2B21000C2CF25 /* NetworkViewController.xib in Resources */, 1F28FB7E22A2B50B00C2CF25 /* NotificationViewController.xib in Resources */, 1F28FB8322A2B94200C2CF25 /* LocalizationViewController.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 1F28FB5022A293E700C2CF25 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 1F28FB6922A2ABAE00C2CF25 /* SandboxViewController.swift in Sources */, 1F28FB7822A2B47400C2CF25 /* BundleViewController.swift in Sources */, 1F28FB7D22A2B50B00C2CF25 /* NotificationViewController.swift in Sources */, 1F28FB6E22A2B21000C2CF25 /* NetworkViewController.swift in Sources */, 1F28FB7322A2B31F00C2CF25 /* UserDefaultsViewController.swift in Sources */, 1F28FB8222A2B94200C2CF25 /* LocalizationViewController.swift in Sources */, 1F28FB5822A293E700C2CF25 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ 1F28FB5B22A293E900C2CF25 /* MainMenu.xib */ = { isa = PBXVariantGroup; children = ( 1F28FB9622A2C29A00C2CF25 /* en */, 1F28FB9722A2C2AC00C2CF25 /* Base */, ); name = MainMenu.xib; sourceTree = ""; }; 1F28FB9022A2C1C800C2CF25 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( 1F28FB8F22A2C1C800C2CF25 /* en */, 1F28FB9122A2C1C900C2CF25 /* zh-Hans */, 1F28FB9422A2C22F00C2CF25 /* fr */, ); name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ 1F28FB6022A293E900C2CF25 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; name = Debug; }; 1F28FB6122A293E900C2CF25 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "Mac Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; MACOSX_DEPLOYMENT_TARGET = 10.14; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = macosx; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-O"; }; name = Release; }; 1F28FB6322A293E900C2CF25 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = WoodpeckerMacDemo/WoodpeckerMacDemo.entitlements; CODE_SIGN_IDENTITY = "Mac Developer"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 8HG49Q463F; FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../"; INFOPLIST_FILE = WoodpeckerMacDemo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; PRODUCT_BUNDLE_IDENTIFIER = lifebetter.woodpecker.macdemo; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 4.2; }; name = Debug; }; 1F28FB6422A293E900C2CF25 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = WoodpeckerMacDemo/WoodpeckerMacDemo.entitlements; CODE_SIGN_IDENTITY = "Mac Developer"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEVELOPMENT_TEAM = 8HG49Q463F; FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/../"; INFOPLIST_FILE = WoodpeckerMacDemo/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/../Frameworks", ); MACOSX_DEPLOYMENT_TARGET = 10.14; PRODUCT_BUNDLE_IDENTIFIER = lifebetter.woodpecker.macdemo; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_VERSION = 4.2; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 1F28FB4F22A293E700C2CF25 /* Build configuration list for PBXProject "WoodpeckerMacDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 1F28FB6022A293E900C2CF25 /* Debug */, 1F28FB6122A293E900C2CF25 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 1F28FB6222A293E900C2CF25 /* Build configuration list for PBXNativeTarget "WoodpeckerMacDemo" */ = { isa = XCConfigurationList; buildConfigurations = ( 1F28FB6322A293E900C2CF25 /* Debug */, 1F28FB6422A293E900C2CF25 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 1F28FB4C22A293E700C2CF25 /* Project object */; } ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata ================================================ ================================================ FILE: WoodpeckerMacDemo/WoodpeckerMacDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist ================================================ IDEDidComputeMac32BitWarning ================================================ FILE: WoodpeckerMacOS-Carthage.json ================================================ { "1.2.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.2/WoodpeckerMacOS.framework.zip", "1.2.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.3/WoodpeckerMacOS.framework.zip" } ================================================ FILE: WoodpeckerMacOS.framework/Versions/A/Headers/WoodpeckerMacOS.h ================================================ // // WoodpeckerMacOS.h // WoodpeckerMacOS // // Created by 张小刚 on 2019/5/25. // Copyright © 2019 lifebetter. All rights reserved. // #import //! Project version number for WoodpeckerMacOS. FOUNDATION_EXPORT double WoodpeckerMacOSVersionNumber; //! Project version string for WoodpeckerMacOS. FOUNDATION_EXPORT const unsigned char WoodpeckerMacOSVersionString[]; // In this header, you should import all the public headers of your framework using statements like #import ================================================ FILE: WoodpeckerMacOS.framework/Versions/A/Modules/module.modulemap ================================================ framework module WoodpeckerMacOS { umbrella header "WoodpeckerMacOS.h" export * module * { export * } } ================================================ FILE: WoodpeckerMacOS.framework/Versions/A/Resources/Info.plist ================================================ BuildMachineOSBuild 18G95 CFBundleDevelopmentRegion en CFBundleExecutable WoodpeckerMacOS CFBundleIdentifier lifebetter.WoodpeckerMacOS CFBundleInfoDictionaryVersion 6.0 CFBundleName WoodpeckerMacOS CFBundlePackageType FMWK CFBundleShortVersionString 1.2.3 CFBundleSupportedPlatforms MacOSX CFBundleVersion 3 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild 10E125 DTPlatformVersion GM DTSDKBuild 18E219 DTSDKName macosx10.14 DTXcode 1020 DTXcodeBuild 10E125 NSHumanReadableCopyright Copyright © 2019 lifebetter. All rights reserved. ================================================ FILE: WoodpeckerMacOS.framework/Versions/A/_CodeSignature/CodeResources ================================================ files Resources/ADHMacConnectViewController.nib xv4hw5K05XweFL8yo4SvhRe6iuA= Resources/ADHMacRemoteServiceCell.nib PwT+Vf/3uiEQ07kEoB+bxctC3ig= Resources/Assets.car drF2c1X3KZ8G8rfjj/ZCG8dtmsA= Resources/Info.plist h8fXUtx7BucUT2L+BZd0cDra6z0= files2 Headers/WoodpeckerMacOS.h hash IJgaVpTyl/wSjxnxiMzm1KAAe/0= hash2 0aVl9RUwy9K0vZYxWDDsjJn+YoLAOseRV1Pqrp+cw8Q= Modules/module.modulemap hash Vfrh7l2Yqto0AXGSDnRurzVWQQI= hash2 VXf9mIvGL2chs9uSGGZyBkYt4C5rHITxOg5NhaWDWr0= Resources/ADHMacConnectViewController.nib hash xv4hw5K05XweFL8yo4SvhRe6iuA= hash2 BBy+7WaykV/J1lSxuCpIjxy/OxR+kpM860OBLraHnc4= Resources/ADHMacRemoteServiceCell.nib hash PwT+Vf/3uiEQ07kEoB+bxctC3ig= hash2 9nPygjKQXftdZ53UuKfToGJUkHmdxdQQK3k9yIITKDs= Resources/Assets.car hash drF2c1X3KZ8G8rfjj/ZCG8dtmsA= hash2 G+QlMVdOTbGAl4WNOQMcKRSdeLnb8YNHNhHEVcFyFDM= Resources/Info.plist hash h8fXUtx7BucUT2L+BZd0cDra6z0= hash2 4dyjAzSCCcyBX0c+lIL+HfyNWNm3H7ugEdSFjBMqlFE= rules ^Resources/ ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^version.plist$ rules2 .*\.dSYM($|/) weight 11 ^(.*/)?\.DS_Store$ omit weight 2000 ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ nested weight 10 ^.* ^Info\.plist$ omit weight 20 ^PkgInfo$ omit weight 20 ^Resources/ weight 20 ^Resources/.*\.lproj/ optional weight 1000 ^Resources/.*\.lproj/locversion.plist$ omit weight 1100 ^Resources/Base\.lproj/ weight 1010 ^[^/]+$ nested weight 10 ^embedded\.provisionprofile$ weight 20 ^version\.plist$ weight 20 ================================================ FILE: WoodpeckerMacOS.podspec ================================================ Pod::Spec.new do |s| s.name = "WoodpeckerMacOS" s.version = "1.2.3" s.summary = "MacOS framework for Woodpekcer" s.description = "Woodpecker is a handy, powerful Mac app for iOS, MacOS developer, it helps you view, modify sandbox files, monitor network, run javascript in WebView, and more..." s.homepage = "http://www.woodpeck.cn" s.authors = { "Woodpecker" => "woodperckerapp@163.com" } s.platform = :osx, "10.11" s.source = { :git => "https://github.com/appwoodpecker/woodpecker-ios.git", :tag => "#{s.version}" } s.vendored_frameworks = "WoodpeckerMacOS.framework" s.license = { :type => 'Copyright', :file => 'LICENSE' } end