├── .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 | 
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 |
--------------------------------------------------------------------------------