├── .gitignore ├── LICENSE ├── Package.swift ├── README.md ├── WoodPeckerDemo ├── WoodPeckerDemo.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── WoodPeckerDemo │ ├── AppDelegate.h │ ├── AppDelegate.m │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── 120.png │ │ ├── 152.png │ │ ├── 167.png │ │ ├── 180.png │ │ ├── 76.png │ │ └── 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_device.png │ ├── tool_io.imageset │ │ ├── Contents.json │ │ └── tool_io.png │ ├── tool_network.imageset │ │ ├── Contents.json │ │ └── tool_network.png │ ├── tool_notification.imageset │ │ ├── Contents.json │ │ └── tool_notification.png │ ├── tool_sandbox.imageset │ │ ├── Contents.json │ │ └── tool_sandbox.png │ ├── tool_userdefaults.imageset │ │ ├── Contents.json │ │ └── tool_userdefaults.png │ └── tool_webconsole.imageset │ │ ├── Contents.json │ │ └── tool_webconsole.png │ └── main.m ├── WoodPeckerSwiftDemo ├── WoodPeckerSwiftDemo.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── WoodPeckerSwiftDemo │ ├── AppDelegate.swift │ ├── Assets.xcassets │ └── AppIcon.appiconset │ │ ├── 120.png │ │ ├── 152.png │ │ ├── 167.png │ │ ├── 180.png │ │ ├── 76.png │ │ └── 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_io.png │ ├── tool_network.imageset │ ├── Contents.json │ └── tool_network.png │ ├── tool_sandbox.imageset │ ├── Contents.json │ └── tool_sandbox.png │ └── tool_webconsole.imageset │ ├── Contents.json │ └── tool_webconsole.png ├── 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.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── WoodpeckerMacDemo │ ├── AppDelegate.swift │ ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ ├── Contents.json │ ├── tool_bundle.imageset │ │ ├── Contents.json │ │ └── tool_bundle.png │ ├── tool_localization.imageset │ │ ├── Contents.json │ │ └── tool_localization.png │ ├── tool_network.imageset │ │ ├── Contents.json │ │ └── tool_network.png │ ├── tool_notification.imageset │ │ ├── Contents.json │ │ └── tool_notification.png │ ├── tool_sandbox.imageset │ │ ├── Contents.json │ │ └── tool_sandbox.png │ └── tool_userdefaults.imageset │ │ ├── Contents.json │ │ └── tool_userdefaults.png │ ├── 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 ├── WoodpeckerMacOS-Carthage.json ├── WoodpeckerMacOS.framework ├── Headers ├── Modules ├── Resources ├── Versions │ ├── A │ │ ├── Headers │ │ │ └── WoodpeckerMacOS.h │ │ ├── Modules │ │ │ └── module.modulemap │ │ ├── Resources │ │ │ ├── ADHMacConnectViewController.nib │ │ │ ├── ADHMacRemoteServiceCell.nib │ │ │ ├── Assets.car │ │ │ └── Info.plist │ │ ├── WoodpeckerMacOS │ │ └── _CodeSignature │ │ │ └── CodeResources │ └── Current └── WoodpeckerMacOS └── WoodpeckerMacOS.podspec /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | # CocoaPods 32 | # 33 | # We recommend against adding the Pods directory to your .gitignore. However 34 | # you should judge for yourself, the pros and cons are mentioned at: 35 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 36 | # 37 | # Pods/ 38 | 39 | # Carthage 40 | # 41 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 42 | # Carthage/Checkouts 43 | 44 | Carthage/Build 45 | 46 | # fastlane 47 | # 48 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 49 | # screenshots whenever they are needed. 50 | # For more information about the recommended setup visit: 51 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 52 | 53 | fastlane/report.xml 54 | fastlane/Preview.html 55 | fastlane/screenshots 56 | fastlane/test_output 57 | 58 | # Code Injection 59 | # 60 | # After new code Injection tools there's a generated folder /iOSInjectionProject 61 | # https://github.com/johnno1962/injectionforxcode 62 | 63 | iOSInjectionProject/ 64 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/LICENSE -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.3 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "WoodpeckeriOS", 8 | 9 | platforms: [.iOS(SupportedPlatform.IOSVersion.v11)], 10 | 11 | products: [ 12 | // Products define the executables and libraries a package produces, and make them visible to other packages. 13 | .library( 14 | name: "WoodpeckeriOS", 15 | targets: ["WoodPeckeriOS"]), 16 | ], 17 | 18 | dependencies: [ 19 | // Dependencies declare other packages that this package depends on. 20 | // .package(url: /* package url */, from: "1.0.0"), 21 | 22 | ], 23 | targets: [ 24 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 25 | // Targets can depend on other targets in this package, and on products in packages this package depends on. 26 | .target( 27 | name: "WoodpeckeriOS", 28 | dependencies: []), 29 | .testTarget( 30 | name: "WoodpeckeriOSTests", 31 | dependencies: ["WoodpeckeriOS"]), 32 | 33 | .binaryTarget( 34 | name: "WoodPeckeriOS", 35 | path: "WoodPeckeriOS.xcframework"), 36 | ] 37 | ) 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ![logo](http://www.woodpeck.cn/assets/img/logo.png) 3 | 4 | Hi! this is a demo app for **Woodpecker** ([open source](https://github.com/appwoodpecker/woodpecker-client)) 5 | 6 | **Woodpecker** is a tool for iOS, MacOS developer, it provides some handy and productive tools which Xcode doesn't. 7 | 8 | It can helps you: 9 | 10 | - view, modify sandbox files; 11 | - view UserDefaults items; 12 | - view controller hierarchy; 13 | - debug webview online; 14 | - monitor network; 15 | - more... 16 | 17 | Free download at [App Store](https://itunes.apple.com/cn/app/woodpecker/id1333548463?l=en&mt=12) 18 | and talk with us at [Telegram](https://t.me/appwoodpecker) or [QQ(303015262) ](https://jq.qq.com/?_wv=1027&k=QXuhxDs0) 19 | 20 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | 16 | @end 17 | 18 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | #import "IndexViewController.h" 11 | @import UserNotifications; 12 | 13 | @interface AppDelegate () 14 | 15 | @end 16 | 17 | @implementation AppDelegate 18 | 19 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 20 | UIWindow * window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 21 | window.backgroundColor = [UIColor whiteColor]; 22 | IndexViewController * indexVC = [[IndexViewController alloc] init]; 23 | UINavigationController * nvc = [[UINavigationController alloc] initWithRootViewController:indexVC]; 24 | self.window = window; 25 | self.window.rootViewController = nvc; 26 | [self.window makeKeyAndVisible]; 27 | [self setupNotification]; 28 | return YES; 29 | } 30 | 31 | - (void)setupNotification { 32 | if (@available(iOS 10.0, *)) { 33 | UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter]; 34 | notiCenter.delegate = self; 35 | UNNotificationAction *openAction = [UNNotificationAction actionWithIdentifier:UNNotificationDefaultActionIdentifier title:@"Okay" options:0]; 36 | UNNotificationAction *customAction = [UNNotificationAction actionWithIdentifier:@"custum action" title:@"Do Something" options:0]; 37 | UNNotificationCategory *category = [UNNotificationCategory categoryWithIdentifier:@"actionCategory" actions:@[openAction,customAction] intentIdentifiers:@[] options:0]; 38 | NSSet *set = [NSSet setWithObjects:category, nil]; 39 | [notiCenter setNotificationCategories:set]; 40 | } 41 | } 42 | 43 | /** 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. 44 | */ 45 | - (void)userNotificationCenter:(UNUserNotificationCenter *)center willPresentNotification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions options))completionHandler 46 | API_AVAILABLE(ios(10.0)){ 47 | NSLog(@"will present notification"); 48 | completionHandler(UNNotificationPresentationOptionSound|UNNotificationPresentationOptionAlert|UNNotificationPresentationOptionBadge); 49 | } 50 | 51 | /** 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:. 52 | */ 53 | - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void(^)(void))completionHandler 54 | API_AVAILABLE(ios(10.0)){ 55 | NSLog(@"did receive notification response"); 56 | completionHandler(); 57 | } 58 | 59 | 60 | - (void)applicationWillResignActive:(UIApplication *)application { 61 | // 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. 62 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 63 | } 64 | 65 | 66 | - (void)applicationDidEnterBackground:(UIApplication *)application { 67 | // 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. 68 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 69 | } 70 | 71 | 72 | - (void)applicationWillEnterForeground:(UIApplication *)application { 73 | // 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. 74 | } 75 | 76 | 77 | - (void)applicationDidBecomeActive:(UIApplication *)application { 78 | // 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. 79 | } 80 | 81 | 82 | - (void)applicationWillTerminate:(UIApplication *)application { 83 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 84 | } 85 | 86 | 87 | @end 88 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "filename" : "120.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "180.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "idiom" : "ipad", 47 | "size" : "20x20", 48 | "scale" : "1x" 49 | }, 50 | { 51 | "idiom" : "ipad", 52 | "size" : "20x20", 53 | "scale" : "2x" 54 | }, 55 | { 56 | "idiom" : "ipad", 57 | "size" : "29x29", 58 | "scale" : "1x" 59 | }, 60 | { 61 | "idiom" : "ipad", 62 | "size" : "29x29", 63 | "scale" : "2x" 64 | }, 65 | { 66 | "idiom" : "ipad", 67 | "size" : "40x40", 68 | "scale" : "1x" 69 | }, 70 | { 71 | "idiom" : "ipad", 72 | "size" : "40x40", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "76x76", 77 | "idiom" : "ipad", 78 | "filename" : "76.png", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "size" : "76x76", 83 | "idiom" : "ipad", 84 | "filename" : "152.png", 85 | "scale" : "2x" 86 | }, 87 | { 88 | "size" : "83.5x83.5", 89 | "idiom" : "ipad", 90 | "filename" : "167.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "idiom" : "ios-marketing", 95 | "size" : "1024x1024", 96 | "scale" : "1x" 97 | } 98 | ], 99 | "info" : { 100 | "version" : 1, 101 | "author" : "xcode" 102 | }, 103 | "properties" : { 104 | "pre-rendered" : true 105 | } 106 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | NSBonjourServices 29 | 30 | _adhp._tcp 31 | 32 | NSLocalNetworkUsageDescription 33 | Debug my app 34 | UILaunchStoryboardName 35 | LaunchScreen 36 | UIRequiredDeviceCapabilities 37 | 38 | armv7 39 | 40 | UISupportedInterfaceOrientations 41 | 42 | UIInterfaceOrientationPortrait 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | UISupportedInterfaceOrientations~ipad 47 | 48 | UIInterfaceOrientationPortrait 49 | UIInterfaceOrientationPortraitUpsideDown 50 | UIInterfaceOrientationLandscapeLeft 51 | UIInterfaceOrientationLandscapeRight 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ConsoleViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/6/9. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ConsoleViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Console/ConsoleViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ConsoleViewController.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/6/9. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "ConsoleViewController.h" 10 | 11 | @interface ConsoleViewController () 12 | 13 | @property (nonatomic, strong) NSTimer *timer; 14 | @property (nonatomic, assign) NSInteger count; 15 | @property (weak, nonatomic) IBOutlet UIButton *countButton; 16 | 17 | @end 18 | 19 | @implementation ConsoleViewController 20 | 21 | - (void)viewDidLoad { 22 | [super viewDidLoad]; 23 | self.count = 0; 24 | [self updateTimerCountButtonUI]; 25 | } 26 | 27 | - (IBAction)logButtonPressed:(id)sender { 28 | [self logCount]; 29 | NSLog(@"Woodpecker home page: http://www.woodpeck.cn, \nContact me: woodpeckerapp@163.com"); 30 | } 31 | 32 | - (IBAction)counterLogButtonPressed:(id)sender { 33 | if(!self.timer) { 34 | self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(logCount) userInfo:nil repeats:YES]; 35 | }else { 36 | [self.timer invalidate]; 37 | self.timer = nil; 38 | } 39 | [self updateTimerCountButtonUI]; 40 | } 41 | 42 | - (void)updateTimerCountButtonUI { 43 | if(self.timer) { 44 | [self.countButton setTitle:@"Stop" forState:UIControlStateNormal]; 45 | }else { 46 | [self.countButton setTitle:@"Start Count" forState:UIControlStateNormal]; 47 | } 48 | } 49 | 50 | - (void)logCount { 51 | NSLog(@"count: %zd",self.count++); 52 | } 53 | 54 | - (void)didReceiveMemoryWarning { 55 | [super didReceiveMemoryWarning]; 56 | } 57 | 58 | @end 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ControllerHierarchyViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/5/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ControllerHierarchyViewController : UIViewController 12 | 13 | @property (nonatomic, assign) NSInteger pageIndex; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ControllerHierarchyViewController.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/5/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "ControllerHierarchyViewController.h" 10 | 11 | @interface ControllerHierarchyViewController () 12 | 13 | @end 14 | 15 | @implementation ControllerHierarchyViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | self.navigationItem.title = [NSString stringWithFormat:@"Page %zd",self.pageIndex]; 20 | } 21 | 22 | - (IBAction)nextButtonPressed:(id)sender { 23 | ControllerHierarchyViewController *nextVC = [[ControllerHierarchyViewController alloc] init]; 24 | nextVC.pageIndex = self.pageIndex+1; 25 | [self.navigationController pushViewController:nextVC animated:YES]; 26 | } 27 | 28 | - (void)didReceiveMemoryWarning { 29 | [super didReceiveMemoryWarning]; 30 | // Dispose of any resources that can be recreated. 31 | } 32 | 33 | 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Controller/ControllerHierarchyViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 40 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // DeviceInfoViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/3/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface DeviceInfoViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // DeviceInfoViewController.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/3/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "DeviceInfoViewController.h" 10 | 11 | @interface DeviceInfoViewController () 12 | 13 | @end 14 | 15 | @implementation DeviceInfoViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | } 20 | 21 | - (IBAction)actionButton:(id)sender { 22 | NSString * message = @"click me on Mac or iPhone ?"; 23 | UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Alert" message:message preferredStyle:UIAlertControllerStyleAlert]; 24 | UIAlertAction * cancel = [UIAlertAction actionWithTitle:@"iPhone" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { 25 | self.view.backgroundColor = [UIColor grayColor]; 26 | }]; 27 | UIAlertAction * confirm = [UIAlertAction actionWithTitle:@"Mac" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 28 | float red = arc4random() % 255 / 255.0f; 29 | float green = arc4random() % 255 / 255.0f; 30 | float blue = arc4random() % 255 / 255.0f; 31 | self.view.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0]; 32 | }]; 33 | [alert addAction:cancel]; 34 | [alert addAction:confirm]; 35 | [self presentViewController:alert animated:YES completion:nil]; 36 | } 37 | 38 | - (void)didReceiveMemoryWarning { 39 | [super didReceiveMemoryWarning]; 40 | } 41 | 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Device/DeviceInfoViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 42 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/IO/EchoService.h: -------------------------------------------------------------------------------- 1 | // 2 | // EchoService.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | show how to create a custom service 13 | 14 | http://www.woodpeck.cn/plugin.html 15 | */ 16 | @interface EchoService : ADHService 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/IO/EchoService.m: -------------------------------------------------------------------------------- 1 | // 2 | // EchoService.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "EchoService.h" 10 | 11 | @implementation EchoService 12 | 13 | + (void)load { 14 | [[ADHOrganizer sharedOrganizer] registerService:[EchoService class]]; 15 | } 16 | 17 | + (NSString *)serviceName { 18 | return @"adh.EchoService"; 19 | } 20 | 21 | + (NSDictionary *)actionList { 22 | return @{ 23 | @"echo" : NSStringFromSelector(@selector(onRequestEcho:)), 24 | }; 25 | } 26 | 27 | - (void)onRequestEcho: (ADHRequest *)request { 28 | NSDictionary * data = @{ 29 | @"response" : @"hi, I`m App, What`s up", 30 | }; 31 | [request finishWithBody:data]; 32 | } 33 | 34 | @end 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // IOViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface IOViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // IOViewController.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "IOViewController.h" 10 | #import "WoodPeckeriOS/WoodPeckeriOS.h" 11 | #import "EchoService.h" 12 | 13 | @interface IOViewController () 14 | 15 | @end 16 | 17 | @implementation IOViewController 18 | 19 | - (void)viewDidLoad { 20 | [super viewDidLoad]; 21 | } 22 | 23 | - (IBAction)logButtonPressed:(id)sender { 24 | 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"; 25 | // log to mac 26 | [[ADHLogger sharedLogger] logText:text]; 27 | } 28 | 29 | - (void)didReceiveMemoryWarning { 30 | [super didReceiveMemoryWarning]; 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/IO/IOViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 41 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NetworkViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkViewController.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "NetworkViewController.h" 10 | 11 | @interface NetworkViewController () 12 | 13 | @end 14 | 15 | @implementation NetworkViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | } 20 | 21 | - (IBAction)startRequest:(id)sender { 22 | //url connection 23 | NSURL * requestURL = [NSURL URLWithString:@"https://api.github.com"]; 24 | NSURLRequest * request = [NSURLRequest requestWithURL:requestURL]; 25 | NSURLConnection * connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 26 | [connection start]; 27 | 28 | //url session 29 | [self sessionRequest]; 30 | } 31 | 32 | - (void)sessionRequest 33 | { 34 | // NSURLSession 35 | NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 36 | config.timeoutIntervalForRequest = 10.0; 37 | NSURLSession *mySession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]]; 38 | NSString * url = @"https://api.github.com/emojis"; 39 | NSURL * requestURL = [NSURL URLWithString:url]; 40 | NSMutableURLRequest * uploadRequest = [NSMutableURLRequest requestWithURL:requestURL]; 41 | uploadRequest.HTTPMethod = @"POST"; 42 | NSString * formText = [NSString stringWithFormat:@"q=%.f",[[NSDate date] timeIntervalSince1970]]; 43 | NSData * data = [formText dataUsingEncoding:NSUTF8StringEncoding]; 44 | NSURLSessionTask * task = [mySession uploadTaskWithRequest:uploadRequest fromData:data completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 45 | 46 | }]; 47 | [task resume]; 48 | } 49 | 50 | - (nullable NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(nullable NSURLResponse *)response 51 | { 52 | return request; 53 | } 54 | 55 | - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 56 | { 57 | 58 | } 59 | 60 | - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 61 | { 62 | 63 | } 64 | 65 | - (void)connection:(NSURLConnection *)connection 66 | didSendBodyData:(NSInteger)bytesWritten 67 | totalBytesWritten:(NSInteger)totalBytesWritten 68 | totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 69 | { 70 | 71 | } 72 | 73 | - (void)connectionDidFinishLoading:(NSURLConnection *)connection 74 | { 75 | 76 | } 77 | 78 | - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler 79 | { 80 | completionHandler(NSURLSessionResponseAllow); 81 | } 82 | 83 | - (void)didReceiveMemoryWarning { 84 | [super didReceiveMemoryWarning]; 85 | // Dispose of any resources that can be recreated. 86 | } 87 | 88 | 89 | @end 90 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Network/NetworkViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 42 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // NotificationViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/6/4. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface NotificationViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // NotificationViewController.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/6/4. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "NotificationViewController.h" 10 | @import UserNotifications; 11 | 12 | @interface NotificationViewController () 13 | 14 | @end 15 | 16 | @implementation NotificationViewController 17 | 18 | - (void)viewDidLoad { 19 | [super viewDidLoad]; 20 | } 21 | 22 | - (IBAction)fireButtonPressed:(id)sender { 23 | if (@available(iOS 10.0, *)) { 24 | UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter]; 25 | [notiCenter requestAuthorizationWithOptions:(UNAuthorizationOptionAlert|UNAuthorizationOptionBadge|UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) { 26 | if(granted){ 27 | UNUserNotificationCenter * notiCenter = [UNUserNotificationCenter currentNotificationCenter]; 28 | NSString * identifier = [NSString stringWithFormat:@"%d",arc4random()]; 29 | NSString * requestIdentifier = [NSString stringWithFormat:@"request identifier%@",identifier]; 30 | UNMutableNotificationContent * content = [[UNMutableNotificationContent alloc] init]; 31 | content.badge = [NSNumber numberWithInteger:arc4random()%10]; 32 | content.body = [NSString stringWithFormat:@"Thanks for using woodpecker %@",identifier]; 33 | content.title = [NSString stringWithFormat:@"This is title %@",identifier]; 34 | content.subtitle = [NSString stringWithFormat:@"This is subtitle %@",identifier]; 35 | content.userInfo = @{ 36 | @"identifier" : identifier, 37 | }; 38 | content.categoryIdentifier = @"actionCategory"; 39 | UNTimeIntervalNotificationTrigger * trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:3 repeats:NO]; 40 | UNNotificationRequest * request = [UNNotificationRequest requestWithIdentifier:requestIdentifier content:content trigger:trigger]; 41 | [notiCenter addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) { 42 | if(error){ 43 | NSLog(@"add local notification error: %@",error); 44 | }else{ 45 | NSLog(@"add local notification success"); 46 | } 47 | }]; 48 | }else{ 49 | NSLog(@"not granted. error: %@",error); 50 | } 51 | }]; 52 | } else { 53 | NSString *message = @"Sorry, this tool only support iOS 10+"; 54 | UIAlertController * alert = [UIAlertController alertControllerWithTitle:@"Alert" message:message preferredStyle:UIAlertControllerStyleAlert]; 55 | UIAlertAction * confirm = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil]; 56 | [alert addAction:confirm]; 57 | [self presentViewController:alert animated:YES completion:nil]; 58 | } 59 | } 60 | 61 | 62 | - (void)didReceiveMemoryWarning { 63 | [super didReceiveMemoryWarning]; 64 | } 65 | 66 | @end 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Notification/NotificationViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 31 | 38 | 39 | 40 | 41 | 42 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // SandBoxViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface SandBoxViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // SandBoxViewController.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "SandBoxViewController.h" 10 | 11 | @interface SandBoxViewController () 12 | 13 | @end 14 | 15 | @implementation SandBoxViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | } 20 | 21 | - (IBAction)addFileButtonPressed:(id)sender { 22 | NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; 23 | [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 24 | NSDate * date = [NSDate date]; 25 | NSString * text = [formatter stringFromDate:date]; 26 | //file name 27 | [formatter setDateFormat:@"HH-mm-ss"]; 28 | NSString * fileName = [NSString stringWithFormat:@"%@.txt",[formatter stringFromDate:date]]; 29 | NSString * documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; 30 | NSString * filePath = [documentPath stringByAppendingPathComponent:fileName]; 31 | NSURL * fileURL = [NSURL fileURLWithPath:filePath]; 32 | NSError * error = nil; 33 | [text writeToURL:fileURL atomically:YES encoding:NSUTF8StringEncoding error:&error]; 34 | } 35 | 36 | - (void)didReceiveMemoryWarning { 37 | [super didReceiveMemoryWarning]; 38 | 39 | } 40 | 41 | 42 | @end 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/Sandbox/SandBoxViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 41 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // UserDefaultsViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/3/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface UserDefaultsViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // UserDefaultsViewController.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/3/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import "UserDefaultsViewController.h" 10 | 11 | @interface UserDefaultsViewController () 12 | 13 | @end 14 | 15 | @implementation UserDefaultsViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | } 20 | 21 | - (IBAction)addButtonPressed:(id)sender { 22 | NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults]; 23 | NSString * key = [NSString stringWithFormat:@"key%d",arc4random()]; 24 | NSString * value = [NSString stringWithFormat:@"value%d",arc4random()]; 25 | [userDefaults setObject:value forKey:key]; 26 | [userDefaults synchronize]; 27 | } 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Modules/UserDefaults/UserDefaultsViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 40 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // IndexViewController.h 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface IndexViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/Structure/IndexViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_device.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_device.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_device.imageset/tool_device.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_device.imageset/tool_device.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_io.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_io.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_io.imageset/tool_io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_io.imageset/tool_io.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_network.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_network.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_network.imageset/tool_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_network.imageset/tool_network.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_notification.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_notification.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_notification.imageset/tool_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_notification.imageset/tool_notification.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_sandbox.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_sandbox.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_sandbox.imageset/tool_sandbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_sandbox.imageset/tool_sandbox.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_userdefaults.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_userdefaults.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_userdefaults.imageset/tool_userdefaults.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_userdefaults.imageset/tool_userdefaults.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_webconsole.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_webconsole.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_webconsole.imageset/tool_webconsole.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerDemo/WoodPeckerDemo/images.xcassets/tool_webconsole.imageset/tool_webconsole.png -------------------------------------------------------------------------------- /WoodPeckerDemo/WoodPeckerDemo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // WoodPeckerDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/17. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // WoodPeckerSwiftDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/20. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import WoodPeckeriOS 11 | 12 | @UIApplicationMain 13 | class AppDelegate: UIResponder, UIApplicationDelegate { 14 | 15 | var window: UIWindow? 16 | 17 | 18 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 19 | window = UIWindow(frame: UIScreen.main.bounds) 20 | window!.backgroundColor = UIColor.white 21 | let vc = IndexViewController() 22 | let nvc = UINavigationController(rootViewController: vc) 23 | window!.rootViewController = nvc; 24 | window!.makeKeyAndVisible() 25 | return true 26 | 27 | } 28 | 29 | 30 | 31 | 32 | func caculate(A:Double,B:Double) -> Double { 33 | return A + B; 34 | } 35 | 36 | 37 | 38 | func applicationWillResignActive(_ application: UIApplication) { 39 | // 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. 40 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 41 | } 42 | 43 | func applicationDidEnterBackground(_ application: UIApplication) { 44 | // 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. 45 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 46 | } 47 | 48 | func applicationWillEnterForeground(_ application: UIApplication) { 49 | // 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. 50 | } 51 | 52 | func applicationDidBecomeActive(_ application: UIApplication) { 53 | // 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. 54 | } 55 | 56 | func applicationWillTerminate(_ application: UIApplication) { 57 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 58 | } 59 | 60 | 61 | } 62 | 63 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/152.png -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/167.png -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/76.png -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "60x60", 35 | "idiom" : "iphone", 36 | "filename" : "120.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "60x60", 41 | "idiom" : "iphone", 42 | "filename" : "180.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "idiom" : "ipad", 47 | "size" : "20x20", 48 | "scale" : "1x" 49 | }, 50 | { 51 | "idiom" : "ipad", 52 | "size" : "20x20", 53 | "scale" : "2x" 54 | }, 55 | { 56 | "idiom" : "ipad", 57 | "size" : "29x29", 58 | "scale" : "1x" 59 | }, 60 | { 61 | "idiom" : "ipad", 62 | "size" : "29x29", 63 | "scale" : "2x" 64 | }, 65 | { 66 | "idiom" : "ipad", 67 | "size" : "40x40", 68 | "scale" : "1x" 69 | }, 70 | { 71 | "idiom" : "ipad", 72 | "size" : "40x40", 73 | "scale" : "2x" 74 | }, 75 | { 76 | "size" : "76x76", 77 | "idiom" : "ipad", 78 | "filename" : "76.png", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "size" : "76x76", 83 | "idiom" : "ipad", 84 | "filename" : "152.png", 85 | "scale" : "2x" 86 | }, 87 | { 88 | "size" : "83.5x83.5", 89 | "idiom" : "ipad", 90 | "filename" : "167.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "idiom" : "ios-marketing", 95 | "size" : "1024x1024", 96 | "scale" : "1x" 97 | } 98 | ], 99 | "info" : { 100 | "version" : 1, 101 | "author" : "xcode" 102 | }, 103 | "properties" : { 104 | "pre-rendered" : true 105 | } 106 | } -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.2.1 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | NSAppTransportSecurity 24 | 25 | NSAllowsArbitraryLoads 26 | 27 | 28 | UILaunchStoryboardName 29 | LaunchScreen 30 | UIRequiredDeviceCapabilities 31 | 32 | armv7 33 | 34 | UISupportedInterfaceOrientations 35 | 36 | UIInterfaceOrientationPortrait 37 | UIInterfaceOrientationLandscapeLeft 38 | UIInterfaceOrientationLandscapeRight 39 | UIInterfaceOrientationPortraitUpsideDown 40 | 41 | UISupportedInterfaceOrientations~ipad 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationPortraitUpsideDown 45 | UIInterfaceOrientationLandscapeLeft 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | NSLocalNetworkUsageDescription 49 | your description here 50 | NSBonjourServices 51 | 52 | _adhp._tcp 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/EchoService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EchoService.swift 3 | // WoodPeckerSwiftDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/21. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class EchoService: ADHService { 12 | 13 | override class func serviceName() -> String { 14 | return "adh.EchoService"; 15 | } 16 | 17 | override class func actionList() -> ([String:String]) { 18 | return ["echo": NSStringFromSelector(#selector(EchoService.onRequestEcho(request:)))] 19 | } 20 | 21 | @objc func onRequestEcho(request: ADHRequest) { 22 | let data = ["response" : "Hi, I`m App, what`s up ?"] 23 | request.finish(withBody: data) 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/IOViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IOViewController.swift 3 | // WoodPeckerSwiftDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/21. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | 12 | 13 | class IOViewController: UIViewController { 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | 18 | //register custom service 19 | ADHOrganizer.shared().registerService(EchoService.classForCoder()) 20 | } 21 | 22 | @IBAction func logButtonPressed(_ sender: Any) { 23 | 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" 24 | // log to mac 25 | ADHLogger.shared().logText(text) 26 | } 27 | 28 | } 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/IO/IOViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 41 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/Network/NetworkViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkViewController.swift 3 | // WoodPeckerSwiftDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/21. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class NetworkViewController: UIViewController,NSURLConnectionDataDelegate,URLSessionDelegate { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | // Do any additional setup after loading the view. 17 | } 18 | 19 | @IBAction func startRequest(_ sender: Any) { 20 | //url connection 21 | let requestURL = URL.init(string: "https://api.github.com") 22 | let request = URLRequest.init(url: requestURL!) 23 | let connection = NSURLConnection.init(request: request, delegate: self) 24 | connection?.start() 25 | //session request 26 | self.sessionRequest() 27 | } 28 | 29 | func sessionRequest(){ 30 | let config = URLSessionConfiguration.default 31 | config.timeoutIntervalForRequest = 10.0 32 | let mySession = URLSession.init(configuration: config, delegate: self, delegateQueue: OperationQueue.main) 33 | let url = "https://api.github.com/emojis" 34 | let requestURL = URL.init(string: url) 35 | let uploadRequest = NSMutableURLRequest.init(url: requestURL!) 36 | uploadRequest.httpMethod = "POST" 37 | let formText = "q=\(arc4random())" 38 | let data = formText.data(using: String.Encoding.utf8) 39 | let task = mySession.uploadTask(with: uploadRequest as URLRequest, from: data) { (data:Data?, response:URLResponse?, error:Error?) in 40 | } 41 | task.resume() 42 | } 43 | 44 | func connection(_ connection: NSURLConnection, willSend request: URLRequest, redirectResponse response: URLResponse?) -> URLRequest? { 45 | return request 46 | } 47 | 48 | func connection(_ connection: NSURLConnection, didReceive response: URLResponse) { 49 | 50 | } 51 | 52 | func connection(_ connection: NSURLConnection, didSendBodyData bytesWritten: Int, totalBytesWritten: Int, totalBytesExpectedToWrite: Int) { 53 | 54 | } 55 | 56 | func connection(_ connection: NSURLConnection, didReceive data: Data) { 57 | 58 | } 59 | 60 | func connectionDidFinishLoading(_ connection: NSURLConnection) { 61 | 62 | } 63 | 64 | override func didReceiveMemoryWarning() { 65 | super.didReceiveMemoryWarning() 66 | // Dispose of any resources that can be recreated. 67 | } 68 | 69 | } 70 | 71 | 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/Network/NetworkViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 42 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandBoxViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SandBoxViewController.swift 3 | // WoodPeckerSwiftDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/20. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SandboxViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | } 16 | 17 | @IBAction func addFileButtonPressed(_ sender: Any) { 18 | let formatter = DateFormatter() 19 | formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 20 | let date = Date() 21 | let text = formatter.string(from: date) 22 | //file name 23 | formatter.dateFormat = "HH-mm-ss" 24 | let fileName = "\(formatter.string(from: date)).txt" 25 | let documentPath = (NSHomeDirectory() as NSString).appendingPathComponent("Documents") 26 | let filePath = (documentPath as NSString).appendingPathComponent(fileName) 27 | let fileURL = NSURL.fileURL(withPath: filePath) 28 | 29 | do { 30 | try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8) 31 | } catch { 32 | 33 | } 34 | } 35 | 36 | override func didReceiveMemoryWarning() { 37 | super.didReceiveMemoryWarning() 38 | // Dispose of any resources that can be recreated. 39 | } 40 | 41 | 42 | } 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.temp_caseinsensitive_rename.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SandBoxViewController.swift 3 | // WoodPeckerSwiftDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/20. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SandboxViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | } 16 | 17 | @IBAction func addFileButtonPressed(_ sender: Any) { 18 | let formatter = DateFormatter() 19 | formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 20 | let date = Date() 21 | let text = formatter.string(from: date) 22 | //file name 23 | formatter.dateFormat = "HH-mm-ss" 24 | let fileName = "\(formatter.string(from: date)).txt" 25 | let documentPath = (NSHomeDirectory() as NSString).appendingPathComponent("Documents") 26 | let filePath = (documentPath as NSString).appendingPathComponent(fileName) 27 | let fileURL = NSURL.fileURL(withPath: filePath) 28 | 29 | do { 30 | try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8) 31 | } catch { 32 | 33 | } 34 | } 35 | 36 | override func didReceiveMemoryWarning() { 37 | super.didReceiveMemoryWarning() 38 | // Dispose of any resources that can be recreated. 39 | } 40 | 41 | 42 | } 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.temp_caseinsensitive_rename.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 29 | 30 | 31 | 32 | 33 | 41 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Modules/SandBox/SandboxViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 25 | 26 | 27 | 28 | 29 | 37 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Structure/IndexViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IndexViewController.swift 3 | // WoodPeckerSwiftDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/20. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class IndexViewController: UIViewController,UITableViewDelegate, UITableViewDataSource { 12 | 13 | @IBOutlet weak var tableView: UITableView! 14 | var actionList: [[String:Any]]? 15 | 16 | init() { 17 | super.init(nibName: nil, bundle: nil) 18 | } 19 | 20 | required init?(coder aDecoder: NSCoder) { 21 | super.init(coder: aDecoder) 22 | } 23 | 24 | override func viewDidLoad() { 25 | super.viewDidLoad() 26 | self.navigationItem.title = "Woodpecker Demo"; 27 | self.tableView.rowHeight = 60.0; 28 | self.loadData() 29 | } 30 | 31 | 32 | func loadData() { 33 | self.actionList = [ 34 | [ 35 | "title" : "Sandbox", 36 | "action" : #selector(IndexViewController.sandbox) 37 | ], 38 | [ 39 | "title" : "Network", 40 | "action" : #selector(IndexViewController.network) 41 | ], 42 | [ 43 | "title" : "I/O", 44 | "action" : #selector(IndexViewController.doIO) 45 | ], 46 | [ 47 | "title" : "More tools", 48 | "action" : #selector(IndexViewController.more) 49 | ] 50 | ] 51 | } 52 | 53 | @objc func sandbox(){ 54 | let vc = SandboxViewController() 55 | self.navigationController!.pushViewController(vc, animated: true) 56 | } 57 | 58 | 59 | @objc func network(){ 60 | let vc = NetworkViewController() 61 | self.navigationController!.pushViewController(vc, animated:true) 62 | } 63 | 64 | 65 | @objc func doIO(){ 66 | let vc = IOViewController() 67 | self.navigationController!.pushViewController(vc, animated:true) 68 | } 69 | 70 | @objc func more(){ 71 | let message = "You can learn more in the Objective-C demo"; 72 | let alert = UIAlertController.init(title: "Alert", message: message, preferredStyle: UIAlertControllerStyle.alert); 73 | let confirm = UIAlertAction.init(title: "Ok", style: UIAlertActionStyle.default) { (action) in 74 | 75 | } 76 | alert.addAction(confirm); 77 | self.present(alert, animated: true, completion: nil); 78 | } 79 | 80 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 81 | let count = self.actionList!.count 82 | return count 83 | } 84 | 85 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 86 | let kIndexCellIdentifier = "kIndexCellIdentifier" 87 | let cell = tableView.dequeueReusableCell(withIdentifier: kIndexCellIdentifier) ?? UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: kIndexCellIdentifier) 88 | var data = self.actionList![indexPath.row] 89 | let title = data["title"]; 90 | cell.textLabel?.text = (title as! String) 91 | return cell; 92 | } 93 | 94 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 95 | var data = self.actionList![indexPath.row]; 96 | let action = data["action"] 97 | self.perform(action as? Selector) 98 | tableView.deselectRow(at: indexPath, animated: false) 99 | } 100 | 101 | 102 | override func didReceiveMemoryWarning() { 103 | super.didReceiveMemoryWarning() 104 | // Dispose of any resources that can be recreated. 105 | } 106 | 107 | } 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/Structure/IndexViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // objcBridge.h 3 | // WoodPeckerSwiftDemo 4 | // 5 | // Created by xiaogang zhang on 2018/1/21. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | 10 | #import 11 | -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_io.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_io.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_io.imageset/tool_io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_io.imageset/tool_io.png -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_network.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_network.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_network.imageset/tool_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_network.imageset/tool_network.png -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_sandbox.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_sandbox.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_sandbox.imageset/tool_sandbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_sandbox.imageset/tool_sandbox.png -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_webconsole.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_webconsole.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_webconsole.imageset/tool_webconsole.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckerSwiftDemo/WoodPeckerSwiftDemo/images.xcassets/tool_webconsole.imageset/tool_webconsole.png -------------------------------------------------------------------------------- /WoodPeckeriOS-Carthage.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.0.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.3/WoodPeckeriOS.framework.zip", 3 | "1.0.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.6/WoodPeckeriOS.framework.zip", 4 | "1.0.7": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.7/WoodPeckeriOS.framework.zip", 5 | "1.0.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.8/WoodPeckeriOS.framework.zip", 6 | "1.0.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.0.9/WoodPeckeriOS.framework.zip", 7 | "1.1.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.0/WoodPeckeriOS.framework.zip", 8 | "1.1.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.1/WoodPeckeriOS.framework.zip", 9 | "1.1.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.2/WoodPeckeriOS.framework.zip", 10 | "1.1.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.3/WoodPeckeriOS.framework.zip", 11 | "1.1.4": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.4/WoodPeckeriOS.framework.zip", 12 | "1.1.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.6/WoodPeckeriOS.framework.zip", 13 | "1.1.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.8/WoodPeckeriOS.framework.zip", 14 | "1.1.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.1.9/WoodPeckeriOS.framework.zip", 15 | "1.2.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.0/WoodPeckeriOS.framework.zip", 16 | "1.2.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.1/WoodPeckeriOS.framework.zip", 17 | "1.2.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.2/WoodPeckeriOS.framework.zip", 18 | "1.2.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.3/WoodPeckeriOS.framework.zip", 19 | "1.2.4": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.4/WoodPeckeriOS.framework.zip", 20 | "1.2.5": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.5/WoodPeckeriOS.framework.zip", 21 | "1.2.6": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.6.1/WoodPeckeriOS.framework.zip", 22 | "1.2.7": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.7/WoodPeckeriOS.framework.zip", 23 | "1.2.8": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.8/WoodPeckeriOS.framework.zip", 24 | "1.2.9": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.9/WoodPeckeriOS.framework.zip", 25 | "1.2.92": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.92/WoodPeckeriOS.xcframework.zip", 26 | "1.2.93": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.93/WoodPeckeriOS.xcframework.zip", 27 | "1.3.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.0/WoodPeckeriOS.xcframework.zip", 28 | "1.3.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.1/WoodPeckeriOS.xcframework.zip", 29 | "1.3.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.3.3/WoodPeckeriOS.xcframework.zip", 30 | "1.4.0": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.0/WoodPeckeriOS.xcframework.zip", 31 | "1.4.1": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.1/WoodPeckeriOS.xcframework.zip", 32 | "1.4.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.2/WoodPeckeriOS.xcframework.zip", 33 | "1.4.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.4.3/WoodPeckeriOS.xcframework.zip" 34 | } 35 | -------------------------------------------------------------------------------- /WoodPeckeriOS.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "WoodPeckeriOS" 4 | s.version = "1.4.3" 5 | s.summary = "iOS framework for Woodpekcer Mac App" 6 | 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..." 7 | s.homepage = "http://www.woodpeck.cn" 8 | s.authors = { "Woodpecker" => "woodperckerapp@163.com" } 9 | s.platform = :ios, "11.0" 10 | s.source = { :git => "https://github.com/appwoodpecker/woodpecker-ios.git", :tag => "#{s.version}" } 11 | s.vendored_frameworks = "WoodPeckeriOS.xcframework" 12 | s.license = { :type => 'Copyright', :file => 'LICENSE' } 13 | s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } 14 | s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' } 15 | 16 | end 17 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AvailableLibraries 6 | 7 | 8 | LibraryIdentifier 9 | ios-arm64_x86_64-simulator 10 | LibraryPath 11 | WoodPeckeriOS.framework 12 | SupportedArchitectures 13 | 14 | arm64 15 | x86_64 16 | 17 | SupportedPlatform 18 | ios 19 | SupportedPlatformVariant 20 | simulator 21 | 22 | 23 | LibraryIdentifier 24 | ios-arm64 25 | LibraryPath 26 | WoodPeckeriOS.framework 27 | SupportedArchitectures 28 | 29 | arm64 30 | 31 | SupportedPlatform 32 | ios 33 | 34 | 35 | CFBundlePackageType 36 | XFWK 37 | XCFrameworkFormatVersion 38 | 1.0 39 | 40 | 41 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/ADHConnectViewController.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/ADHConnectViewController.nib -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/ADHRemoteServiceCell.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/ADHRemoteServiceCell.nib -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHLogger.h: -------------------------------------------------------------------------------- 1 | // 2 | // ADHLogger.h 3 | // ADHClient 4 | // 5 | // Created by 张小刚 on 2017/12/30. 6 | // Copyright © 2017年 lifebetter. All rights reserved. 7 | // 8 | 9 | #if TARGET_OS_IPHONE 10 | #import 11 | #endif 12 | 13 | @interface ADHLogger : NSObject 14 | 15 | + (ADHLogger *)sharedLogger; 16 | - (void)logText: (NSString *)text; 17 | - (void)logFileWithData:(NSData *)fileData fileName:(NSString *)fileName text: (NSString *)text; 18 | #if TARGET_OS_IPHONE 19 | - (void)logText: (NSString *)text color: (UIColor *)color; 20 | #endif 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHOrganizer.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppOrganizer.h 3 | // ADHClient 4 | // 5 | // Created by woodpecker on 2017/11/5. 6 | // Copyright © 2017年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | 13 | /** 14 | * parameters that specify which mac client you'd like connect to 15 | * learn more at http://www.woodpeck.cn/connection.html 16 | */ 17 | extern NSString *const kADHHostName; 18 | extern NSString *const kADHHostAddress; 19 | extern NSString *const kADHAutoConnectEnabled; 20 | extern NSString *const kADHUIGestureEnabled; 21 | 22 | 23 | @interface ADHOrganizer : NSObject 24 | 25 | + (ADHOrganizer *)sharedOrganizer; 26 | 27 | /** 28 | * register your own ADHService 29 | * learn more about custom service, please visit http://www.woodpeck.cn/plugin.html 30 | */ 31 | - (void)registerService: (Class)serviceClazz; 32 | 33 | /** 34 | * show connection setup window manually, also you can use gesture too, 35 | * just long press with two fingers at anywhere of your app. 36 | */ 37 | - (void)showUI; 38 | 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // ADHRequest.h 3 | // ADHClient 4 | // 5 | // Created by woodpecker on 2017/11/4. 6 | // Copyright © 2017年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @class ADHRequest; 13 | @class ADHSession; 14 | @class ADHService; 15 | 16 | @interface ADHRequest : NSObject 17 | 18 | @property (nonatomic, strong) NSString * service; 19 | @property (nonatomic, strong) NSString * action; 20 | @property (nonatomic, strong) NSDictionary * body; 21 | @property (nonatomic, strong) NSData * payload; 22 | 23 | 24 | //must call at the end of a request 25 | - (void)finish; 26 | - (void)finishWithBody: (NSDictionary *)body; 27 | - (void)finishWithBody: (NSDictionary *)body payload: (NSData *)payload; 28 | 29 | 30 | @end 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/ADHService.h: -------------------------------------------------------------------------------- 1 | // 2 | // ADHService.h 3 | // AppDevelopHelper 4 | // 5 | // Created by woodpecker on 2017/11/4. 6 | // Copyright © 2017年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ADHService : NSObject 12 | 13 | /** 14 | service name 15 | */ 16 | + (NSString *)serviceName; 17 | 18 | /** 19 | action list 20 | 21 | return @{ 22 | @"actionName1" : selector1 string, 23 | @"actionName2" : selector2 string, 24 | }; 25 | */ 26 | + (NSDictionary *)actionList; 27 | 28 | /** 29 | YES: all request use one shared service instance. 30 | NO: each request use a new service instance. 31 | */ 32 | + (BOOL)isShared; 33 | 34 | /** 35 | called on service init 36 | */ 37 | - (void)onServiceInit; 38 | 39 | 40 | @end 41 | 42 | 43 | @interface ADHAction: NSObject 44 | 45 | @property (nonatomic, strong) NSString * service; 46 | @property (nonatomic, strong) NSString * name; 47 | @property (nonatomic, strong) NSString * handler; 48 | 49 | + (ADHAction *)actionWithService: (NSString *)service name: (NSString *)name handler: (NSString *)handler; 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Headers/WoodPeckeriOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // WoodPeckeriOS.h 3 | // WoodPeckeriOS 4 | // 5 | // Created by woodpecker on 2018/1/7. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for WoodPeckeriOS. 12 | FOUNDATION_EXPORT double WoodPeckeriOSVersionNumber; 13 | 14 | //! Project version string for WoodPeckeriOS. 15 | FOUNDATION_EXPORT const unsigned char WoodPeckeriOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | #import 20 | #import 21 | #import 22 | #import 23 | 24 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Info.plist -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module WoodPeckeriOS { 2 | umbrella header "WoodPeckeriOS.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/WoodPeckeriOS: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/WoodPeckeriOS -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | ADHConnectViewController.nib 8 | 9 | pqKfhkAkrBNujLZE2Ee203g6yQ8= 10 | 11 | ADHRemoteServiceCell.nib 12 | 13 | 4EZm1JVZi6H8//9xa6WvF0M3POc= 14 | 15 | Headers/ADHLogger.h 16 | 17 | tr7ZIT8mFwHtfZNYOU7gcSui7M0= 18 | 19 | Headers/ADHOrganizer.h 20 | 21 | xjxX+wbxgeNkXtwk1oUJrkYJQuo= 22 | 23 | Headers/ADHRequest.h 24 | 25 | ImkUqO+N052g2ypMPoBtobY4s6g= 26 | 27 | Headers/ADHService.h 28 | 29 | 6SENU3Ad9+OcQ0slfAzrqpYzx9s= 30 | 31 | Headers/WoodPeckeriOS.h 32 | 33 | 725LXPFZloMNOizfCL/tkXqCgiQ= 34 | 35 | Info.plist 36 | 37 | EY+6I+c2ifIwpaBm8D3Lq+75SSM= 38 | 39 | Modules/module.modulemap 40 | 41 | uytDu9Ql07vN0alhWqpDzzrojIs= 42 | 43 | adhwebdebugger.bundle/mock.js 44 | 45 | YIsJN3YRR6UMoFhsBgb4JdY6tpg= 46 | 47 | 48 | files2 49 | 50 | ADHConnectViewController.nib 51 | 52 | hash2 53 | 54 | FE5aUJkN1d13EzbgXbaQBtY3OQSGwW5XZtSSb5Clyxw= 55 | 56 | 57 | ADHRemoteServiceCell.nib 58 | 59 | hash2 60 | 61 | Po7DobIgRzXW62+4vL8El1TIzc5uGTIMIC2NLxTwmqk= 62 | 63 | 64 | Headers/ADHLogger.h 65 | 66 | hash2 67 | 68 | I/Vh0EI2tIImYyjGDjEHMp4wAfoq8upkDFOD97tr7tU= 69 | 70 | 71 | Headers/ADHOrganizer.h 72 | 73 | hash2 74 | 75 | DPmD7L8x7uJCdrgXHiQ6ztxVhsxW9ItGP/NS3pAQDpM= 76 | 77 | 78 | Headers/ADHRequest.h 79 | 80 | hash2 81 | 82 | kxMpI4TuI/X4D1lz6txphCFANrdR4pWSFVOT/ORLEqc= 83 | 84 | 85 | Headers/ADHService.h 86 | 87 | hash2 88 | 89 | 9dlef+1QknEeYNfSnzmCv5MRj2e85DI2fA1BGlfdiDE= 90 | 91 | 92 | Headers/WoodPeckeriOS.h 93 | 94 | hash2 95 | 96 | u/8B5RVVynf7ouOSIM9W2I1djZC82Xvo0/XS3WDACzk= 97 | 98 | 99 | Modules/module.modulemap 100 | 101 | hash2 102 | 103 | 1PST2FmpFCkiPZ3i3V5g1CguJHZwfC2IwIxxLUV68nY= 104 | 105 | 106 | adhwebdebugger.bundle/mock.js 107 | 108 | hash2 109 | 110 | EML+wVyc32okro6yPkBnzQAG83hZugzIxJDI5qjNgNI= 111 | 112 | 113 | 114 | rules 115 | 116 | ^.* 117 | 118 | ^.*\.lproj/ 119 | 120 | optional 121 | 122 | weight 123 | 1000 124 | 125 | ^.*\.lproj/locversion.plist$ 126 | 127 | omit 128 | 129 | weight 130 | 1100 131 | 132 | ^Base\.lproj/ 133 | 134 | weight 135 | 1010 136 | 137 | ^version.plist$ 138 | 139 | 140 | rules2 141 | 142 | .*\.dSYM($|/) 143 | 144 | weight 145 | 11 146 | 147 | ^(.*/)?\.DS_Store$ 148 | 149 | omit 150 | 151 | weight 152 | 2000 153 | 154 | ^.* 155 | 156 | ^.*\.lproj/ 157 | 158 | optional 159 | 160 | weight 161 | 1000 162 | 163 | ^.*\.lproj/locversion.plist$ 164 | 165 | omit 166 | 167 | weight 168 | 1100 169 | 170 | ^Base\.lproj/ 171 | 172 | weight 173 | 1010 174 | 175 | ^Info\.plist$ 176 | 177 | omit 178 | 179 | weight 180 | 20 181 | 182 | ^PkgInfo$ 183 | 184 | omit 185 | 186 | weight 187 | 20 188 | 189 | ^embedded\.provisionprofile$ 190 | 191 | weight 192 | 20 193 | 194 | ^version\.plist$ 195 | 196 | weight 197 | 20 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mock window's console methods(log,info,warn,debug,error) and window.onerror 3 | */ 4 | 5 | function mockedMethodList () { 6 | const methodList = ['log', 'info', 'warn', 'debug', 'error']; 7 | return methodList; 8 | } 9 | 10 | //mock console methods 11 | function mockConsole() { 12 | if(window.adhOriginConsole) { 13 | return; 14 | } 15 | window.adhOriginConsole = {}; 16 | var methodList = mockedMethodList(); 17 | if(!window.console) { 18 | window.console = {}; 19 | }else { 20 | //save origin method 21 | methodList.map(function (method) { 22 | window.adhOriginConsole[method] = window.console[method]; 23 | }); 24 | } 25 | 26 | methodList.map(method => { 27 | window.console[method] = (...args) => { 28 | printLog({ 29 | logType: method, 30 | logs: args 31 | }); 32 | }; 33 | }); 34 | } 35 | 36 | function mockWindowError() { 37 | if(window.adhOriginOnError) { 38 | return 39 | } 40 | if(window.onerror) { 41 | window.adhOriginOnError = window.onerror; 42 | } 43 | window.onerror = printError; 44 | } 45 | 46 | function restoreWindowError() { 47 | window.onerror = window.adhOriginOnError; 48 | } 49 | 50 | /** 51 | * @param {String} errorMessage 52 | * @param {String} scriptURI 53 | * @param {Long} lineNumber 54 | * @param {Long} columnNumber 55 | * @param {Object} errorObj 56 | */ 57 | function printError(errorMessage, scriptURI, lineNumber,columnNumber) { 58 | var content = ''; 59 | content += 'message: ' + errorMessage + '
'; 60 | content += 'scriptURI: ' + scriptURI + '
'; 61 | content += 'line: ' + lineNumber + '
'; 62 | content += 'column: ' + columnNumber; 63 | console.error(content); 64 | } 65 | 66 | //restore console methods 67 | function restoreConsole() { 68 | var methodList = mockedMethodList(); 69 | methodList.map(function (method) { 70 | window.console[method] = window.adhOriginConsole[method]; 71 | }); 72 | } 73 | 74 | //mocked log 75 | function printLog(item) { 76 | var logType = item.logType; 77 | let logs = item.logs || []; 78 | if (!logs.length) { 79 | return; 80 | } 81 | var content = ''; 82 | for (let i = 0; i < logs.length; i++) { 83 | var value = logs[i]; 84 | if (typeof(value) == "undefined") { 85 | result = "undefined"; 86 | }else if (!value && value!=0) { 87 | result = "null"; 88 | }else if(typeof(value) == 'object'){ 89 | if(logs.length == 1) { 90 | result = JSON.stringify(value,null,4); 91 | }else { 92 | result = JSON.stringify(value,null); 93 | } 94 | }else { 95 | result = value.toString(); 96 | } 97 | content += result; 98 | } 99 | var data = {}; 100 | data['logType'] = logType; 101 | data['content'] = content; 102 | // data['date'] = new Date().toString(); 103 | //webkit 104 | if(window.webkit) { 105 | if(window.webkit.messageHandlers.wkwebviewjsHandler) { 106 | window.webkit.messageHandlers.wkwebviewjsHandler.postMessage(data); 107 | } 108 | } 109 | //uiwebview 110 | if(window.webviewjsHandler) { 111 | webviewjsHandler(data); 112 | } 113 | } 114 | 115 | function adhMock() { 116 | mockConsole(); 117 | mockWindowError(); 118 | } 119 | 120 | adhMock(); 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/ADHConnectViewController.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/ADHConnectViewController.nib -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/ADHRemoteServiceCell.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/ADHRemoteServiceCell.nib -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHLogger.h: -------------------------------------------------------------------------------- 1 | // 2 | // ADHLogger.h 3 | // ADHClient 4 | // 5 | // Created by 张小刚 on 2017/12/30. 6 | // Copyright © 2017年 lifebetter. All rights reserved. 7 | // 8 | 9 | #if TARGET_OS_IPHONE 10 | #import 11 | #endif 12 | 13 | @interface ADHLogger : NSObject 14 | 15 | + (ADHLogger *)sharedLogger; 16 | - (void)logText: (NSString *)text; 17 | - (void)logFileWithData:(NSData *)fileData fileName:(NSString *)fileName text: (NSString *)text; 18 | #if TARGET_OS_IPHONE 19 | - (void)logText: (NSString *)text color: (UIColor *)color; 20 | #endif 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHOrganizer.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppOrganizer.h 3 | // ADHClient 4 | // 5 | // Created by woodpecker on 2017/11/5. 6 | // Copyright © 2017年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | 13 | /** 14 | * parameters that specify which mac client you'd like connect to 15 | * learn more at http://www.woodpeck.cn/connection.html 16 | */ 17 | extern NSString *const kADHHostName; 18 | extern NSString *const kADHHostAddress; 19 | extern NSString *const kADHAutoConnectEnabled; 20 | extern NSString *const kADHUIGestureEnabled; 21 | 22 | 23 | @interface ADHOrganizer : NSObject 24 | 25 | + (ADHOrganizer *)sharedOrganizer; 26 | 27 | /** 28 | * register your own ADHService 29 | * learn more about custom service, please visit http://www.woodpeck.cn/plugin.html 30 | */ 31 | - (void)registerService: (Class)serviceClazz; 32 | 33 | /** 34 | * show connection setup window manually, also you can use gesture too, 35 | * just long press with two fingers at anywhere of your app. 36 | */ 37 | - (void)showUI; 38 | 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // ADHRequest.h 3 | // ADHClient 4 | // 5 | // Created by woodpecker on 2017/11/4. 6 | // Copyright © 2017年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @class ADHRequest; 13 | @class ADHSession; 14 | @class ADHService; 15 | 16 | @interface ADHRequest : NSObject 17 | 18 | @property (nonatomic, strong) NSString * service; 19 | @property (nonatomic, strong) NSString * action; 20 | @property (nonatomic, strong) NSDictionary * body; 21 | @property (nonatomic, strong) NSData * payload; 22 | 23 | 24 | //must call at the end of a request 25 | - (void)finish; 26 | - (void)finishWithBody: (NSDictionary *)body; 27 | - (void)finishWithBody: (NSDictionary *)body payload: (NSData *)payload; 28 | 29 | 30 | @end 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/ADHService.h: -------------------------------------------------------------------------------- 1 | // 2 | // ADHService.h 3 | // AppDevelopHelper 4 | // 5 | // Created by woodpecker on 2017/11/4. 6 | // Copyright © 2017年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ADHService : NSObject 12 | 13 | /** 14 | service name 15 | */ 16 | + (NSString *)serviceName; 17 | 18 | /** 19 | action list 20 | 21 | return @{ 22 | @"actionName1" : selector1 string, 23 | @"actionName2" : selector2 string, 24 | }; 25 | */ 26 | + (NSDictionary *)actionList; 27 | 28 | /** 29 | YES: all request use one shared service instance. 30 | NO: each request use a new service instance. 31 | */ 32 | + (BOOL)isShared; 33 | 34 | /** 35 | called on service init 36 | */ 37 | - (void)onServiceInit; 38 | 39 | 40 | @end 41 | 42 | 43 | @interface ADHAction: NSObject 44 | 45 | @property (nonatomic, strong) NSString * service; 46 | @property (nonatomic, strong) NSString * name; 47 | @property (nonatomic, strong) NSString * handler; 48 | 49 | + (ADHAction *)actionWithService: (NSString *)service name: (NSString *)name handler: (NSString *)handler; 50 | 51 | @end 52 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Headers/WoodPeckeriOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // WoodPeckeriOS.h 3 | // WoodPeckeriOS 4 | // 5 | // Created by woodpecker on 2018/1/7. 6 | // Copyright © 2018年 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for WoodPeckeriOS. 12 | FOUNDATION_EXPORT double WoodPeckeriOSVersionNumber; 13 | 14 | //! Project version string for WoodPeckeriOS. 15 | FOUNDATION_EXPORT const unsigned char WoodPeckeriOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | #import 20 | #import 21 | #import 22 | #import 23 | 24 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Info.plist -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module WoodPeckeriOS { 2 | umbrella header "WoodPeckeriOS.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/WoodPeckeriOS: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/WoodPeckeriOS -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | ADHConnectViewController.nib 8 | 9 | pqKfhkAkrBNujLZE2Ee203g6yQ8= 10 | 11 | ADHRemoteServiceCell.nib 12 | 13 | 4EZm1JVZi6H8//9xa6WvF0M3POc= 14 | 15 | Headers/ADHLogger.h 16 | 17 | tr7ZIT8mFwHtfZNYOU7gcSui7M0= 18 | 19 | Headers/ADHOrganizer.h 20 | 21 | xjxX+wbxgeNkXtwk1oUJrkYJQuo= 22 | 23 | Headers/ADHRequest.h 24 | 25 | ImkUqO+N052g2ypMPoBtobY4s6g= 26 | 27 | Headers/ADHService.h 28 | 29 | 6SENU3Ad9+OcQ0slfAzrqpYzx9s= 30 | 31 | Headers/WoodPeckeriOS.h 32 | 33 | 725LXPFZloMNOizfCL/tkXqCgiQ= 34 | 35 | Info.plist 36 | 37 | oMaB50N6kkDT7PV6DFqHL1IW2gw= 38 | 39 | Modules/module.modulemap 40 | 41 | uytDu9Ql07vN0alhWqpDzzrojIs= 42 | 43 | adhwebdebugger.bundle/mock.js 44 | 45 | YIsJN3YRR6UMoFhsBgb4JdY6tpg= 46 | 47 | 48 | files2 49 | 50 | ADHConnectViewController.nib 51 | 52 | hash2 53 | 54 | FE5aUJkN1d13EzbgXbaQBtY3OQSGwW5XZtSSb5Clyxw= 55 | 56 | 57 | ADHRemoteServiceCell.nib 58 | 59 | hash2 60 | 61 | Po7DobIgRzXW62+4vL8El1TIzc5uGTIMIC2NLxTwmqk= 62 | 63 | 64 | Headers/ADHLogger.h 65 | 66 | hash2 67 | 68 | I/Vh0EI2tIImYyjGDjEHMp4wAfoq8upkDFOD97tr7tU= 69 | 70 | 71 | Headers/ADHOrganizer.h 72 | 73 | hash2 74 | 75 | DPmD7L8x7uJCdrgXHiQ6ztxVhsxW9ItGP/NS3pAQDpM= 76 | 77 | 78 | Headers/ADHRequest.h 79 | 80 | hash2 81 | 82 | kxMpI4TuI/X4D1lz6txphCFANrdR4pWSFVOT/ORLEqc= 83 | 84 | 85 | Headers/ADHService.h 86 | 87 | hash2 88 | 89 | 9dlef+1QknEeYNfSnzmCv5MRj2e85DI2fA1BGlfdiDE= 90 | 91 | 92 | Headers/WoodPeckeriOS.h 93 | 94 | hash2 95 | 96 | u/8B5RVVynf7ouOSIM9W2I1djZC82Xvo0/XS3WDACzk= 97 | 98 | 99 | Modules/module.modulemap 100 | 101 | hash2 102 | 103 | 1PST2FmpFCkiPZ3i3V5g1CguJHZwfC2IwIxxLUV68nY= 104 | 105 | 106 | adhwebdebugger.bundle/mock.js 107 | 108 | hash2 109 | 110 | EML+wVyc32okro6yPkBnzQAG83hZugzIxJDI5qjNgNI= 111 | 112 | 113 | 114 | rules 115 | 116 | ^.* 117 | 118 | ^.*\.lproj/ 119 | 120 | optional 121 | 122 | weight 123 | 1000 124 | 125 | ^.*\.lproj/locversion.plist$ 126 | 127 | omit 128 | 129 | weight 130 | 1100 131 | 132 | ^Base\.lproj/ 133 | 134 | weight 135 | 1010 136 | 137 | ^version.plist$ 138 | 139 | 140 | rules2 141 | 142 | .*\.dSYM($|/) 143 | 144 | weight 145 | 11 146 | 147 | ^(.*/)?\.DS_Store$ 148 | 149 | omit 150 | 151 | weight 152 | 2000 153 | 154 | ^.* 155 | 156 | ^.*\.lproj/ 157 | 158 | optional 159 | 160 | weight 161 | 1000 162 | 163 | ^.*\.lproj/locversion.plist$ 164 | 165 | omit 166 | 167 | weight 168 | 1100 169 | 170 | ^Base\.lproj/ 171 | 172 | weight 173 | 1010 174 | 175 | ^Info\.plist$ 176 | 177 | omit 178 | 179 | weight 180 | 20 181 | 182 | ^PkgInfo$ 183 | 184 | omit 185 | 186 | weight 187 | 20 188 | 189 | ^embedded\.provisionprofile$ 190 | 191 | weight 192 | 20 193 | 194 | ^version\.plist$ 195 | 196 | weight 197 | 20 198 | 199 | 200 | 201 | 202 | -------------------------------------------------------------------------------- /WoodPeckeriOS.xcframework/ios-arm64_x86_64-simulator/WoodPeckeriOS.framework/adhwebdebugger.bundle/mock.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mock window's console methods(log,info,warn,debug,error) and window.onerror 3 | */ 4 | 5 | function mockedMethodList () { 6 | const methodList = ['log', 'info', 'warn', 'debug', 'error']; 7 | return methodList; 8 | } 9 | 10 | //mock console methods 11 | function mockConsole() { 12 | if(window.adhOriginConsole) { 13 | return; 14 | } 15 | window.adhOriginConsole = {}; 16 | var methodList = mockedMethodList(); 17 | if(!window.console) { 18 | window.console = {}; 19 | }else { 20 | //save origin method 21 | methodList.map(function (method) { 22 | window.adhOriginConsole[method] = window.console[method]; 23 | }); 24 | } 25 | 26 | methodList.map(method => { 27 | window.console[method] = (...args) => { 28 | printLog({ 29 | logType: method, 30 | logs: args 31 | }); 32 | }; 33 | }); 34 | } 35 | 36 | function mockWindowError() { 37 | if(window.adhOriginOnError) { 38 | return 39 | } 40 | if(window.onerror) { 41 | window.adhOriginOnError = window.onerror; 42 | } 43 | window.onerror = printError; 44 | } 45 | 46 | function restoreWindowError() { 47 | window.onerror = window.adhOriginOnError; 48 | } 49 | 50 | /** 51 | * @param {String} errorMessage 52 | * @param {String} scriptURI 53 | * @param {Long} lineNumber 54 | * @param {Long} columnNumber 55 | * @param {Object} errorObj 56 | */ 57 | function printError(errorMessage, scriptURI, lineNumber,columnNumber) { 58 | var content = ''; 59 | content += 'message: ' + errorMessage + '
'; 60 | content += 'scriptURI: ' + scriptURI + '
'; 61 | content += 'line: ' + lineNumber + '
'; 62 | content += 'column: ' + columnNumber; 63 | console.error(content); 64 | } 65 | 66 | //restore console methods 67 | function restoreConsole() { 68 | var methodList = mockedMethodList(); 69 | methodList.map(function (method) { 70 | window.console[method] = window.adhOriginConsole[method]; 71 | }); 72 | } 73 | 74 | //mocked log 75 | function printLog(item) { 76 | var logType = item.logType; 77 | let logs = item.logs || []; 78 | if (!logs.length) { 79 | return; 80 | } 81 | var content = ''; 82 | for (let i = 0; i < logs.length; i++) { 83 | var value = logs[i]; 84 | if (typeof(value) == "undefined") { 85 | result = "undefined"; 86 | }else if (!value && value!=0) { 87 | result = "null"; 88 | }else if(typeof(value) == 'object'){ 89 | if(logs.length == 1) { 90 | result = JSON.stringify(value,null,4); 91 | }else { 92 | result = JSON.stringify(value,null); 93 | } 94 | }else { 95 | result = value.toString(); 96 | } 97 | content += result; 98 | } 99 | var data = {}; 100 | data['logType'] = logType; 101 | data['content'] = content; 102 | // data['date'] = new Date().toString(); 103 | //webkit 104 | if(window.webkit) { 105 | if(window.webkit.messageHandlers.wkwebviewjsHandler) { 106 | window.webkit.messageHandlers.wkwebviewjsHandler.postMessage(data); 107 | } 108 | } 109 | //uiwebview 110 | if(window.webviewjsHandler) { 111 | webviewjsHandler(data); 112 | } 113 | } 114 | 115 | function adhMock() { 116 | mockConsole(); 117 | mockWindowError(); 118 | } 119 | 120 | adhMock(); 121 | 122 | 123 | 124 | 125 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // WoodpeckerMacDemo 4 | // 5 | // Created by xiaogang zhang on 2019/6/1. 6 | // Copyright © 2019 LIFE BETTER. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | @NSApplicationMain 12 | class AppDelegate: NSObject, NSApplicationDelegate { 13 | 14 | @IBOutlet weak var window: NSWindow! 15 | @IBOutlet weak var tabView: NSTabView! 16 | 17 | var list : Array>? 18 | 19 | func applicationDidFinishLaunching(_ aNotification: Notification) { 20 | initValue() 21 | loadContent() 22 | } 23 | 24 | func initValue() { 25 | self.list = [ 26 | [ 27 | "title" : "Sandbox", 28 | "page" : "SandboxViewController" 29 | ], 30 | [ 31 | "title" : "UserDefaults", 32 | "page" : "UserDefaultsViewController" 33 | ], 34 | [ 35 | "title" : "Network", 36 | "page" : "NetworkViewController" 37 | ], 38 | [ 39 | "title" : "Bundle", 40 | "page" : "BundleViewController" 41 | ], 42 | [ 43 | "title" : "Notification", 44 | "page" : "NotificationViewController" 45 | ], 46 | [ 47 | "title" : "Localization", 48 | "page" : "LocalizationViewController" 49 | ], 50 | ]; 51 | } 52 | 53 | func loadContent() { 54 | var tabItems = [NSTabViewItem]() 55 | for data in self.list! { 56 | let title = data["title"] 57 | let page = data["page"] 58 | let nibName = page 59 | let clazz = getClass(pageName:page!) 60 | let vc = clazz.init(nibName: nibName, bundle: nil) 61 | vc.title = title 62 | let tabItem = NSTabViewItem.init(viewController: vc) 63 | tabItems.append(tabItem) 64 | } 65 | self.tabView.tabViewItems = tabItems 66 | } 67 | 68 | func getClass(pageName: String) -> NSViewController.Type { 69 | let namespace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String 70 | let clazzName = namespace + "." + pageName; 71 | let clazz = NSClassFromString(clazzName) as! NSViewController.Type 72 | return clazz; 73 | } 74 | 75 | func applicationWillTerminate(_ aNotification: Notification) { 76 | // Insert code here to tear down your application 77 | } 78 | 79 | func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 80 | return true 81 | } 82 | 83 | 84 | } 85 | 86 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "mac", 5 | "size" : "16x16", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "mac", 10 | "size" : "16x16", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "mac", 15 | "size" : "32x32", 16 | "scale" : "1x" 17 | }, 18 | { 19 | "idiom" : "mac", 20 | "size" : "32x32", 21 | "scale" : "2x" 22 | }, 23 | { 24 | "idiom" : "mac", 25 | "size" : "128x128", 26 | "scale" : "1x" 27 | }, 28 | { 29 | "idiom" : "mac", 30 | "size" : "128x128", 31 | "scale" : "2x" 32 | }, 33 | { 34 | "idiom" : "mac", 35 | "size" : "256x256", 36 | "scale" : "1x" 37 | }, 38 | { 39 | "idiom" : "mac", 40 | "size" : "256x256", 41 | "scale" : "2x" 42 | }, 43 | { 44 | "idiom" : "mac", 45 | "size" : "512x512", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "mac", 50 | "size" : "512x512", 51 | "scale" : "2x" 52 | } 53 | ], 54 | "info" : { 55 | "version" : 1, 56 | "author" : "xcode" 57 | } 58 | } -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_bundle.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_bundle.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_bundle.imageset/tool_bundle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_bundle.imageset/tool_bundle.png -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_localization.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_localization.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_localization.imageset/tool_localization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_localization.imageset/tool_localization.png -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_network.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_network.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_network.imageset/tool_network.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_network.imageset/tool_network.png -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_notification.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_notification.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_notification.imageset/tool_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_notification.imageset/tool_notification.png -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_sandbox.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_sandbox.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_sandbox.imageset/tool_sandbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_sandbox.imageset/tool_sandbox.png -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_userdefaults.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "tool_userdefaults.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_userdefaults.imageset/tool_userdefaults.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacDemo/WoodpeckerMacDemo/Assets.xcassets/tool_userdefaults.imageset/tool_userdefaults.png -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIconFile 10 | 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0.0 21 | CFBundleVersion 22 | 1 23 | LSApplicationCategoryType 24 | public.app-category.developer-tools 25 | LSMinimumSystemVersion 26 | $(MACOSX_DEPLOYMENT_TARGET) 27 | NSHumanReadableCopyright 28 | Copyright © 2019 LIFE BETTER. All rights reserved. 29 | NSMainNibFile 30 | MainMenu 31 | NSPrincipalClass 32 | NSApplication 33 | 34 | 35 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Bundle/BundleViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BundleViewController.swift 3 | // WoodpeckerMacDemo 4 | // 5 | // Created by xiaogang zhang on 2019/6/1. 6 | // Copyright © 2019 LIFE BETTER. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class BundleViewController: NSViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | // Do view setup here. 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Bundle/BundleViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Localization/LocalizationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LocalizationViewController.swift 3 | // WoodpeckerMacDemo 4 | // 5 | // Created by xiaogang zhang on 2019/6/1. 6 | // Copyright © 2019 LIFE BETTER. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class LocalizationViewController: NSViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | // Do view setup here. 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Localization/LocalizationViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/NetworkViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NetworkViewController.swift 3 | // WoodpeckerMacDemo 4 | // 5 | // Created by xiaogang zhang on 2019/6/1. 6 | // Copyright © 2019 LIFE BETTER. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class NetworkViewController: NSViewController,NSURLConnectionDataDelegate,URLSessionDelegate { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | } 16 | 17 | @IBAction func requestButtonClicked(_ sender: Any) { 18 | //url connection 19 | let requestURL = URL.init(string: "https://api.github.com") 20 | let request = URLRequest.init(url: requestURL!) 21 | let connection = NSURLConnection.init(request: request, delegate: self) 22 | connection?.start() 23 | //session request 24 | self.sessionRequest() 25 | } 26 | 27 | func sessionRequest(){ 28 | let config = URLSessionConfiguration.default 29 | config.timeoutIntervalForRequest = 10.0 30 | let mySession = URLSession.init(configuration: config, delegate: self, delegateQueue: OperationQueue.main) 31 | let url = "https://api.github.com/emojis" 32 | let requestURL = URL.init(string: url) 33 | let uploadRequest = NSMutableURLRequest.init(url: requestURL!) 34 | uploadRequest.httpMethod = "POST" 35 | let formText = "q=\(arc4random())" 36 | let data = formText.data(using: String.Encoding.utf8) 37 | let task = mySession.uploadTask(with: uploadRequest as URLRequest, from: data) { (data:Data?, response:URLResponse?, error:Error?) in 38 | } 39 | task.resume() 40 | } 41 | 42 | func connectionDidFinishLoading(_ connection: NSURLConnection) { 43 | 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/NetworkViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Notification/NotificationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NotificationViewController.swift 3 | // WoodpeckerMacDemo 4 | // 5 | // Created by xiaogang zhang on 2019/6/1. 6 | // Copyright © 2019 LIFE BETTER. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | import UserNotifications 11 | 12 | class NotificationViewController: NSViewController, UNUserNotificationCenterDelegate { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | setup() 17 | } 18 | 19 | func setup() { 20 | let notiCenter = UNUserNotificationCenter.current() 21 | notiCenter.delegate = self 22 | let openAction = UNNotificationAction.init(identifier: UNNotificationDefaultActionIdentifier, title: "Okay", options: UNNotificationActionOptions.init(rawValue: 0)) 23 | let category = UNNotificationCategory.init(identifier: "category_id", actions: [openAction], intentIdentifiers: [], options: UNNotificationCategoryOptions.init(rawValue: 0)) 24 | let set = Set.init([category]) 25 | notiCenter.setNotificationCategories(set) 26 | } 27 | 28 | @IBAction func scheduleButtonClicked(_ sender: Any) { 29 | let notiCenter = UNUserNotificationCenter.current() 30 | notiCenter.requestAuthorization(options: [UNAuthorizationOptions.alert,UNAuthorizationOptions.badge,UNAuthorizationOptions.sound]) { (okay, error) in 31 | if okay { 32 | self.schedule() 33 | } 34 | if let err = error { 35 | print(err) 36 | let alert = NSAlert.init() 37 | alert.messageText = "request authorization failed, you can try in your own project later" 38 | alert.addButton(withTitle: "Okay") 39 | alert.runModal(); 40 | } 41 | } 42 | } 43 | 44 | func schedule () { 45 | let notiCenter = UNUserNotificationCenter.current() 46 | let content = UNMutableNotificationContent.init() 47 | content.badge = 3 48 | content.body = "I'm body" 49 | content.title = "I'm title" 50 | content.subtitle = "I'm subtitle" 51 | content.userInfo = [ 52 | "key" : "value" 53 | ] 54 | content.categoryIdentifier = "category_id"; 55 | //60s 56 | let trigger = UNTimeIntervalNotificationTrigger.init(timeInterval: 60, repeats: true) 57 | let identifier = String(arc4random()) 58 | let request = UNNotificationRequest.init(identifier: identifier, content: content, trigger: trigger) 59 | notiCenter.add(request) { (error) in 60 | 61 | } 62 | } 63 | 64 | public func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 65 | 66 | } 67 | 68 | @IBAction func removeAllButtonClicked(_ sender: Any) { 69 | let notiCenter = UNUserNotificationCenter.current() 70 | notiCenter.removeAllPendingNotificationRequests(); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Notification/NotificationViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 44 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Sandbox/SandboxViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SandboxViewController.swift 3 | // WoodpeckerMacDemo 4 | // 5 | // Created by xiaogang zhang on 2019/6/1. 6 | // Copyright © 2019 LIFE BETTER. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class SandboxViewController: NSViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | } 17 | 18 | @IBAction func addButtonClicked(_ sender: Any) { 19 | let formatter = DateFormatter() 20 | formatter.dateFormat = "yyyy-MM-dd HH:mm:ss" 21 | let date = Date() 22 | let text = formatter.string(from: date) 23 | //file name 24 | formatter.dateFormat = "HH-mm-ss" 25 | let fileName = "\(formatter.string(from: date)).txt" 26 | let documentPath = (NSHomeDirectory() as NSString).appendingPathComponent("Documents") 27 | let filePath = (documentPath as NSString).appendingPathComponent(fileName) 28 | let fileURL = NSURL.fileURL(withPath: filePath) 29 | 30 | do { 31 | try text.write(to: fileURL, atomically: true, encoding: String.Encoding.utf8) 32 | } catch { 33 | 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/Sandbox/SandboxViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/UserDefaults/UserDefaultsViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UserDefaultsViewController.swift 3 | // WoodpeckerMacDemo 4 | // 5 | // Created by xiaogang zhang on 2019/6/1. 6 | // Copyright © 2019 LIFE BETTER. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | class UserDefaultsViewController: NSViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | } 17 | 18 | @IBAction func addButtonClicked(_ sender: Any) { 19 | UserDefaults.standard.set(Date.init(), forKey: "time") 20 | UserDefaults.standard.synchronize() 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/Pages/UserDefaults/UserDefaultsViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/WoodpeckerMacDemo.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | com.apple.security.network.client 10 | 11 | com.apple.security.network.server 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | WoodpeckerMacDemo 4 | 5 | Created by 张小刚 on 2019/6/1. 6 | Copyright © 2019 LIFE BETTER. All rights reserved. 7 | */ 8 | 9 | "hi"="bonjour"; 10 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | WoodpeckerMacDemo 4 | 5 | Created by xiaogang zhang on 2019/6/1. 6 | Copyright © 2019 LIFE BETTER. All rights reserved. 7 | */ 8 | 9 | "hi"="Hi"; 10 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | WoodpeckerMacDemo 4 | 5 | Created by xiaogang zhang on 2019/6/1. 6 | Copyright © 2019 LIFE BETTER. All rights reserved. 7 | */ 8 | 9 | "hi"="Bonjour"; 10 | -------------------------------------------------------------------------------- /WoodpeckerMacDemo/WoodpeckerMacDemo/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* 2 | Localizable.strings 3 | WoodpeckerMacDemo 4 | 5 | Created by xiaogang zhang on 2019/6/1. 6 | Copyright © 2019 LIFE BETTER. All rights reserved. 7 | */ 8 | 9 | "hi"="你好"; 10 | -------------------------------------------------------------------------------- /WoodpeckerMacOS-Carthage.json: -------------------------------------------------------------------------------- 1 | { 2 | "1.2.2": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.2/WoodpeckerMacOS.framework.zip", 3 | "1.2.3": "https://github.com/appwoodpecker/woodpecker-ios/releases/download/1.2.3/WoodpeckerMacOS.framework.zip" 4 | } -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/A/Headers/WoodpeckerMacOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // WoodpeckerMacOS.h 3 | // WoodpeckerMacOS 4 | // 5 | // Created by 张小刚 on 2019/5/25. 6 | // Copyright © 2019 lifebetter. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for WoodpeckerMacOS. 12 | FOUNDATION_EXPORT double WoodpeckerMacOSVersionNumber; 13 | 14 | //! Project version string for WoodpeckerMacOS. 15 | FOUNDATION_EXPORT const unsigned char WoodpeckerMacOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module WoodpeckerMacOS { 2 | umbrella header "WoodpeckerMacOS.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/A/Resources/ADHMacConnectViewController.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacOS.framework/Versions/A/Resources/ADHMacConnectViewController.nib -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/A/Resources/ADHMacRemoteServiceCell.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacOS.framework/Versions/A/Resources/ADHMacRemoteServiceCell.nib -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/A/Resources/Assets.car: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacOS.framework/Versions/A/Resources/Assets.car -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 18G95 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | WoodpeckerMacOS 11 | CFBundleIdentifier 12 | lifebetter.WoodpeckerMacOS 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | WoodpeckerMacOS 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.2.3 21 | CFBundleSupportedPlatforms 22 | 23 | MacOSX 24 | 25 | CFBundleVersion 26 | 3 27 | DTCompiler 28 | com.apple.compilers.llvm.clang.1_0 29 | DTPlatformBuild 30 | 10E125 31 | DTPlatformVersion 32 | GM 33 | DTSDKBuild 34 | 18E219 35 | DTSDKName 36 | macosx10.14 37 | DTXcode 38 | 1020 39 | DTXcodeBuild 40 | 10E125 41 | NSHumanReadableCopyright 42 | Copyright © 2019 lifebetter. All rights reserved. 43 | 44 | 45 | -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/A/WoodpeckerMacOS: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/appwoodpecker/woodpecker-ios/ddcafd89d7cfb81966492765f840f418897bea57/WoodpeckerMacOS.framework/Versions/A/WoodpeckerMacOS -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/A/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | Resources/ADHMacConnectViewController.nib 8 | 9 | xv4hw5K05XweFL8yo4SvhRe6iuA= 10 | 11 | Resources/ADHMacRemoteServiceCell.nib 12 | 13 | PwT+Vf/3uiEQ07kEoB+bxctC3ig= 14 | 15 | Resources/Assets.car 16 | 17 | drF2c1X3KZ8G8rfjj/ZCG8dtmsA= 18 | 19 | Resources/Info.plist 20 | 21 | h8fXUtx7BucUT2L+BZd0cDra6z0= 22 | 23 | 24 | files2 25 | 26 | Headers/WoodpeckerMacOS.h 27 | 28 | hash 29 | 30 | IJgaVpTyl/wSjxnxiMzm1KAAe/0= 31 | 32 | hash2 33 | 34 | 0aVl9RUwy9K0vZYxWDDsjJn+YoLAOseRV1Pqrp+cw8Q= 35 | 36 | 37 | Modules/module.modulemap 38 | 39 | hash 40 | 41 | Vfrh7l2Yqto0AXGSDnRurzVWQQI= 42 | 43 | hash2 44 | 45 | VXf9mIvGL2chs9uSGGZyBkYt4C5rHITxOg5NhaWDWr0= 46 | 47 | 48 | Resources/ADHMacConnectViewController.nib 49 | 50 | hash 51 | 52 | xv4hw5K05XweFL8yo4SvhRe6iuA= 53 | 54 | hash2 55 | 56 | BBy+7WaykV/J1lSxuCpIjxy/OxR+kpM860OBLraHnc4= 57 | 58 | 59 | Resources/ADHMacRemoteServiceCell.nib 60 | 61 | hash 62 | 63 | PwT+Vf/3uiEQ07kEoB+bxctC3ig= 64 | 65 | hash2 66 | 67 | 9nPygjKQXftdZ53UuKfToGJUkHmdxdQQK3k9yIITKDs= 68 | 69 | 70 | Resources/Assets.car 71 | 72 | hash 73 | 74 | drF2c1X3KZ8G8rfjj/ZCG8dtmsA= 75 | 76 | hash2 77 | 78 | G+QlMVdOTbGAl4WNOQMcKRSdeLnb8YNHNhHEVcFyFDM= 79 | 80 | 81 | Resources/Info.plist 82 | 83 | hash 84 | 85 | h8fXUtx7BucUT2L+BZd0cDra6z0= 86 | 87 | hash2 88 | 89 | 4dyjAzSCCcyBX0c+lIL+HfyNWNm3H7ugEdSFjBMqlFE= 90 | 91 | 92 | 93 | rules 94 | 95 | ^Resources/ 96 | 97 | ^Resources/.*\.lproj/ 98 | 99 | optional 100 | 101 | weight 102 | 1000 103 | 104 | ^Resources/.*\.lproj/locversion.plist$ 105 | 106 | omit 107 | 108 | weight 109 | 1100 110 | 111 | ^Resources/Base\.lproj/ 112 | 113 | weight 114 | 1010 115 | 116 | ^version.plist$ 117 | 118 | 119 | rules2 120 | 121 | .*\.dSYM($|/) 122 | 123 | weight 124 | 11 125 | 126 | ^(.*/)?\.DS_Store$ 127 | 128 | omit 129 | 130 | weight 131 | 2000 132 | 133 | ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ 134 | 135 | nested 136 | 137 | weight 138 | 10 139 | 140 | ^.* 141 | 142 | ^Info\.plist$ 143 | 144 | omit 145 | 146 | weight 147 | 20 148 | 149 | ^PkgInfo$ 150 | 151 | omit 152 | 153 | weight 154 | 20 155 | 156 | ^Resources/ 157 | 158 | weight 159 | 20 160 | 161 | ^Resources/.*\.lproj/ 162 | 163 | optional 164 | 165 | weight 166 | 1000 167 | 168 | ^Resources/.*\.lproj/locversion.plist$ 169 | 170 | omit 171 | 172 | weight 173 | 1100 174 | 175 | ^Resources/Base\.lproj/ 176 | 177 | weight 178 | 1010 179 | 180 | ^[^/]+$ 181 | 182 | nested 183 | 184 | weight 185 | 10 186 | 187 | ^embedded\.provisionprofile$ 188 | 189 | weight 190 | 20 191 | 192 | ^version\.plist$ 193 | 194 | weight 195 | 20 196 | 197 | 198 | 199 | 200 | -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /WoodpeckerMacOS.framework/WoodpeckerMacOS: -------------------------------------------------------------------------------- 1 | Versions/Current/WoodpeckerMacOS -------------------------------------------------------------------------------- /WoodpeckerMacOS.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | 3 | s.name = "WoodpeckerMacOS" 4 | s.version = "1.2.3" 5 | s.summary = "MacOS framework for Woodpekcer" 6 | 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..." 7 | s.homepage = "http://www.woodpeck.cn" 8 | s.authors = { "Woodpecker" => "woodperckerapp@163.com" } 9 | s.platform = :osx, "10.11" 10 | s.source = { :git => "https://github.com/appwoodpecker/woodpecker-ios.git", :tag => "#{s.version}" } 11 | s.vendored_frameworks = "WoodpeckerMacOS.framework" 12 | s.license = { :type => 'Copyright', :file => 'LICENSE' } 13 | 14 | end 15 | --------------------------------------------------------------------------------