[
  {
    "path": ".gitignore",
    "content": "\n# Created by https://www.gitignore.io/api/xcode,macos,objective-c\n\n### macOS ###\n*.DS_Store\n.AppleDouble\n.LSOverride\n\n# Icon must end with two \\r\nIcon\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n.com.apple.timemachine.donotpresent\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\n\n### Objective-C ###\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xccheckout\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n# CocoaPods - Refactored to standalone file\n\n\n# Carthage - Refactored to standalone file\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\n\n# Code Injection\n#\n# After new code Injection tools there's a generated folder /iOSInjectionProject\n# https://github.com/johnno1962/injectionforxcode\n\niOSInjectionProject/\n\n### Objective-C Patch ###\n\n### Xcode ###\n# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\n\n## Various settings\n\n## Other\n\n### Xcode Patch ###\n*.xcodeproj/*\n!*.xcodeproj/project.pbxproj\n!*.xcodeproj/xcshareddata/\n!*.xcworkspace/contents.xcworkspacedata\n/*.gcno\n\n\n# End of https://www.gitignore.io/api/xcode,macos,objective-c"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2018 dequan1331\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "_**This repo will no longer be updated. The new versions has been moved to [HybridPageKit](https://github.com/dequan1331/HybridPageKit) as a submodule. Integrate ' HybridPageKit/WKWebViewExtension ' subspecs with Cocoapods.**_\n\n***\n\n<br>\n<br>\n\n\n# WKWebViewExtension\n\n[Extended Reading](https://dequan1331.github.io/index-en.html) | [中文](./README_CN.md) | [扩展阅读](https://dequan1331.github.io/)\n\nAn extension for WKWebView . \n\nProviding `WKWebView MenuItems delete` 、 `WKWebView support protocol` 、 `WKWebView clear cache or iOS8` and so on.\n\n> Together with [ReusableNestingScrollview](https://github.com/dequan1331/ReusableNestingScrollview), sub repo of [HybridPageKit](https://github.com/dequan1331/HybridPageKit), which is a general sulotion of news App content page.\n\n\n## Requirements\niOS 8.0 or later\n\n\t\t\n##\tInstallation\n\n1.\tCocoaPods\n\t\n\t\tplatform :ios, '8.0'\n\t\tpod 'WKWebViewExtension'\n\n2.\tCloning the repository\n\n\t```objective-c\n\t#import <WKWebViewExtensionsDef.h>\n\t```\n\n## Features\n\n1.\tDeleteMenuItems  `iOS11 this issue has been fixed `\n\n\t\n\t\tWKWebView Support Delete System MenuItems\n   \t\tDelete System Items Without cut/copy/paste/delete\n   \t\t\n\n2.\tSupportProtocol\n\n\t\tWKWebView Support Protocol Like UIWebView\n\n3.\tSafeClearCache\n\n\t\tWKWebView Support iOS8 Clear All Cache\n\t\t\n4.\tSafeScrollTo\n\n\t\tWKWebView Safe ScrollTo Specific Offset Without Blank Screen by Runloop\n\t\t\n5.\tSafeEvaluateJS\n\n\t\tSafe Evaluate JS And Retainify Webview For CallBack, and Make Sure CallBack IS NOT null\n\t\t\n6.\tExternalNavigationDelegates\n\n\t\tWKWebView Support Internal And Extenal Delegates\n\n7.\tSyncConfigUA\n\n\t\tSync Config UA Without WKWebView\n\t\t\n## Licenses\n\nAll source code is licensed under the [MIT License](https://github.com/dequan1331/WKWebViewExtension/blob/master/LICENSE)."
  },
  {
    "path": "README_CN.md",
    "content": "_**暂停更新. 相关功能作为Submodule调整到 [HybridPageKit](https://github.com/dequan1331/HybridPageKit) 项目中. 后续使用Cocoapods，集成HybridPageKit的subspecs ——'HybridPageKit/WKWebViewExtension'**_\n\n***\n\n<br>\n<br>\n\n\n# WKWebViewExtension\n\n[英文](./README.md) | [扩展阅读](https://dequan1331.github.io/) | [Extended Reading](https://dequan1331.github.io/index-en.html)\n\n\n一系列WKWebView的扩展 .\n\n提供自定义长按MenuItems Bug修复、支持NSURLProtocol、清理iOS 8浏览器缓存等功能。\n \n> 与[ReusableNestingScrollview](https://github.com/dequan1331/ReusableNestingScrollview)一起，组件服务于[HybridPageKit](https://github.com/dequan1331/HybridPageKit)，一个资讯类内容底层页完善的通用组件。\n\n## 配置\n\niOS 8.0 or later\n\n\t\t\n##\t安装\n\n1.\tCocoaPods\n\t\n\t\tplatform :ios, '8.0'\n\t\tpod 'WKWebViewExtension'\n\n2.\t下载repo并引入头文件\n\n\t```objective-c\n\t#import <WKWebViewExtensionsDef.h>\n\t```\n\n## 特点\n\n1.\t自定义长按MenuItems Bug修复  `iOS11系统已修复`\n\n\t\n\t\t自定义长按MenuItems Bug修复，iOS11前部分Item无法删除\n   \t\t\n\n2.\t支持NSURLProtocol\n\n\t\t支持NSURLProtocol\n\n3.\t清理浏览器缓存\n\n\t\t支持iOS 8 删除全部浏览器缓存\n\t\t\n4.\t安全滚动\n\n\t\t通过Runloop检测WebView的ContentSize是否大于滚动距离，自动滚动或等待重试\n\t\t\n5.\t安全执行JS\n\n\t\t防止WebView异步执行JS回调时，WebView释放导致Crash，容错JS执行回调null对象\n\t\t\n6.\t扩展Navigation Delegate\n\n\t\t通过代理分发，扩展Navigation Delegate，支持业务层级外部Delegate以及内部服务于JS Bridge的Delegate\n\n7.\t同步配置WebView UA\n\n\t\t扩展通过UIWebView同步配置UA，防止异步执行产生时序问题。\n\t\t\n## 证书\n\nAll source code is licensed under the [MIT License](https://github.com/dequan1331/WKWebViewExtension/blob/master/LICENSE)."
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/AppDelegate.h",
    "content": "//\n//  WKWebView + DeleteMenuItems.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface AppDelegate : UIResponder <UIApplicationDelegate>\n\n@property (strong, nonatomic) UIWindow *window;\n\n\n@end\n\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/AppDelegate.m",
    "content": "//\n//  WKWebView + DeleteMenuItems.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"AppDelegate.h\"\n#import \"ViewController.h\"\n\n@interface AppDelegate ()\n\n@end\n\n@implementation AppDelegate\n\n\n- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {\n    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];\n    self.window.rootViewController = [[ViewController alloc]init];\n    [self.window makeKeyAndVisible];\n    return YES;\n}\n\n\n- (void)applicationWillResignActive:(UIApplication *)application {\n    // 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.\n    // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.\n}\n\n\n- (void)applicationDidEnterBackground:(UIApplication *)application {\n    // 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.\n    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.\n}\n\n\n- (void)applicationWillEnterForeground:(UIApplication *)application {\n    // 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.\n}\n\n\n- (void)applicationDidBecomeActive:(UIApplication *)application {\n    // 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.\n}\n\n\n- (void)applicationWillTerminate:(UIApplication *)application {\n    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.\n}\n\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Example/ViewController.h",
    "content": "//\n//  WKWebView + DeleteMenuItems.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n\n@interface ViewController : UIViewController\n@end\n\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Example/ViewController.m",
    "content": "//\n//  WKWebView + DeleteMenuItems.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"ViewController.h\"\n#import \"WebView.h\"\n@interface DelegateHandler:NSObject <WKNavigationDelegate>\n@end\n@implementation DelegateHandler\n- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{\n    NSLog(@\"External delegate\");\n}\n@end\n\n@interface ViewController ()<WKNavigationDelegate>\n@property(nonatomic,strong,readwrite)WKWebView *webView;\n@property(nonatomic,strong,readwrite)DelegateHandler *externalDelegate;\n@end\n\n@implementation ViewController\n\n- (void)viewDidLoad {\n    [super viewDidLoad];\n    \n    _externalDelegate = _externalDelegate = [[DelegateHandler alloc]init];\n    \n    [self.view addSubview:({\n        _webView = [[WebView alloc]initWithFrame:self.view.bounds];\n        [_webView useExternalNavigationDelegate];\n        [_webView setMainNavigationDelegate:self];\n        [_webView addExternalNavigationDelegate:_externalDelegate];\n        [_webView loadHTMLString:[self _getHtmlString] baseURL:nil];\n        _webView;\n    })];\n}\n\n- (NSString *)_getHtmlString{\n    NSMutableString *htmlString = @\"<!DOCTYPE html><html><head><meta name=\\\"viewport\\\" content=\\\"initial-scale=1.0, width=device-width, user-scalable=no,viewport-fit=cover\\\"/></head><body><br><br>\".mutableCopy;\n    for (int i = 0; i<3; i++) {\n        [htmlString appendString:@\"<h1 align=\\\"center\\\" style=\\\"color:rgb(28,135,219)\\\">HybridPageKit</h1><h4 align=\\\"center\\\">WKWebViewExtension</h4>\"];\n    }\n    [htmlString appendString:@\"<br><h3 align=\\\"center\\\" style=\\\"color:rgb(28,135,219)\\\">Long Press here - Test MenuItems</h3></a><br>\"];\n    [htmlString appendString:@\"<a style=\\\"text-decoration:none;color:rgb(28,135,219);width:100%;text-align:center \\\" href= \\\"https://github.com/dequan1331/HybridPageKit\\\"><h3>Click here - Test Protocol with Log</h3></a><br>\"];\n    [htmlString appendString:@\"<a style=\\\"text-decoration:none;color:rgb(28,135,219);width:100%;text-align:center \\\" href= \\\"testUA\\\"><h3>Click here - Test UA with Log</h3></a><br>\"];\n    [htmlString appendString:@\"<a style=\\\"text-decoration:none;color:rgb(28,135,219);width:100%;text-align:center \\\" href= \\\"testScroll\\\"><h3>Click here - Test Scroll</h3></a><br>\"];\n    \n    for (int i = 0; i<3; i++) {\n        [htmlString appendString:@\"<h1 align=\\\"center\\\" style=\\\"color:rgb(28,135,219)\\\">HybridPageKit</h1><h4 align=\\\"center\\\">WKWebViewExtension</h4>\"];\n    }\n    [htmlString appendString:@\"</body></html>\"];\n    return htmlString.copy;\n}\n\n#pragma mark -\n- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{\n \n    \n    if ([navigationAction.request.URL.absoluteString isEqualToString:@\"testUA\"]) {\n        decisionHandler(WKNavigationActionPolicyCancel);\n        [self.webView safeAsyncEvaluateJavaScriptString:@\"navigator.userAgent\" completionBlock:^(NSObject *result) {\n            NSLog(@\"navigator.userAgent : %@\",result);\n        }];\n        return;\n    }\n    \n    if ([navigationAction.request.URL.absoluteString isEqualToString:@\"testScroll\"]) {\n        decisionHandler(WKNavigationActionPolicyCancel);\n        [self.webView scrollToOffset:50.f maxRunloops:50 completionBlock:^(BOOL success, NSInteger loopTimes) {\n            NSLog(@\"safe scroll with %@ loops\", @(loopTimes));\n        }];\n        return;\n    }\n\n    decisionHandler(WKNavigationActionPolicyAllow);\n}\n\n- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{\n    NSLog(@\"Main delegate\");\n}\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Example/WebView.h",
    "content": "//\n//  WebView.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebViewExtensionsDef.h\"\n\n@interface WebView : WKWebView\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Example/WebView.m",
    "content": "//\n//  WebView.m\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WebView.h\"\n\n@interface WebViewProtocol : NSURLProtocol\n@end\n@implementation WebViewProtocol\n+ (BOOL)canInitWithRequest:(NSURLRequest *)request{\n    return YES;\n}\n+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {\n    return request;\n}\n- (void)startLoading{\n    NSLog(@\"WebViewProtocol start loading\");\n}\n- (void)stopLoading{\n    NSLog(@\"WebViewProtocol stop loading\");\n}\n@end\n\n@implementation WebView\n\n- (instancetype)initWithFrame:(CGRect)frame{\n    self = [super initWithFrame:frame];\n    if (self) {\n        [NSURLProtocol registerClass:[WebViewProtocol class]];\n        \n        [WKWebView fixWKWebViewMenuItems];\n        [WKWebView supportProtocolWithHTTP:YES customSchemeArray:nil];\n        [WKWebView configCustomUAWithType:kConfigUATypeAppend UAString:@\"HybridPageKit\"];\n    }\n    return self;\n}\n\n#pragma mark - UIResponder\n\n- (BOOL)canBecomeFirstResponder {\n    return YES;\n}\n\n- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {\n    if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:) ||\n               action == @selector(delete:)) {\n        return [super canPerformAction:action withSender:sender];\n    }\n    return NO;\n}\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-40@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"20x20\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-60@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-58@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"29x29\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-87@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-80@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"40x40\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-120@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-120@2x.png\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"size\" : \"60x60\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"Icon-180@3x.png\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"size\" : \"1024x1024\",\n      \"idiom\" : \"ios-marketing\",\n      \"filename\" : \"icon-1024.png\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Images.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"2436h\",\n      \"filename\" : \"375x812pt@3x.png\",\n      \"minimum-system-version\" : \"11.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"736h\",\n      \"filename\" : \"414x736pt@3x.png\",\n      \"minimum-system-version\" : \"8.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"667h\",\n      \"filename\" : \"375x667pt@2x.png\",\n      \"minimum-system-version\" : \"8.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"orientation\" : \"portrait\",\n      \"idiom\" : \"iphone\",\n      \"filename\" : \"320x480pt@2x.png\",\n      \"extent\" : \"full-screen\",\n      \"minimum-system-version\" : \"7.0\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"iphone\",\n      \"subtype\" : \"retina4\",\n      \"filename\" : \"320x568pt@2x.png\",\n      \"minimum-system-version\" : \"7.0\",\n      \"orientation\" : \"portrait\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>WKWebViewExtension</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIcons</key>\n\t<dict/>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>0.0.1</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UIRequiresFullScreen</key>\n\t<true/>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + DeleteMenuItems.h",
    "content": "//\n//  WKWebView + DeleteMenuItems.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\n@interface WKWebView (DeleteMenuItems)\n/**\n *  Fix WKWebView MenuItems\n *  Delete System Items Without cut/copy/paste/delete\n */\n+ (void)fixWKWebViewMenuItems;\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + DeleteMenuItems.m",
    "content": "//\n//  WKWebView + DeleteMenuItems.m\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + DeleteMenuItems.h\"\n#import <objc/runtime.h>\n\n@implementation WKWebView (DeleteMenuItems)\n+ (void)fixWKWebViewMenuItems {\n    \n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken,\n                  ^{\n                      Class cls = NSClassFromString([NSString stringWithFormat:@\"%@%@%@%@\", @\"W\", @\"K\", @\"Content\", @\"View\"]);\n                      if (cls) {\n\n                          SEL fixSel = @selector(canPerformAction:withSender:);\n                          Method method = class_getInstanceMethod(cls, fixSel);\n\n                          NSCAssert(NULL != method,\n                                    @\"Selector %@ not found in %@ methods of class %@.\",\n                                    NSStringFromSelector(fixSel),\n                                    class_isMetaClass(cls) ? @\"class\" : @\"instance\",\n                                    cls);\n\n                          IMP originalIMP = method_getImplementation(class_getInstanceMethod(cls,fixSel));\n                          BOOL (*originalImplementation_)(__unsafe_unretained id, SEL, SEL, id);\n\n                          IMP newIMP = imp_implementationWithBlock( ^ BOOL (__unsafe_unretained id self, SEL action, id sender){\n                              if (action == @selector(cut:) || action == @selector(copy:) ||\n                                  action == @selector(paste:) || action == @selector(delete:)) {\n                                  return ((__typeof(originalImplementation_))originalIMP)(self, fixSel,action, sender);\n                              } else {\n                                  return NO;\n                              }\n                          });\n\n                          class_replaceMethod(cls, fixSel, newIMP,  method_getTypeEncoding(method));\n                      } else {\n                          NSLog(@\"WKWebView (DeleteMenuItems) can not find valid class\");\n                      }\n                  });\n}\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + ExternalNavigationDelegates.h",
    "content": "//\n//  WKWebView + ExternalNavigationDelegates.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\n@interface WKWebView (ExternalNavigationDelegates)\n\n- (void) useExternalNavigationDelegate;\n- (void) unUseExternalNavigationDelegate;\n\n@property(nonatomic, weak) id<WKNavigationDelegate> mainNavigationDelegate;\n\n- (void)addExternalNavigationDelegate:(id<WKNavigationDelegate>)delegate;\n- (void)removeExternalNavigationDelegate:(id<WKNavigationDelegate>)delegate;\n- (BOOL)containsExternalNavigationDelegate:(id<WKNavigationDelegate>)delegate;\n- (void)clearExternalNavigationDelegates;\n\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + ExternalNavigationDelegates.m",
    "content": "//\n//  WKWebView + ExternalNavigationDelegates.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + ExternalNavigationDelegates.h\"\n#import <objc/runtime.h>\n\n@interface _WKWebViewDelegateDispatcher : NSObject<WKNavigationDelegate>\n\n@property(nonatomic, weak, readwrite) id<WKNavigationDelegate> mainNavigationDelegate;\n@property(nonatomic, strong, readwrite) NSHashTable *weakNavigationDelegates;\n\n- (void)addNavigationDelegate:(id<WKNavigationDelegate>)delegate;\n- (void)removeNavigationDelegate:(id<WKNavigationDelegate>)delegate;\n- (BOOL)containNavigationDelegate:(id<WKNavigationDelegate>)delegate;\n- (void)removeAllNavigationDelegate;\n\n@end\n\n@implementation _WKWebViewDelegateDispatcher\n\n- (instancetype)init {\n    self = [super init];\n    if (self) {\n        _weakNavigationDelegates = [NSHashTable hashTableWithOptions:NSPointerFunctionsWeakMemory];\n    }\n    return self;\n}\n\n#pragma mark -\n- (void)addNavigationDelegate:(id<WKNavigationDelegate>)delegate {\n    if (delegate && ![self.weakNavigationDelegates.allObjects containsObject:delegate]) {\n        [_weakNavigationDelegates addObject:delegate];\n    }\n}\n- (void)removeNavigationDelegate:(id<WKNavigationDelegate>)delegate {\n    if (delegate) {\n        [_weakNavigationDelegates removeObject:delegate];\n    }\n}\n- (BOOL)containNavigationDelegate:(id<WKNavigationDelegate>)delegate {\n    return delegate ? [_weakNavigationDelegates.allObjects containsObject:delegate] : NO;\n}\n- (void)removeAllNavigationDelegate {\n    for (id<WKNavigationDelegate> delegate in _weakNavigationDelegates) {\n        [_weakNavigationDelegates removeObject:delegate];\n    }\n}\n\n\n#pragma mark -\n\n- (void)webView:(WKWebView *)webView\ndecidePolicyForNavigationAction:(WKNavigationAction *)navigationAction\ndecisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {\n    \n    __block BOOL isResponse = NO;\n    \n    id<WKNavigationDelegate> mainDelegate = self.mainNavigationDelegate;\n    \n    if ([mainDelegate respondsToSelector:_cmd]) {\n        [mainDelegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];\n        isResponse = YES;\n    } else {\n        for (id delegate in self.weakNavigationDelegates.allObjects) {\n            if ([delegate respondsToSelector:_cmd]) {\n                [delegate webView:webView decidePolicyForNavigationAction:navigationAction decisionHandler:decisionHandler];\n                isResponse = YES;\n            }\n        };\n    }\n    \n    if (!isResponse) {\n        // for webview reuse\n        decisionHandler(WKNavigationActionPolicyAllow);\n    }\n}\n\n- (void)webView:(WKWebView *)webView\ndecidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse\ndecisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {\n    decisionHandler(WKNavigationResponsePolicyAllow);\n}\n\n- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {\n    \n    id<WKNavigationDelegate> mainDelegate = self.mainNavigationDelegate;\n    \n    if ([mainDelegate respondsToSelector:_cmd]) {\n        [mainDelegate webView:webView didCommitNavigation:navigation];\n    }\n    \n    for (id delegate in self.weakNavigationDelegates.allObjects) {\n        if ([delegate respondsToSelector:_cmd]) {\n            [delegate webView:webView didCommitNavigation:navigation];\n        }\n    };\n}\n\n- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation {\n    \n    id<WKNavigationDelegate> mainDelegate = self.mainNavigationDelegate;\n    \n    if ([mainDelegate respondsToSelector:_cmd]) {\n        [mainDelegate webView:webView didStartProvisionalNavigation:navigation];\n    }\n    \n    for (id delegate in self.weakNavigationDelegates.allObjects) {\n        if ([delegate respondsToSelector:_cmd]) {\n            [delegate webView:webView didStartProvisionalNavigation:navigation];\n        }\n    };\n}\n\n- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {\n    \n    id<WKNavigationDelegate> mainDelegate = self.mainNavigationDelegate;\n    \n    if ([mainDelegate respondsToSelector:_cmd]) {\n        [mainDelegate webView:webView didFinishNavigation:navigation];\n    }\n    \n    for (id delegate in self.weakNavigationDelegates.allObjects) {\n        if ([delegate respondsToSelector:_cmd]) {\n            [delegate webView:webView didFinishNavigation:navigation];\n        }\n    };\n}\n\n- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error {\n    \n    id<WKNavigationDelegate> mainDelegate = self.mainNavigationDelegate;\n    \n    if ([mainDelegate respondsToSelector:_cmd]) {\n        [mainDelegate webView:webView didFailNavigation:navigation withError:error];\n    }\n    \n    for (id delegate in self.weakNavigationDelegates.allObjects) {\n        if ([delegate respondsToSelector:_cmd]) {\n            [delegate webView:webView didFailNavigation:navigation withError:error];\n        }\n    };\n}\n\n- (void)webView:(WKWebView *)webView\ndidFailProvisionalNavigation:(WKNavigation *)navigation\n      withError:(NSError *)error {\n    \n    id<WKNavigationDelegate> mainDelegate = self.mainNavigationDelegate;\n    \n    if ([mainDelegate respondsToSelector:_cmd]) {\n        [mainDelegate webView:webView didFailProvisionalNavigation:navigation withError:error];\n    }\n    \n    for (id delegate in self.weakNavigationDelegates.allObjects) {\n        if ([delegate respondsToSelector:_cmd]) {\n            [delegate webView:webView didFailProvisionalNavigation:navigation withError:error];\n        }\n    };\n}\n\n- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView {\n#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000\n    if (@available(iOS 9.0, *)) {\n        id<WKNavigationDelegate> mainDelegate = self.mainNavigationDelegate;\n        \n        if ([mainDelegate respondsToSelector:_cmd]) {\n            [mainDelegate webViewWebContentProcessDidTerminate:webView];\n        }\n        \n        for (id delegate in self.weakNavigationDelegates.allObjects) {\n            if ([delegate respondsToSelector:_cmd]) {\n                [delegate webViewWebContentProcessDidTerminate:webView];\n            }\n        };\n    }\n#endif\n}\n\n- (void)webView:(WKWebView *)webView\ndidReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation {\n    \n    id<WKNavigationDelegate> mainDelegate = self.mainNavigationDelegate;\n    \n    if ([mainDelegate respondsToSelector:_cmd]) {\n        [mainDelegate webView:webView didReceiveServerRedirectForProvisionalNavigation:navigation];\n    }\n    \n    for (id delegate in self.weakNavigationDelegates.allObjects) {\n        if ([delegate respondsToSelector:_cmd]) {\n            [delegate webView:webView didReceiveServerRedirectForProvisionalNavigation:navigation];\n        }\n    };\n}\n\n@end\n\n#pragma mark -\n#pragma mark -\n\n@interface WKWebView()\n@property(nonatomic, assign, readwrite) BOOL isUseExternalDelegate;\n@property(nonatomic, strong, readwrite) _WKWebViewDelegateDispatcher *delegateDispatcher;\n@property(nonatomic, strong, readwrite) id<WKNavigationDelegate> originalNavigationDelegate;\n@end\n\n@implementation WKWebView (ExternalNavigationDelegates)\n\n- (void)setIsUseExternalDelegate:(BOOL)isUseExternalDelegate{\n    objc_setAssociatedObject(self, @\"isUseExternalDelegate\", @(isUseExternalDelegate), OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n- (BOOL)isUseExternalDelegate{\n    NSNumber *isUseExternalDelegate = objc_getAssociatedObject(self, @\"isUseExternalDelegate\");\n    return isUseExternalDelegate.boolValue;\n}\n\n- (void)setDelegateDispatcher:(_WKWebViewDelegateDispatcher *)delegateDispatcher{\n    objc_setAssociatedObject(self, @\"delegateDispatcher\", delegateDispatcher, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n- (_WKWebViewDelegateDispatcher *)delegateDispatcher{\n    return objc_getAssociatedObject(self, @\"delegateDispatcher\");\n}\n\n- (void)setOriginalNavigationDelegate:(id<WKNavigationDelegate>)originalNavigationDelegate{\n    objc_setAssociatedObject(self, @\"originalNavigationDelegate\", originalNavigationDelegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n- (id<WKNavigationDelegate>)originalNavigationDelegate{\n    return objc_getAssociatedObject(self, @\"originalNavigationDelegate\");\n}\n\n- (void)useExternalNavigationDelegate{\n    \n    if ([self isUseExternalDelegate] && [self delegateDispatcher]) {\n        return;\n    }\n    \n    [self setDelegateDispatcher:[[_WKWebViewDelegateDispatcher alloc] init]];\n    [self setOriginalNavigationDelegate:self.navigationDelegate];\n    \n    [self setNavigationDelegate:[self delegateDispatcher]];\n    [[self delegateDispatcher] addNavigationDelegate:[self originalNavigationDelegate]];\n    \n    [self setIsUseExternalDelegate:YES];\n}\n- (void)unUseExternalNavigationDelegate{\n    \n    [self setNavigationDelegate:[self originalNavigationDelegate]];\n    \n    [self setDelegateDispatcher:nil];\n    [self setIsUseExternalDelegate:NO];\n}\n- (void)setMainNavigationDelegate:(id<WKNavigationDelegate>)mainDelegate {\n    [self delegateDispatcher].mainNavigationDelegate = mainDelegate;\n}\n- (id<WKNavigationDelegate>)mainNavigationDelegate {\n    return [self delegateDispatcher].mainNavigationDelegate;\n}\n- (void)addExternalNavigationDelegate:(id<WKNavigationDelegate>)delegate {\n    [[self delegateDispatcher] addNavigationDelegate:delegate];\n}\n- (void)removeExternalNavigationDelegate:(id<WKNavigationDelegate>)delegate {\n    [[self delegateDispatcher] removeNavigationDelegate:delegate];\n}\n- (BOOL)containsExternalNavigationDelegate:(id<WKNavigationDelegate>)delegate {\n    return [[self delegateDispatcher] containNavigationDelegate:delegate];\n}\n- (void)clearExternalNavigationDelegates {\n    [[self delegateDispatcher] removeAllNavigationDelegate];\n}\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SafeClearCache.h",
    "content": "//\n//  WKWebView + SafeClearCache.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\n@interface WKWebView (SafeClearCache)\n/**\n *  WKWebView Clear All Cache Include iOS8\n */\n+ (void)safeClearAllCache;\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SafeClearCache.m",
    "content": "//\n//  WKWebView + SafeClearCache.m\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + SafeClearCache.h\"\n\n@implementation WKWebView (SafeClearCache)\n\n+ (void)safeClearAllCache {\n    \n    if ([[NSProcessInfo processInfo] operatingSystemVersion].majorVersion > 9){\n#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000\n        if (@available(iOS 9.0, *)) {\n            NSSet *websiteDataTypes = [NSSet setWithArray:@[\n                                                            WKWebsiteDataTypeMemoryCache,\n                                                            WKWebsiteDataTypeSessionStorage,\n                                                            WKWebsiteDataTypeDiskCache,\n                                                            WKWebsiteDataTypeOfflineWebApplicationCache,\n                                                            WKWebsiteDataTypeCookies,\n                                                            WKWebsiteDataTypeLocalStorage,\n                                                            WKWebsiteDataTypeIndexedDBDatabases,\n                                                            WKWebsiteDataTypeWebSQLDatabases\n                                                            ]];\n            \n            NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];\n            [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes\n                                                       modifiedSince:dateFrom\n                                                   completionHandler:^{\n                                                       NSLog(@\"WKWebView (SafeClearCache) Clear All Cache Done\");\n                                          }];\n        }\n#endif\n    } else {\n        // iOS8\n        NSSet *websiteDataTypes = [NSSet setWithArray:@[\n                                                        @\"WKWebsiteDataTypeCookies\",\n                                                        @\"WKWebsiteDataTypeLocalStorage\",\n                                                        @\"WKWebsiteDataTypeIndexedDBDatabases\",\n                                                        @\"WKWebsiteDataTypeWebSQLDatabases\"\n                                                        ]];\n        for (NSString *type in websiteDataTypes) {\n            clearWebViewCacheFolderByType(type);\n        }\n    }\n}\n\nstatic inline void clearWebViewCacheFolderByType(NSString *cacheType) {\n    \n    static dispatch_once_t once;\n    static NSDictionary *cachePathMap = nil;\n\n    dispatch_once(&once,\n                  ^{\n                      NSString *bundleId = [NSBundle mainBundle].infoDictionary[(NSString *)kCFBundleIdentifierKey];\n                      NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];\n                      NSString *storageFileBasePath = [libraryPath stringByAppendingPathComponent:\n                                                       [NSString stringWithFormat:@\"WebKit/%@/WebsiteData/\", bundleId]];\n                      \n                      cachePathMap = @{@\"WKWebsiteDataTypeCookies\":\n                                       [libraryPath stringByAppendingPathComponent:@\"Cookies/Cookies.binarycookies\"],\n                                       @\"WKWebsiteDataTypeLocalStorage\":\n                                       [storageFileBasePath stringByAppendingPathComponent:@\"LocalStorage\"],\n                                       @\"WKWebsiteDataTypeIndexedDBDatabases\":\n                                       [storageFileBasePath stringByAppendingPathComponent:@\"IndexedDB\"],\n                                       @\"WKWebsiteDataTypeWebSQLDatabases\":\n                                       [storageFileBasePath stringByAppendingPathComponent:@\"WebSQL\"]\n                                       };\n                  });\n    \n    NSString *filePath = cachePathMap[cacheType];\n    if (filePath && filePath.length > 0) {\n        if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {\n            NSError *error = nil;\n            [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];\n            if (error) {\n                NSLog(@\"removed file fail: %@ ,error %@\", [filePath lastPathComponent], error);\n            }\n        }\n    }\n}\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SafeCookies.h",
    "content": "//\n//  WKWebView + SafeCookies.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\n@interface WKWebView (SafeCookies)\n\n- (void)setCookieWithName:(NSString *)name\n                    value:(NSString *)value\n                   domain:(NSString *)domain\n                     path:(NSString *)path\n              expiresDate:(NSDate *)expiresDate;\n\n- (void)deleteCookiesWithName:(NSString *)name;\n\n- (NSSet<NSString *> *)getAllCustomCookiesName;\n- (void)deleteAllCustomCookies;\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SafeCookies.m",
    "content": "//\n//  WKWebView + SafeCookies.m\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + SafeCookies.h\"\n#import \"WKWebView + SafeEvaluateJS.h\"\n#import <objc/runtime.h>\n\n@interface WKWebView()\n@property(nonatomic,strong,readwrite)NSMutableDictionary<NSString *, NSString *> *HPKCookieDic;\n@end\n\n@implementation WKWebView (SafeCookies)\n\n- (void)setHPKCookieDic:(NSMutableDictionary *)HPKCookieDic{\n    objc_setAssociatedObject(self, @\"HPKCookieDic\", HPKCookieDic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);\n}\n- (NSMutableDictionary *)HPKCookieDic{\n    NSMutableDictionary *HPKCookieDic = objc_getAssociatedObject(self, @\"HPKCookieDic\");\n    if (!HPKCookieDic) {\n        HPKCookieDic = @{}.mutableCopy;\n    }\n    return HPKCookieDic;\n}\n\n- (void)setCookieWithName:(NSString *)name\n                    value:(NSString *)value\n                   domain:(NSString *)domain\n                     path:(NSString *)path\n              expiresDate:(NSDate *)expiresDate{\n    if(!name || name.length <=0){\n        return;\n    }\n    \n    NSMutableString *cookieScript = [[NSMutableString alloc] init];\n    [cookieScript appendFormat:@\"document.cookie='%@=%@;\",name,value];\n    if(domain || domain.length > 0){\n        [cookieScript appendFormat:@\"domain=%@;\",domain];\n    }\n    if(path || path.length > 0){\n        [cookieScript appendFormat:@\"path=%@;\",path];\n    }\n    \n    [[self HPKCookieDic] setValue:cookieScript.copy forKey:name];\n    \n    if([expiresDate timeIntervalSince1970] != 0){\n        [cookieScript appendFormat:@\"expires='+(new Date(%@).toUTCString());\", @(([expiresDate timeIntervalSince1970]) * 1000)];\n    }\n    [cookieScript appendFormat:@\"\\n\"];\n\n    [self safeAsyncEvaluateJavaScriptString:cookieScript.copy];\n}\n\n- (void)deleteCookiesWithName:(NSString *)name{\n    if(!name || name.length <=0){\n        return;\n    }\n    \n    if (![[[self HPKCookieDic] allKeys] containsObject:name]) {\n        return;\n    }\n\n    NSMutableString *cookieScript = [[NSMutableString alloc] init];\n    \n    [cookieScript appendString:[[self HPKCookieDic] objectForKey:name]];\n    [cookieScript appendFormat:@\"expires='+(new Date(%@).toUTCString());\\n\",@(0)];\n    \n    [[self HPKCookieDic] removeObjectForKey:name];\n    [self safeAsyncEvaluateJavaScriptString:cookieScript.copy];\n}\n\n- (NSSet<NSString *> *)getAllCustomCookiesName{\n    return [[self HPKCookieDic] allKeys].copy;\n}\n- (void)deleteAllCustomCookies{\n    for (NSString *cookieName in [[self HPKCookieDic] allKeys]) {\n        [self deleteCookiesWithName:cookieName];\n    }\n}\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SafeEvaluateJS.h",
    "content": "//\n//  WKWebView + SafeEvaluateJS.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\ntypedef void (^SafeEvaluateJSCompletion)(NSObject *result);\n\n@interface WKWebView (SafeEvaluateJS)\n/**\n *  Safe Evaluate JS And Retainify Webview For CallBack\n */\n- (void)safeAsyncEvaluateJavaScriptString:(NSString *)script;\n\n/**\n *  Safe Evaluate JS And Retainify Webview For CallBack\n *  Make Sure CallBack IS NSString\n */\n- (void)safeAsyncEvaluateJavaScriptString:(NSString *)script completionBlock:(SafeEvaluateJSCompletion)block;\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SafeEvaluateJS.m",
    "content": "//\n//  WKWebView + SafeEvaluateJS.m\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + SafeEvaluateJS.h\"\n\n@implementation WKWebView (SafeEvaluateJS)\n\n- (void)safeAsyncEvaluateJavaScriptString:(NSString *)script{\n    [self safeAsyncEvaluateJavaScriptString:script completionBlock:nil];\n}\n- (void)safeAsyncEvaluateJavaScriptString:(NSString *)script completionBlock:(SafeEvaluateJSCompletion)block{\n    if (!script) {\n        return;\n    }\n    [self evaluateJavaScript:script\n            completionHandler:^(id result, NSError *_Nullable error) {\n                // retainify self\n                __unused __attribute__((objc_ownership(strong))) __typeof__(self) self_retain_ = self;\n                \n                if (!error) {\n                    if (block) {\n                        if (!result || [result isKindOfClass:[NSNull class]]) {\n                            block(@\"\");\n                        } else if ([result isKindOfClass:[NSObject class]]) {\n                            block((NSObject *)result);\n                        }  else {\n                            NSAssert(NO,@\"WKWebView (SafeEvaluateJS) evaluate js return type:%@,js:%@\",\n                                      NSStringFromClass([result class]),\n                                      script);\n                        }\n                    }\n                } else {\n                    NSLog(@\"WKWebView evaluate js Error : %@ %@\", error.description, script);\n                    if (block) {\n                        block(@\"\");\n                    }\n                }\n            }];\n}\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SafeScrollTo.h",
    "content": "//\n//  WKWebView + SafeScrollTo.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\ntypedef void (^SafeScrollToCompletionBlock)(BOOL success , NSInteger loopTimes);\n\n@interface WKWebView (SafeScrollTo)\n/**\n *  WKWebView Safe ScrollTo Specific Offset Without Blank Screen\n *\n *  @param offset               webView Offset\n *  @param maxRunloops          max wait runloops\n *  @param completionBlock      complete block\n */\n- (void)scrollToOffset:(CGFloat)offset\n           maxRunloops:(NSUInteger)maxRunloops\n       completionBlock:(SafeScrollToCompletionBlock)completionBlock;\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SafeScrollTo.m",
    "content": "//\n//  WKWebView + SafeScrollTo.m\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + SafeScrollTo.h\"\n\ntypedef BOOL (^RunloopUtilsConditionBlock)(void);\ntypedef void (^RunloopUtilsSuccessBlock)(NSInteger loopTimes);\ntypedef void (^RunloopUtilsFailBlock)(NSInteger loopTimes);\n\n@interface RunloopUtils : NSObject\n\n@property(nonatomic, assign, readwrite) CFRunLoopObserverRef observer;\n@property(nonatomic, assign, readwrite) CFRunLoopRef runLoop;\n\n@property(nonatomic, copy, readwrite) RunloopUtilsConditionBlock conditionBlock;\n@property(nonatomic, copy, readwrite) RunloopUtilsSuccessBlock successBlock;\n@property(nonatomic, copy, readwrite) RunloopUtilsFailBlock failBlock;\n\n@property(nonatomic, weak, readwrite) id holder;\n@property(nonatomic, assign, readwrite) NSInteger maxLoopTimes;\n@property(nonatomic, assign, readwrite) NSInteger currentLoopNum;\n\n+ (instancetype)sharedInstance;\n\n- (void)startRunloopCheckWithHolder:(id)holder\n                       MaxLoopTimes:(NSInteger)maxLoopTimes\n                          condition:(RunloopUtilsConditionBlock)conditionBlock\n                       successBlock:(RunloopUtilsSuccessBlock)successBlock\n                          failBlock:(RunloopUtilsFailBlock)failedBlock;\n\n- (void)stopRunloopCheckWithHolder:(id)holder;\n\n@end\n\n@implementation RunloopUtils\n\n+ (instancetype)sharedInstance{\n    static RunloopUtils *sharedInstance = nil;\n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken, ^{\n        sharedInstance = [[RunloopUtils alloc]init];\n    });\n    return sharedInstance;\n}\n\n- (void)dealloc {\n    if (CFRunLoopContainsObserver(CFRunLoopGetMain(), _observer, kCFRunLoopDefaultMode)) {\n        CFRunLoopRemoveObserver(CFRunLoopGetMain(), _observer, kCFRunLoopDefaultMode);\n    }\n    if (CFRunLoopObserverIsValid(_observer)) {\n        CFRunLoopObserverInvalidate(_observer);\n    }\n    if (_observer != NULL) {\n        CFRelease(_observer);\n        _observer = NULL;\n    }\n    if (_runLoop != NULL) {\n        CFRelease(_runLoop);\n        _runLoop = NULL;\n    }\n    _conditionBlock = nil;\n    _successBlock = nil;\n    _failBlock = nil;\n    _holder = nil;\n}\n\n- (instancetype)init {\n    self = [super init];\n    if (self) {\n        \n        _runLoop = (CFRunLoopRef)CFRetain(CFRunLoopGetMain());\n        \n        __weak typeof(self) weakSelf = self;\n        _observer = CFRunLoopObserverCreateWithHandler(\n                                                       NULL,\n                                                       kCFRunLoopAllActivities,\n                                                       YES,\n                                                       0,\n                                                       ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {\n                                                           switch (activity) {\n                                                               case kCFRunLoopBeforeWaiting:\n                                                                   if (weakSelf.currentLoopNum > weakSelf.maxLoopTimes) {\n                                                                       if (self.failBlock) {\n                                                                           self.failBlock(self.currentLoopNum);\n                                                                       }\n                                                                       [weakSelf _stopRetryFunction];\n                                                                   } else {\n                                                                       if (weakSelf.conditionBlock()) {\n                                                                           if (self.successBlock) {\n                                                                               self.successBlock(self.currentLoopNum);\n                                                                           }\n                                                                           [weakSelf _stopRetryFunction];\n                                                                       } else {\n                                                                           weakSelf.currentLoopNum++;\n                                                                       }\n                                                                   }\n                                                                   break;\n                                                               case kCFRunLoopExit:\n                                                                   // main runloop never exit\n                                                                   if (self.failBlock) {\n                                                                       self.failBlock(self.currentLoopNum);\n                                                                   }\n                                                                   [weakSelf _stopRetryFunction];\n                                                                   break;\n                                                               default:\n                                                                   break;\n                                                           }\n                                                       });\n    }\n    return self;\n}\n\n- (void)startRunloopCheckWithHolder:(id)holder\n                       MaxLoopTimes:(NSInteger)maxLoopTimes\n                          condition:(RunloopUtilsConditionBlock)conditionBlock\n                       successBlock:(RunloopUtilsSuccessBlock)successBlock\n                          failBlock:(RunloopUtilsFailBlock)failBlock{\n    \n    if (_observer == NULL || _runLoop == NULL) {\n        return;\n    }\n    \n    if (CFRunLoopContainsObserver(_runLoop, _observer, kCFRunLoopDefaultMode)) {\n        CFRunLoopRemoveObserver(_runLoop, _observer, kCFRunLoopDefaultMode);\n        if (self.failBlock) {\n            self.failBlock(self.currentLoopNum);\n        }\n    }\n    \n    NSParameterAssert(conditionBlock != NULL);\n    NSParameterAssert(successBlock != NULL);\n    NSParameterAssert(failBlock != NULL);\n    NSParameterAssert(holder != nil);\n    \n    _maxLoopTimes = maxLoopTimes;\n    _conditionBlock = [conditionBlock copy];\n    _successBlock = [successBlock copy];\n    _failBlock = [failBlock copy];\n    _currentLoopNum = 1;\n    _holder = holder;\n    \n    [self _beginRetryFunction];\n    \n}\n\n- (void)stopRunloopCheckWithHolder:(id)holder{\n    if (CFRunLoopContainsObserver(CFRunLoopGetMain(), _observer, kCFRunLoopDefaultMode)) {\n        if (holder == _holder) {\n            [self _stopRetryFunction];\n        } else {\n        }\n    }\n}\n\n#pragma mark - private method\n\n- (void)_beginRetryFunction {\n    \n    if (CFRunLoopContainsObserver(_runLoop, _observer, kCFRunLoopDefaultMode)) {\n        CFRunLoopRemoveObserver(_runLoop, _observer, kCFRunLoopDefaultMode);\n    }\n    \n    CFRunLoopAddObserver(_runLoop, _observer, kCFRunLoopDefaultMode);\n}\n\n- (void)_stopRetryFunction {\n    \n    if (CFRunLoopContainsObserver(CFRunLoopGetMain(), _observer, kCFRunLoopDefaultMode)) {\n        CFRunLoopRemoveObserver(CFRunLoopGetMain(), _observer, kCFRunLoopDefaultMode);\n    }\n    \n    _maxLoopTimes = 0;\n    _conditionBlock = nil;\n    _successBlock = nil;\n    _failBlock = nil;\n    _currentLoopNum = 1;\n    _holder = nil;\n}\n\n@end\n\n\n@implementation WKWebView (SafeScrollTo)\n\n- (void)scrollToOffset:(CGFloat)offset\n           maxRunloops:(NSUInteger)maxRunloops\n       completionBlock:(SafeScrollToCompletionBlock)completionBlock{\n    \n    \n    if(offset < 0 || maxRunloops <= 0){\n        NSLog(@\"WKWebView can not scroll to with invalid paras\");\n        return;\n    }\n    \n    [[RunloopUtils sharedInstance] stopRunloopCheckWithHolder:self];\n    \n    [[RunloopUtils sharedInstance] startRunloopCheckWithHolder:self MaxLoopTimes:maxRunloops condition:^BOOL{\n        return self.scrollView.contentSize.height >= offset;\n    } successBlock:^(NSInteger loopTimes) {\n        [self.scrollView setContentOffset:CGPointMake(0, offset) animated:YES];\n        if(completionBlock){\n            completionBlock(YES,loopTimes);\n        }\n    } failBlock:^(NSInteger loopTimes) {\n        if(completionBlock){\n            completionBlock(NO,loopTimes);\n        }\n    }];\n}\n\n@end\n\n\n\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SupportProtocol.h",
    "content": "//\n//  WKWebView + SupportProtocol.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\n@interface WKWebView (SupportProtocol)\n/**\n *  WKWebView Support Protocol Like UIWebView\n *\n *  @param supportHTTP         support protocol for HTTP & HTTPS\n *  @param customSchemeArray   support protocol fro custom scheme\n */\n+ (void) supportProtocolWithHTTP:(BOOL)supportHTTP\n               customSchemeArray:(NSArray<NSString *> *)customSchemeArray;\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SupportProtocol.m",
    "content": "//\n//  WKWebView + SupportProtocol.m\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + SupportProtocol.h\"\n\n@implementation WKWebView (SupportProtocol)\n\n+ (void) supportProtocolWithHTTP:(BOOL)supportHTTP\n               customSchemeArray:(NSArray<NSString *> *)customSchemeArray{\n\n    if (!supportHTTP && [customSchemeArray count] <= 0) {\n        return;\n    }\n    \n    static dispatch_once_t onceToken;\n    dispatch_once(&onceToken,\n                  ^{\n                      Class cls = NSClassFromString([NSString stringWithFormat:@\"%@%@%@%@%@\", @\"W\", @\"K\", @\"Browsing\", @\"Context\", @\"Controller\"]);\n                      SEL sel = NSSelectorFromString([NSString stringWithFormat:@\"%@%@%@%@%@\", @\"register\", @\"SchemeFor\", @\"Custom\", @\"Protocol\", @\":\"]);\n                      \n                      if (!cls || !sel || ![cls respondsToSelector:sel]) {\n                          NSLog(@\"WKWebView (SupportProtocol) has invalid cls or sel\");\n                          return;\n                      }\n                      \n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Warc-performSelector-leaks\"\n                      if (supportHTTP) {\n                          [cls performSelector:sel withObject:@\"http\"];\n                          [cls performSelector:sel withObject:@\"https\"];\n                      }\n                      \n                      for (NSString *scheme in customSchemeArray) {\n                          [cls performSelector:sel withObject:scheme];\n                      }\n#pragma clang diagnostic pop\n                  });\n}\n\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SyncConfigUA.h",
    "content": "//\n//  WKWebView + SyncConfigUA.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <Foundation/Foundation.h>\n#import <WebKit/WebKit.h>\n\ntypedef NS_ENUM (NSInteger, ConfigUAType){\n    kConfigUATypeReplace,     //replace all UA string\n    kConfigUATypeAppend,      //append to original UA string\n};\n\n@interface WKWebView (SyncConfigUA)\n/**\n *  Sync Config UA Without WKWebView\n *\n *  @param type            replace or append original UA\n *  @param customString    custom UA string\n */\n+ (void)configCustomUAWithType:(ConfigUAType)type\n                      UAString:(NSString *)customString;\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebView + SyncConfigUA.m",
    "content": "//\n//  WKWebView + SyncConfigUA.m\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + SyncConfigUA.h\"\n\n@implementation WKWebView (SyncConfigUA)\n\n+ (void)configCustomUAWithType:(ConfigUAType)type\n                      UAString:(NSString *)customString{\n    \n    if (!customString || customString.length <= 0) {\n        NSLog(@\"WKWebView (SyncConfigUA) config with invalid string\");\n        return;\n    }\n    \n    if(type == kConfigUATypeReplace){\n        NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:customString, @\"UserAgent\", nil];\n        [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];\n    }else if (type == kConfigUATypeAppend){\n        UIWebView *webView = [[UIWebView alloc] init];\n        NSString *originalUserAgent = [webView stringByEvaluatingJavaScriptFromString:@\"navigator.userAgent\"];\n        NSString *appUserAgent =\n        [NSString stringWithFormat:@\"%@-%@\", originalUserAgent, customString];\n        NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:appUserAgent, @\"UserAgent\", nil];\n        [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];\n    }else{\n        NSLog(@\"WKWebView (SyncConfigUA) config with invalid type :%@\", @(type));\n    }\n}\n\n@end\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/Source/WKWebViewExtensionsDef.h",
    "content": "//\n//  WKWebViewExtensionsDef.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import \"WKWebView + DeleteMenuItems.h\"\n#import \"WKWebView + SupportProtocol.h\"\n#import \"WKWebView + SafeClearCache.h\"\n#import \"WKWebView + SafeScrollTo.h\"\n#import \"WKWebView + SafeEvaluateJS.h\"\n#import \"WKWebView + ExternalNavigationDelegates.h\"\n#import \"WKWebView + SyncConfigUA.h\"\n#import \"WKWebView + SafeCookies.h\"\n\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension/main.m",
    "content": "//\n//  WKWebView + DeleteMenuItems.h\n//  WKWebViewExtension\n//\n//  Created by dequanzhu.\n//  Copyright © 2018 HybridPageKit. All rights reserved.\n//\n\n#import <UIKit/UIKit.h>\n#import \"AppDelegate.h\"\n\nint main(int argc, char * argv[]) {\n    @autoreleasepool {\n        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));\n    }\n}\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 48;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t5E7A05D0205EB999006CA1E9 /* WKWebView + DeleteMenuItems.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E7A05CF205EB999006CA1E9 /* WKWebView + DeleteMenuItems.m */; };\n\t\t5E7A05D6205EB9F8006CA1E9 /* WKWebView + SyncConfigUA.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E7A05D5205EB9F8006CA1E9 /* WKWebView + SyncConfigUA.m */; };\n\t\t5E7A05DC205EC434006CA1E9 /* WKWebView + ExternalNavigationDelegates.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E7A05DB205EC434006CA1E9 /* WKWebView + ExternalNavigationDelegates.m */; };\n\t\t5EAAADBD205CB80000D8EE75 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EAAADBC205CB80000D8EE75 /* AppDelegate.m */; };\n\t\t5EAAADC0205CB80000D8EE75 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EAAADBF205CB80000D8EE75 /* ViewController.m */; };\n\t\t5EAAADCB205CB80000D8EE75 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EAAADCA205CB80000D8EE75 /* main.m */; };\n\t\t5EAAADF1205CBB5200D8EE75 /* WKWebView + SafeEvaluateJS.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EAAADE0205CBB5100D8EE75 /* WKWebView + SafeEvaluateJS.m */; };\n\t\t5EAAADF2205CBB5200D8EE75 /* WKWebView + SafeScrollTo.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EAAADE2205CBB5100D8EE75 /* WKWebView + SafeScrollTo.m */; };\n\t\t5EAAADF5205CBB5200D8EE75 /* WKWebView + SafeClearCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EAAADEA205CBB5200D8EE75 /* WKWebView + SafeClearCache.m */; };\n\t\t5EAAADF8205CBB5200D8EE75 /* WKWebView + SupportProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EAAADF0205CBB5200D8EE75 /* WKWebView + SupportProtocol.m */; };\n\t\t5EC64FE3206BA5CD0079B197 /* WKWebView + SafeCookies.m in Sources */ = {isa = PBXBuildFile; fileRef = 5EC64FE2206BA5CD0079B197 /* WKWebView + SafeCookies.m */; };\n\t\tB944DC35206A353000BD0F06 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B944DC34206A353000BD0F06 /* Images.xcassets */; };\n\t\tB94ECF5F206A55CA0023245F /* WebView.m in Sources */ = {isa = PBXBuildFile; fileRef = B94ECF5E206A55CA0023245F /* WebView.m */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t5EAAADD1205CB80000D8EE75 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 5EAAADB0205CB80000D8EE75 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 5EAAADB7205CB80000D8EE75;\n\t\t\tremoteInfo = WKWebViewExtension;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t5E7A05CE205EB999006CA1E9 /* WKWebView + DeleteMenuItems.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"WKWebView + DeleteMenuItems.h\"; sourceTree = \"<group>\"; };\n\t\t5E7A05CF205EB999006CA1E9 /* WKWebView + DeleteMenuItems.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"WKWebView + DeleteMenuItems.m\"; sourceTree = \"<group>\"; };\n\t\t5E7A05D4205EB9F8006CA1E9 /* WKWebView + SyncConfigUA.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"WKWebView + SyncConfigUA.h\"; sourceTree = \"<group>\"; };\n\t\t5E7A05D5205EB9F8006CA1E9 /* WKWebView + SyncConfigUA.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"WKWebView + SyncConfigUA.m\"; sourceTree = \"<group>\"; };\n\t\t5E7A05DA205EC434006CA1E9 /* WKWebView + ExternalNavigationDelegates.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"WKWebView + ExternalNavigationDelegates.h\"; sourceTree = \"<group>\"; };\n\t\t5E7A05DB205EC434006CA1E9 /* WKWebView + ExternalNavigationDelegates.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"WKWebView + ExternalNavigationDelegates.m\"; sourceTree = \"<group>\"; };\n\t\t5EAAADB8205CB80000D8EE75 /* WKWebViewExtension.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKWebViewExtension.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5EAAADBB205CB80000D8EE75 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = \"<group>\"; };\n\t\t5EAAADBC205CB80000D8EE75 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = \"<group>\"; };\n\t\t5EAAADBE205CB80000D8EE75 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = \"<group>\"; };\n\t\t5EAAADBF205CB80000D8EE75 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = \"<group>\"; };\n\t\t5EAAADC9205CB80000D8EE75 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t5EAAADCA205CB80000D8EE75 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = \"<group>\"; };\n\t\t5EAAADD0205CB80000D8EE75 /* WKWebViewExtensionTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WKWebViewExtensionTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5EAAADE0205CBB5100D8EE75 /* WKWebView + SafeEvaluateJS.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"WKWebView + SafeEvaluateJS.m\"; sourceTree = \"<group>\"; };\n\t\t5EAAADE1205CBB5100D8EE75 /* WKWebView + SafeClearCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"WKWebView + SafeClearCache.h\"; sourceTree = \"<group>\"; };\n\t\t5EAAADE2205CBB5100D8EE75 /* WKWebView + SafeScrollTo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"WKWebView + SafeScrollTo.m\"; sourceTree = \"<group>\"; };\n\t\t5EAAADE6205CBB5200D8EE75 /* WKWebView + SafeEvaluateJS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"WKWebView + SafeEvaluateJS.h\"; sourceTree = \"<group>\"; };\n\t\t5EAAADE7205CBB5200D8EE75 /* WKWebView + SupportProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"WKWebView + SupportProtocol.h\"; sourceTree = \"<group>\"; };\n\t\t5EAAADEA205CBB5200D8EE75 /* WKWebView + SafeClearCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"WKWebView + SafeClearCache.m\"; sourceTree = \"<group>\"; };\n\t\t5EAAADEB205CBB5200D8EE75 /* WKWebView + SafeScrollTo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = \"WKWebView + SafeScrollTo.h\"; sourceTree = \"<group>\"; };\n\t\t5EAAADED205CBB5200D8EE75 /* WKWebViewExtensionsDef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebViewExtensionsDef.h; sourceTree = \"<group>\"; };\n\t\t5EAAADF0205CBB5200D8EE75 /* WKWebView + SupportProtocol.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = \"WKWebView + SupportProtocol.m\"; sourceTree = \"<group>\"; };\n\t\t5EC64FE1206BA5CD0079B197 /* WKWebView + SafeCookies.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = \"WKWebView + SafeCookies.h\"; sourceTree = \"<group>\"; };\n\t\t5EC64FE2206BA5CD0079B197 /* WKWebView + SafeCookies.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = \"WKWebView + SafeCookies.m\"; sourceTree = \"<group>\"; };\n\t\tB944DC34206A353000BD0F06 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\tB94ECF5D206A55CA0023245F /* WebView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WebView.h; sourceTree = \"<group>\"; };\n\t\tB94ECF5E206A55CA0023245F /* WebView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WebView.m; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t5EAAADB5205CB80000D8EE75 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5EAAADCD205CB80000D8EE75 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t5EAAADAF205CB80000D8EE75 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5EAAADBA205CB80000D8EE75 /* WKWebViewExtension */,\n\t\t\t\t5EAAADB9205CB80000D8EE75 /* Products */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5EAAADB9205CB80000D8EE75 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5EAAADB8205CB80000D8EE75 /* WKWebViewExtension.app */,\n\t\t\t\t5EAAADD0205CB80000D8EE75 /* WKWebViewExtensionTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5EAAADBA205CB80000D8EE75 /* WKWebViewExtension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5EE6AFA2206A8A5A004B7A5B /* Example */,\n\t\t\t\t5EAAADDF205CBAD800D8EE75 /* Source */,\n\t\t\t\t5EAAADBB205CB80000D8EE75 /* AppDelegate.h */,\n\t\t\t\t5EAAADBC205CB80000D8EE75 /* AppDelegate.m */,\n\t\t\t\t5EAAADC9205CB80000D8EE75 /* Info.plist */,\n\t\t\t\t5EAAADCA205CB80000D8EE75 /* main.m */,\n\t\t\t\tB944DC34206A353000BD0F06 /* Images.xcassets */,\n\t\t\t);\n\t\t\tpath = WKWebViewExtension;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5EAAADDF205CBAD800D8EE75 /* Source */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5E7A05CE205EB999006CA1E9 /* WKWebView + DeleteMenuItems.h */,\n\t\t\t\t5E7A05CF205EB999006CA1E9 /* WKWebView + DeleteMenuItems.m */,\n\t\t\t\t5EAAADE7205CBB5200D8EE75 /* WKWebView + SupportProtocol.h */,\n\t\t\t\t5EAAADF0205CBB5200D8EE75 /* WKWebView + SupportProtocol.m */,\n\t\t\t\t5EAAADE1205CBB5100D8EE75 /* WKWebView + SafeClearCache.h */,\n\t\t\t\t5EAAADEA205CBB5200D8EE75 /* WKWebView + SafeClearCache.m */,\n\t\t\t\t5EAAADEB205CBB5200D8EE75 /* WKWebView + SafeScrollTo.h */,\n\t\t\t\t5EAAADE2205CBB5100D8EE75 /* WKWebView + SafeScrollTo.m */,\n\t\t\t\t5EAAADE6205CBB5200D8EE75 /* WKWebView + SafeEvaluateJS.h */,\n\t\t\t\t5EAAADE0205CBB5100D8EE75 /* WKWebView + SafeEvaluateJS.m */,\n\t\t\t\t5E7A05DA205EC434006CA1E9 /* WKWebView + ExternalNavigationDelegates.h */,\n\t\t\t\t5E7A05DB205EC434006CA1E9 /* WKWebView + ExternalNavigationDelegates.m */,\n\t\t\t\t5E7A05D4205EB9F8006CA1E9 /* WKWebView + SyncConfigUA.h */,\n\t\t\t\t5E7A05D5205EB9F8006CA1E9 /* WKWebView + SyncConfigUA.m */,\n\t\t\t\t5EC64FE1206BA5CD0079B197 /* WKWebView + SafeCookies.h */,\n\t\t\t\t5EC64FE2206BA5CD0079B197 /* WKWebView + SafeCookies.m */,\n\t\t\t\t5EAAADED205CBB5200D8EE75 /* WKWebViewExtensionsDef.h */,\n\t\t\t);\n\t\t\tpath = Source;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5EE6AFA2206A8A5A004B7A5B /* Example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5EAAADBE205CB80000D8EE75 /* ViewController.h */,\n\t\t\t\t5EAAADBF205CB80000D8EE75 /* ViewController.m */,\n\t\t\t\tB94ECF5D206A55CA0023245F /* WebView.h */,\n\t\t\t\tB94ECF5E206A55CA0023245F /* WebView.m */,\n\t\t\t);\n\t\t\tpath = Example;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t5EAAADB7205CB80000D8EE75 /* WKWebViewExtension */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 5EAAADD9205CB80000D8EE75 /* Build configuration list for PBXNativeTarget \"WKWebViewExtension\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5EAAADB4205CB80000D8EE75 /* Sources */,\n\t\t\t\t5EAAADB5205CB80000D8EE75 /* Frameworks */,\n\t\t\t\t5EAAADB6205CB80000D8EE75 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = WKWebViewExtension;\n\t\t\tproductName = WKWebViewExtension;\n\t\t\tproductReference = 5EAAADB8205CB80000D8EE75 /* WKWebViewExtension.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t5EAAADCF205CB80000D8EE75 /* WKWebViewExtensionTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 5EAAADDC205CB80000D8EE75 /* Build configuration list for PBXNativeTarget \"WKWebViewExtensionTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5EAAADCC205CB80000D8EE75 /* Sources */,\n\t\t\t\t5EAAADCD205CB80000D8EE75 /* Frameworks */,\n\t\t\t\t5EAAADCE205CB80000D8EE75 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t5EAAADD2205CB80000D8EE75 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = WKWebViewExtensionTests;\n\t\t\tproductName = WKWebViewExtensionTests;\n\t\t\tproductReference = 5EAAADD0205CB80000D8EE75 /* WKWebViewExtensionTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t5EAAADB0205CB80000D8EE75 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 0910;\n\t\t\t\tORGANIZATIONNAME = HybridPageKit;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t5EAAADB7205CB80000D8EE75 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.1;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t\t5EAAADCF205CB80000D8EE75 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.1;\n\t\t\t\t\t\tProvisioningStyle = Automatic;\n\t\t\t\t\t\tTestTargetID = 5EAAADB7205CB80000D8EE75;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 5EAAADB3205CB80000D8EE75 /* Build configuration list for PBXProject \"WKWebViewExtension\" */;\n\t\t\tcompatibilityVersion = \"Xcode 8.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 5EAAADAF205CB80000D8EE75;\n\t\t\tproductRefGroup = 5EAAADB9205CB80000D8EE75 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t5EAAADB7205CB80000D8EE75 /* WKWebViewExtension */,\n\t\t\t\t5EAAADCF205CB80000D8EE75 /* WKWebViewExtensionTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t5EAAADB6205CB80000D8EE75 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tB944DC35206A353000BD0F06 /* Images.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5EAAADCE205CB80000D8EE75 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t5EAAADB4205CB80000D8EE75 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5EAAADF8205CBB5200D8EE75 /* WKWebView + SupportProtocol.m in Sources */,\n\t\t\t\t5EAAADF1205CBB5200D8EE75 /* WKWebView + SafeEvaluateJS.m in Sources */,\n\t\t\t\t5EAAADC0205CB80000D8EE75 /* ViewController.m in Sources */,\n\t\t\t\t5EAAADCB205CB80000D8EE75 /* main.m in Sources */,\n\t\t\t\t5EAAADF2205CBB5200D8EE75 /* WKWebView + SafeScrollTo.m in Sources */,\n\t\t\t\t5EAAADBD205CB80000D8EE75 /* AppDelegate.m in Sources */,\n\t\t\t\t5E7A05DC205EC434006CA1E9 /* WKWebView + ExternalNavigationDelegates.m in Sources */,\n\t\t\t\t5E7A05D0205EB999006CA1E9 /* WKWebView + DeleteMenuItems.m in Sources */,\n\t\t\t\tB94ECF5F206A55CA0023245F /* WebView.m in Sources */,\n\t\t\t\t5E7A05D6205EB9F8006CA1E9 /* WKWebView + SyncConfigUA.m in Sources */,\n\t\t\t\t5EC64FE3206BA5CD0079B197 /* WKWebView + SafeCookies.m in Sources */,\n\t\t\t\t5EAAADF5205CBB5200D8EE75 /* WKWebView + SafeClearCache.m in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t5EAAADCC205CB80000D8EE75 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t5EAAADD2205CB80000D8EE75 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 5EAAADB7205CB80000D8EE75 /* WKWebViewExtension */;\n\t\t\ttargetProxy = 5EAAADD1205CB80000D8EE75 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t5EAAADD7205CB80000D8EE75 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5EAAADD8205CB80000D8EE75 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.1;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t5EAAADDA205CB80000D8EE75 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = WKWebViewExtension/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.HybridPageKit.WKWebViewExtension;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE = \"\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5EAAADDB205CB80000D8EE75 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCODE_SIGN_STYLE = Manual;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tINFOPLIST_FILE = WKWebViewExtension/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 8.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.HybridPageKit.WKWebViewExtension;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tPROVISIONING_PROFILE_SPECIFIER = \"\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = 1;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t5EAAADDD205CB80000D8EE75 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tINFOPLIST_FILE = WKWebViewExtensionTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.HybridPageKit.WKWebViewExtension.WKWebViewExtensionTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/WKWebViewExtension.app/WKWebViewExtension\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5EAAADDE205CB80000D8EE75 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tINFOPLIST_FILE = WKWebViewExtensionTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = \"$(inherited) @executable_path/Frameworks @loader_path/Frameworks\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.HybridPageKit.WKWebViewExtension.WKWebViewExtensionTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/WKWebViewExtension.app/WKWebViewExtension\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t5EAAADB3205CB80000D8EE75 /* Build configuration list for PBXProject \"WKWebViewExtension\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5EAAADD7205CB80000D8EE75 /* Debug */,\n\t\t\t\t5EAAADD8205CB80000D8EE75 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t5EAAADD9205CB80000D8EE75 /* Build configuration list for PBXNativeTarget \"WKWebViewExtension\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5EAAADDA205CB80000D8EE75 /* Debug */,\n\t\t\t\t5EAAADDB205CB80000D8EE75 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t5EAAADDC205CB80000D8EE75 /* Build configuration list for PBXNativeTarget \"WKWebViewExtensionTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5EAAADDD205CB80000D8EE75 /* Debug */,\n\t\t\t\t5EAAADDE205CB80000D8EE75 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 5EAAADB0205CB80000D8EE75 /* Project object */;\n}\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:WKWebViewExtension.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "WKWebViewExtension/WKWebViewExtension.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "WKWebViewExtension.podspec",
    "content": "\nPod::Spec.new do |s|\n  s.name         = \"WKWebViewExtension\"\n  s.version      = \"0.1\"\n  s.summary      = \"An extension for WKWebView. Providing menuItems delete 、support protocol 、clear cache of iOS8 and so on.\"\n  s.homepage     = \"https://github.com/dequan1331/WKWebViewExtension\"\n  s.license      = \"MIT\"\n  s.author       = \"dequanzhu\"\n  s.platform     = :ios, \"8.0\"\n  s.source       = { :git => \"https://github.com/dequan1331/WKWebViewExtension.git\", :tag => \"0.1\" }\n  s.source_files = \"WKWebViewExtension/WKWebViewExtension/Source\", \"WKWebViewExtension/WKWebViewExtension/Source/**/*.{h,m}\"\n  s.frameworks = \"UIKit\", \"WebKit\"\nend\n"
  }
]