From abf225cec8fcd9a7f6675af139c3fdd646db67f7 Mon Sep 17 00:00:00 2001 From: wangkai168 <> Date: Tue, 2 Jun 2020 15:00:53 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0pod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 10244 -> 10244 bytes .../WKJavaScriptMessageDispatcher.m | 26 ++++--- WKJavaScriptBridge/Plugin/WKBasePlugin.h | 1 + .../WKJavaScriptBridgePluginAnnotation.h | 28 ------- .../WKJavaScriptBridgePluginAnnotation.h | 42 ++++++++++ .../WKJavaScriptBridgePluginAnnotation.m | 29 +++++-- .../Security/WKPluginSecurityProtocol.h | 30 ++++++++ WKJavaScriptBridge/WKJSBridge.js | 4 +- WKJavaScriptBridge/WKJavaScriptBridge.h | 7 -- WKJavaScriptBridge/WKJavaScriptBridge.m | 72 +++++++----------- .../WKJavaScriptBridgeProtocol.h | 25 +++++- 11 files changed, 162 insertions(+), 102 deletions(-) delete mode 100644 WKJavaScriptBridge/Rigister/WKJavaScriptBridgePluginAnnotation.h create mode 100644 WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h rename WKJavaScriptBridge/{Rigister => Security}/WKJavaScriptBridgePluginAnnotation.m (68%) create mode 100644 WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h diff --git a/.DS_Store b/.DS_Store index 1e9ac65ec3f64cc4e8ca5fecd17e003d7ad7b5dc..68d42d20b91f52e4b1698e5210ae7c11cdedb244 100644 GIT binary patch delta 54 zcmV-60LlM^P=rvhKM<2p7la5iGdL_DF*P@n%@7@v`4=RU;ua;dGZEAdvjrgh1OgBN MlPw%+vu+ib0_~y^k^lez delta 82 zcmV-Y0ImOoP=rvhKM)nmVsLC}b968;*8u_p1O)~M2nY%YlT;9B5eNxi5E^@XEipJX oEFdv5Gcc3O5FG)Vlj#s20i2WF7AUhZ5!4Q|2O# 0) { WKMsgCommand *msgCommand = [WKMsgCommand commandFromJson:_commandDictionary]; + [_bridge pluginSecurityVerityWithCommand:msgCommand completionHandler:^(BOOL passed) { + if (!passed) { + NSLog(@"WKJavaScriptBridge Error : 模块: (%@) 方法:(%@) 权限验证未通过,如需使用请申请配置。",msgCommand.className, msgCommand.methodName); + return ; + } #ifdef DEBUG - NSLog(@"WKJavaScriptBridge(%@): Calling %@.%@", msgCommand.callbackId, msgCommand.className, msgCommand.methodName); + NSLog(@"PHJavaScriptBridge(%@): Calling %@.%@", msgCommand.callbackId, msgCommand.className, msgCommand.methodName); #endif - if (![self execute:msgCommand]) { + if (![self execute:msgCommand]) { #ifdef DEBUG - NSString *commandJson = [NSString stringWithFormat:@"%@",_commandDictionary]; - static NSUInteger maxLogLength = 1024; - NSString *commandString = ([commandJson length] > maxLogLength) ? - [NSString stringWithFormat : @"%@[...]", [commandJson substringToIndex:maxLogLength]] : - commandJson; - - NSLog(@"WKJavaScriptBridge Error : FAILED pluginJSON = %@", commandString); + NSString *commandJson = [NSString stringWithFormat:@"%@",self->_commandDictionary]; + static NSUInteger maxLogLength = 1024; + NSString *commandString = ([commandJson length] > maxLogLength) ? + [NSString stringWithFormat : @"%@[...]", [commandJson substringToIndex:maxLogLength]] : + commandJson; + + NSLog(@"PHJavaScriptBridge Error : FAILED pluginJSON = %@", commandString); #endif - } + } + }]; } } diff --git a/WKJavaScriptBridge/Plugin/WKBasePlugin.h b/WKJavaScriptBridge/Plugin/WKBasePlugin.h index 1eb95ec..99d798f 100644 --- a/WKJavaScriptBridge/Plugin/WKBasePlugin.h +++ b/WKJavaScriptBridge/Plugin/WKBasePlugin.h @@ -12,6 +12,7 @@ #import "WKPluginProtocol.h" #import "WKMsgCommand.h" #import "WKJavaScriptBridgePluginAnnotation.h" +#import "WKPluginSecurityProtocol.h" NS_ASSUME_NONNULL_BEGIN diff --git a/WKJavaScriptBridge/Rigister/WKJavaScriptBridgePluginAnnotation.h b/WKJavaScriptBridge/Rigister/WKJavaScriptBridgePluginAnnotation.h deleted file mode 100644 index 571c62b..0000000 --- a/WKJavaScriptBridge/Rigister/WKJavaScriptBridgePluginAnnotation.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// WKJavaScriptBridgePluginAnnotation.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import - -@class WKJavaScriptBridge; - -#define WKWebPlugins "WKWebPlugins" - -#define WKWebPluginDATA(sectname) __attribute((used, section("__DATA,"#sectname" "))) -#define WKRegisterWhiteList(name) \ -class WKJavaScriptBridge; char * k##name##_mod WKWebPluginDATA(WKWebPlugins) = ""#name""; - - - -NS_ASSUME_NONNULL_BEGIN - -@interface WKJavaScriptBridgePluginAnnotation : NSObject -- (instancetype)initWithBridge:(WKJavaScriptBridge *)bridge; -- (void)getAllRegisterPluginName; -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h b/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h new file mode 100644 index 0000000..f5c06ac --- /dev/null +++ b/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h @@ -0,0 +1,42 @@ +// +// WKJavaScriptBridgePluginAnnotation.h +// WKJavaScriptBridge-demo +// +// Created by Kevin on 2019/10/22. +// Copyright © 2019 王凯. All rights reserved. +// + +#import + +//@class WKJavaScriptBridge; +// +//#define WKWebPlugins "WKWebPlugins" +// +//#define WKWebPluginDATA(sectname) __attribute((used, section("__DATA,"#sectname" "))) +//#define WKRegisterWhiteList(name) \ +//class WKJavaScriptBridge; char * k##name##_mod WKWebPluginDATA(WKWebPlugins) = ""#name""; + + + +@class WKJavaScriptBridge; + +#define SecurityConfig "SecurityConfig" + +#define SecurityPlugin "SecurityPlugin" + +#define WKWebPluginDATA(sectname) __attribute((used, section("__DATA,"#sectname" "))) + +#define WKConfigPluginSafeLevel(service,action,level) \ +class WKJavaScriptBridge;char * k##service##_##action##_plu WKWebPluginDATA(SecurityConfig) = "[\""#service"\",\""#action"\",\""#level"\"]"; + +#define WKConfigSafePlugin(name) \ +class PHJavaScriptBridge;char * k##name##_plu WKWebPluginDATA(SecurityPlugin) = ""#name""; + +NS_ASSUME_NONNULL_BEGIN + +@interface WKJavaScriptBridgePluginAnnotation : NSObject +- (instancetype)initWithBridge:(WKJavaScriptBridge *)bridge; +- (void)getAllRegisterPluginName; +@end + +NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Rigister/WKJavaScriptBridgePluginAnnotation.m b/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m similarity index 68% rename from WKJavaScriptBridge/Rigister/WKJavaScriptBridgePluginAnnotation.m rename to WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m index b6175bd..17736f7 100644 --- a/WKJavaScriptBridge/Rigister/WKJavaScriptBridgePluginAnnotation.m +++ b/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m @@ -36,21 +36,34 @@ - (void)getAllRegisterPluginName { } - (void)registedAnnotationModules { - NSArray*services = [WKJavaScriptBridgePluginAnnotation AnnotationModules]; - for (NSString *pluginName in services) { - if (pluginName) { - [self.bridge addWhiteList:pluginName]; + NSArray *whiteListPlugin = [WKJavaScriptBridgePluginAnnotation AnnotationWhiteListPlugin]; + if (whiteListPlugin.count > 0) { + NSString *plugin = whiteListPlugin[0]; + if (plugin.length) { + [self.bridge registerSecurityPlugin:plugin]; } } + + NSArray *securityInfo = [WKJavaScriptBridgePluginAnnotation AnnotationPlugins]; + [self.bridge registerPluginSecurityInfomation:securityInfo]; +} + ++ (NSArray *)AnnotationPlugins { + static NSArray *securityInfo = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + securityInfo = BHReadConfiguration(SecurityConfig); + }); + return securityInfo; } -+ (NSArray *)AnnotationModules { - static NSArray *mods = nil; ++ (NSArray *)AnnotationWhiteListPlugin { + static NSArray *plugin = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - mods = BHReadConfiguration(WKWebPlugins); + plugin = BHReadConfiguration(SecurityPlugin); }); - return mods; + return plugin; } static NSArray* BHReadConfiguration(char *section) { diff --git a/WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h b/WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h new file mode 100644 index 0000000..299cc0b --- /dev/null +++ b/WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h @@ -0,0 +1,30 @@ +// +// WKPluginSecurityProtocol.h +// WKJavaScriptBridge-demo +// +// Created by Kevin on 2020/6/2. +// Copyright © 2020 王凯. All rights reserved. +// + +#import + +typedef void(^PHJudgeAuthorityComplete)(BOOL allowed); + +NS_ASSUME_NONNULL_BEGIN + +@protocol WKPluginSecurityProtocol + +@required + +/** + 插件是否符合使用权限 + + @param serviceName 类名 + @param actionName 方法名 + @param completionHandler 校验结果,异步返回 + */ +- (void)applyAuthorityWithService:(NSString *)serviceName action:(NSString *)actionName securityInfomation:(NSArray*)secInfo complete:(PHJudgeAuthorityComplete)completionHandler; + +@end + +NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/WKJSBridge.js b/WKJavaScriptBridge/WKJSBridge.js index ee4b0fd..e250353 100755 --- a/WKJavaScriptBridge/WKJSBridge.js +++ b/WKJavaScriptBridge/WKJSBridge.js @@ -37,10 +37,10 @@ */ WKJSBridge.prototype._handleMessageFromNative = function (messageString) { var callbackMessage = JSON.parse(messageString); - var status = messageString.status; + var status = callbackMessage.status; var callback = this.callbackCache[callbackMessage.callbackId]; if (callback) { // 执行 callback 回调,并删除缓存的 callback - if (status = '0') {//失败回调 + if (status == 1) {//失败回调 callback.fail(callbackMessage.data); }else {//成功回调 callback.success(callbackMessage.data); diff --git a/WKJavaScriptBridge/WKJavaScriptBridge.h b/WKJavaScriptBridge/WKJavaScriptBridge.h index 8a1c958..d6d6738 100644 --- a/WKJavaScriptBridge/WKJavaScriptBridge.h +++ b/WKJavaScriptBridge/WKJavaScriptBridge.h @@ -25,13 +25,6 @@ NS_ASSUME_NONNULL_BEGIN */ + (instancetype)bindBridgeWithWebView:(WKWebView *)webView; -/** - 是否开启插件白名单,默认关闭 - - @param openning 开关 - */ -- (void)openWhiteList:(BOOL)openning; - @end NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/WKJavaScriptBridge.m b/WKJavaScriptBridge/WKJavaScriptBridge.m index d51f53f..f8ad62e 100644 --- a/WKJavaScriptBridge/WKJavaScriptBridge.m +++ b/WKJavaScriptBridge/WKJavaScriptBridge.m @@ -13,6 +13,7 @@ #import "WKJavaScriptBridgePluginAnnotation.h" #import "WKBasePlugin.h" #import "WKCommandProtocol.h" +#import "WKPluginSecurityProtocol.h" static NSString * const WKJSBridge = @"WKJSBridgeMessageName"; @@ -21,11 +22,11 @@ @interface WKJavaScriptBridge () @property (nonatomic, strong) WKJavaScriptBridgePluginAnnotation *annotation;//模块注册白名单 @property (nonatomic, strong) WKJavaScriptMessageDispatcher *dispatcher;//插件模块派发 @property (nonatomic, strong) WKCommandImpl *commandDelegate;//插件模块可执行函数实现 -@property (nonatomic, strong) NSMutableDictionary *whiteList;//白名单列表 -@property (nonatomic, assign, getter=isOpenWhiteList) BOOL openWhiteList;//是否开启白名单 @property (nonatomic, strong) NSMutableDictionary *pluginsByName;//插件模块实例对象 @property (nonatomic, weak, readwrite) WKWebView *webView; -@property (nonatomic, strong) NSRecursiveLock *lock; +//安全相关 +@property (nonatomic, strong) id securityPlugin;//白名单插件 +@property (nonatomic, strong) NSArray *secInfo;//业务注册的安全信息 @end @@ -52,10 +53,6 @@ + (instancetype)bindBridgeWithWebView:(WKWebView *)webView { return nil; } -- (void)openWhiteList:(BOOL)openning { - self.openWhiteList = openning; -} - #pragma mark - Init - (instancetype)initBridgeWithWebView:(WKWebView *)webView { @@ -68,6 +65,7 @@ - (instancetype)initBridgeWithWebView:(WKWebView *)webView { } - (void)commonInit { + self.secInfo = [NSArray array]; self.dispatcher = [[WKJavaScriptMessageDispatcher alloc] initWithBridge:self]; self.annotation = [[WKJavaScriptBridgePluginAnnotation alloc] initWithBridge:self]; self.commandDelegate = [[WKCommandImpl alloc] initWithBridge:self]; @@ -123,34 +121,36 @@ - (void)pluginInstall:(WKBasePlugin *)plugin { #pragma mark - WKJavaScriptBridgeProtocol -- (void)addWhiteList:(NSString *)pluginName { - [self.lock lock]; - [self.whiteList setValue:pluginName forKey:[pluginName lowercaseString]]; - [self.lock unlock]; +- (void)registerSecurityPlugin:(NSString *)name { + idsecurityPlugin = [self getCommandInstance:name]; + if ([securityPlugin isKindOfClass:[WKBasePlugin class]] && + [securityPlugin conformsToProtocol:@protocol(WKPluginSecurityProtocol)]) { + self.securityPlugin = securityPlugin; + } } -- (id)getCommandInstance:(NSString*)pluginName { - NSString* className; - if (self.isOpenWhiteList) {//校验白名单 - [self.lock lock]; - className = [self.whiteList objectForKey:[pluginName lowercaseString]]; - [self.lock unlock]; - if (className == nil) { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 模块: (%@) 没有注册白名单。请关闭白名单或者或者使用(@WKRegisterWhiteList)注册。", pluginName); -#endif - return nil; - } +- (void)registerPluginSecurityInfomation:(NSArray*)secInfo { + self.secInfo = secInfo; +} + +- (void)pluginSecurityVerityWithCommand:(WKMsgCommand *)command completionHandler:(void (^)(BOOL passed))completionHandler { + if (self.securityPlugin && [self.securityPlugin respondsToSelector:@selector(applyAuthorityWithService:action:securityInfomation:complete:)]) { + [self.securityPlugin applyAuthorityWithService:command.className action:command.methodName securityInfomation:self.secInfo complete:^(BOOL allowed) { + completionHandler(allowed); + }]; }else { - className = pluginName; + completionHandler(YES); } +} + +- (id)getCommandInstance:(NSString*)pluginName { WKBasePlugin *plugin = nil; Class implClass = [self pluginImplClass:pluginName]; BOOL shouldCache = [self pluginShouldCache:implClass]; if (shouldCache) { - plugin = [self.pluginsByName objectForKey:className]; + plugin = [self.pluginsByName objectForKey:pluginName]; if (plugin) { return plugin; } @@ -166,11 +166,11 @@ - (id)getCommandInstance:(NSString*)pluginName { if (plugin) { [self pluginInstall:plugin]; if (shouldCache) { - [self.pluginsByName setObject:plugin forKey:className]; + [self.pluginsByName setObject:plugin forKey:pluginName]; } }else { #ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 模块: (%@) 不存在。", pluginName); + NSLog(@"PHJavaScriptBridge Error : 模块: (%@) 不存在。", pluginName); #endif } return plugin; @@ -181,11 +181,11 @@ - (id)getCommandInstance:(NSString*)pluginName { if (plugin) { [self pluginInstall:plugin]; if (shouldCache) { - [self.pluginsByName setObject:plugin forKey:className]; + [self.pluginsByName setObject:plugin forKey:pluginName]; } }else { #ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 模块: (%@) 不存在。", pluginName); + NSLog(@"PHJavaScriptBridge Error : 模块: (%@) 不存在。", pluginName); #endif } return plugin; @@ -220,20 +220,6 @@ - (void)userContentController:(WKUserContentController *)userContentController d #pragma mark - Set or Get -- (NSRecursiveLock *)lock { - if (!_lock) { - _lock = [[NSRecursiveLock alloc] init]; - } - return _lock; -} - -- (NSMutableDictionary *)whiteList { - if (!_whiteList) { - _whiteList = [[NSMutableDictionary alloc] initWithCapacity:1]; - } - return _whiteList; -} - - (NSMutableDictionary *)pluginsByName { if (!_pluginsByName) { _pluginsByName = [[NSMutableDictionary alloc] initWithCapacity:1]; diff --git a/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h b/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h index d9d701e..1cf2b57 100644 --- a/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h +++ b/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h @@ -10,14 +10,31 @@ NS_ASSUME_NONNULL_BEGIN +@class WKMsgCommand; + @protocol WKJavaScriptBridgeProtocol /** - 模块加载 - - @param pluginName 模块名称 + 注册权限管理插件 + + @param name class name + */ +- (void)registerSecurityPlugin:(NSString *)name; + +/** + 注册插件安全配置信息 + + @param secInfo 配置信息 + */ +- (void)registerPluginSecurityInfomation:(NSArray*)secInfo; + +/** + 插件安全校验 + + @param command 插件信息 + @param completionHandler 结果回调 */ -- (void)addWhiteList:(NSString *)pluginName; +- (void)pluginSecurityVerityWithCommand:(WKMsgCommand *)command completionHandler:(void (^)(BOOL passed))completionHandler; /** 获取模块实例 From 8ee9202dad24f6e09cea7026a33727182809ad77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=87=AF?= <18500052382@163.com> Date: Tue, 2 Jun 2020 15:12:43 +0800 Subject: [PATCH 2/5] Update README.md --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index cc20aa9..3a109ff 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ [《写一个易于维护使用方便性能可靠的Hybrid框架》](https://juejin.im/post/5c07d95ee51d451d930b04c7) +* v1.1.0 : 强化安全管理,增加安全插件,不配置不影响正常使用。配置方式参照DEMO。 + ## 特性 @@ -61,16 +63,10 @@ self.bridge = [WKJavaScriptBridge bindBridgeWithWebView:yourwebView]; ``` - 3、: -```objc -//开启白名单,默认关闭。若开启,插件需要进行注册`@WKRegisterWhiteList(你的模块类名)`,参照DEMO。 -[self.bridge openWhiteList:YES]; -``` -- 4、: - ```objc h5页面引入: ``` -- 5、: +- 4、: ```objc //H5调用Native: From 4cfab985c549b0060ab351b6fc8e68a2289552f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=87=AF?= <18500052382@163.com> Date: Tue, 2 Jun 2020 15:14:51 +0800 Subject: [PATCH 3/5] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 3a109ff..568bb69 100644 --- a/README.md +++ b/README.md @@ -84,11 +84,7 @@ callbackId:H5传过来的回调ID ``` ## 延伸 -- 1、: -```objc -构建离线包 -``` -- 2、: + ```objc 构建小程序 ``` From 2c0037f72480fa724c8a1b45ba12e3fb265dd900 Mon Sep 17 00:00:00 2001 From: GitWangKai <18500052382@163.com> Date: Mon, 14 Sep 2020 09:46:33 +0800 Subject: [PATCH 4/5] fix bug --- .DS_Store | Bin 10244 -> 6148 bytes Example/Podfile | 13 + Example/Podfile.lock | 16 + .../WKJavaScriptBridge.podspec.json | 22 + Example/Pods/Manifest.lock | 16 + Example/Pods/Pods.xcodeproj/project.pbxproj | 891 ++++++++++++++++++ .../Pods-WKJavaScriptBridge_Example.xcscheme | 58 ++ .../Pods-WKJavaScriptBridge_Tests.xcscheme | 58 ++ .../xcschemes/WKJavaScriptBridge.xcscheme | 60 ++ .../xcschemes/xcschememanagement.plist | 14 +- ...Pods-WKJavaScriptBridge_Example-Info.plist | 26 + ...ptBridge_Example-acknowledgements.markdown | 26 + ...criptBridge_Example-acknowledgements.plist | 58 ++ .../Pods-WKJavaScriptBridge_Example-dummy.m | 5 + ...s-WKJavaScriptBridge_Example-frameworks.sh | 207 ++++ ...Pods-WKJavaScriptBridge_Example-umbrella.h | 16 + ...-WKJavaScriptBridge_Example.debug.xcconfig | 10 + .../Pods-WKJavaScriptBridge_Example.modulemap | 6 + ...KJavaScriptBridge_Example.release.xcconfig | 10 + .../Pods-WKJavaScriptBridge_Tests-Info.plist | 26 + ...riptBridge_Tests-acknowledgements.markdown | 0 ...aScriptBridge_Tests-acknowledgements.plist | 0 .../Pods-WKJavaScriptBridge_Tests-dummy.m | 5 + .../Pods-WKJavaScriptBridge_Tests-umbrella.h | 16 + ...ds-WKJavaScriptBridge_Tests.debug.xcconfig | 9 + .../Pods-WKJavaScriptBridge_Tests.modulemap | 6 + ...-WKJavaScriptBridge_Tests.release.xcconfig | 9 + .../WKJavaScriptBridge-Info.plist | 26 + .../WKJavaScriptBridge-dummy.m | 5 + .../WKJavaScriptBridge-prefix.pch | 12 + .../WKJavaScriptBridge-umbrella.h | 29 + .../WKJavaScriptBridge.debug.xcconfig | 9 + .../WKJavaScriptBridge.modulemap | 6 + .../WKJavaScriptBridge.release.xcconfig | 9 + Example/Tests/Tests-Info.plist | 22 + Example/Tests/Tests-Prefix.pch | 7 + Example/Tests/Tests.m | 35 + Example/Tests/en.lproj/InfoPlist.strings | 2 + .../project.pbxproj | 649 +++++++++++++ .../contents.xcworkspacedata | 7 + .../WKJavaScriptBridge-Example.xcscheme | 101 ++ .../contents.xcworkspacedata | 2 +- .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../UserInterfaceState.xcuserstate | Bin 0 -> 37614 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 3 +- .../Base.lproj/LaunchScreen.storyboard | 8 +- .../Base.lproj/Main.storyboard | 31 + .../AppIcon.appiconset/Contents.json | 2 +- .../Security/TestSecurityPlugin.h | 0 .../Security/TestSecurityPlugin.m | 0 .../Security/TestWebPluginSecurityConfig.h | 0 .../NativePlugin/TestPlugin.h | 0 .../NativePlugin/TestPlugin.m | 0 .../NativePlugin/WKCommonPlugin.h | 0 .../NativePlugin/WKCommonPlugin.m | 0 Example/WKJavaScriptBridge/WKAppDelegate.h | 15 + .../WKJavaScriptBridge/WKAppDelegate.m | 45 +- .../WKJavaScriptBridge/WKJSBridge.js | 0 .../WKJavaScriptBridge-Info.plist | 19 +- .../WKJavaScriptBridge-Prefix.pch | 16 + Example/WKJavaScriptBridge/WKViewController.h | 13 + .../WKJavaScriptBridge/WKViewController.m | 37 +- .../en.lproj/InfoPlist.strings | 2 + .../WKJavaScriptBridge}/index.html | 0 Example/WKJavaScriptBridge/main.m | 17 + LICENSE | 220 +---- README.md | 1 + WKJavaScriptBridge-demo/Podfile | 7 - WKJavaScriptBridge-demo/Podfile.lock | 3 - WKJavaScriptBridge-demo/Pods/Manifest.lock | 3 - .../Pods/Pods.xcodeproj/project.pbxproj | 339 ------- .../Pods-WKJavaScriptBridge-demo-dummy.m | 5 - .../Pods-WKJavaScriptBridge-demo-resources.sh | 129 --- ...ods-WKJavaScriptBridge-demo.debug.xcconfig | 6 - ...s-WKJavaScriptBridge-demo.release.xcconfig | 6 - .../project.pbxproj | 558 ----------- .../contents.xcworkspacedata | 7 - .../xcshareddata/WorkspaceSettings.xcsettings | 5 - .../UserInterfaceState.xcuserstate | Bin 115653 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 73306 -> 0 bytes .../WorkspaceSettings.xcsettings | 18 - .../xcschemes/xcschememanagement.plist | 24 - .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 - .../xcschemes/xcschememanagement.plist | 14 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../UserInterfaceState.xcuserstate | Bin 142424 -> 0 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 36 - .../WKJavaScriptBridge-demo/AppDelegate.h | 17 - .../Assets.xcassets/Contents.json | 6 - .../Base.lproj/Main.storyboard | 58 -- .../TestViewController.h | 17 - .../TestViewController.m | 33 - .../TestWKWebViewController.h | 17 - .../WKJavaScriptBridge-demo/ViewController.h | 15 - .../WKJavaScriptBridge-demo/ViewController.m | 30 - .../WKJavaScriptBridge-demo/main.m | 16 - WKJavaScriptBridge.podspec | 4 - WKJavaScriptBridge/Assets/.gitkeep | 0 WKJavaScriptBridge/Classes/.gitkeep | 0 .../WKJavaScriptMessageDispatcher.h | 0 .../WKJavaScriptMessageDispatcher.m | 2 +- .../Classes}/Dispatcher/WKMsgCommand.h | 0 .../Classes}/Dispatcher/WKMsgCommand.m | 0 .../Classes}/Plugin/WKBasePlugin.h | 0 .../Classes}/Plugin/WKBasePlugin.m | 0 .../Classes}/Plugin/WKCommandImpl.h | 0 .../Classes}/Plugin/WKCommandImpl.m | 0 .../Classes}/Plugin/WKCommandProtocol.h | 0 .../Classes}/Plugin/WKPluginProtocol.h | 0 .../Classes}/Plugin/WKPluginResult.h | 0 .../Classes}/Plugin/WKPluginResult.m | 0 .../WKJavaScriptBridgePluginAnnotation.h | 0 .../WKJavaScriptBridgePluginAnnotation.m | 0 .../Security/WKPluginSecurityProtocol.h | 0 .../Util/NSString+BridgeJSONPrivate.h | 0 .../Util/NSString+BridgeJSONPrivate.m | 0 .../Util/WKWeakScriptMessageHandlerDelegate.h | 0 .../Util/WKWeakScriptMessageHandlerDelegate.m | 0 .../Classes}/WKJavaScriptBridge.h | 0 .../Classes}/WKJavaScriptBridge.m | 0 .../Classes}/WKJavaScriptBridgeProtocol.h | 0 .../WKJavaScriptMessageDispatcher.h | 20 - .../WKJavaScriptMessageDispatcher.m | 124 --- WKJavaScriptBridge/Dispatcher/WKMsgCommand.h | 22 - WKJavaScriptBridge/Dispatcher/WKMsgCommand.m | 57 -- WKJavaScriptBridge/Plugin/WKBasePlugin.h | 47 - WKJavaScriptBridge/Plugin/WKBasePlugin.m | 51 - WKJavaScriptBridge/Plugin/WKCommandImpl.h | 20 - WKJavaScriptBridge/Plugin/WKCommandImpl.m | 103 -- WKJavaScriptBridge/Plugin/WKCommandProtocol.h | 41 - WKJavaScriptBridge/Plugin/WKPluginProtocol.h | 40 - WKJavaScriptBridge/Plugin/WKPluginResult.h | 32 - WKJavaScriptBridge/Plugin/WKPluginResult.m | 64 -- .../WKJavaScriptBridgePluginAnnotation.h | 42 - .../WKJavaScriptBridgePluginAnnotation.m | 98 -- .../Security/WKPluginSecurityProtocol.h | 30 - .../Util/NSString+BridgeJSONPrivate.h | 18 - .../Util/NSString+BridgeJSONPrivate.m | 41 - .../Util/WKWeakScriptMessageHandlerDelegate.h | 22 - .../Util/WKWeakScriptMessageHandlerDelegate.m | 31 - WKJavaScriptBridge/WKJSBridge.js | 57 -- WKJavaScriptBridge/WKJavaScriptBridge.h | 30 - WKJavaScriptBridge/WKJavaScriptBridge.m | 230 ----- .../WKJavaScriptBridgeProtocol.h | 57 -- _Pods.xcodeproj | 1 + 145 files changed, 2663 insertions(+), 2936 deletions(-) create mode 100644 Example/Podfile create mode 100644 Example/Podfile.lock create mode 100644 Example/Pods/Local Podspecs/WKJavaScriptBridge.podspec.json create mode 100644 Example/Pods/Manifest.lock create mode 100644 Example/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/Pods-WKJavaScriptBridge_Example.xcscheme create mode 100644 Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/Pods-WKJavaScriptBridge_Tests.xcscheme create mode 100644 Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/WKJavaScriptBridge.xcscheme rename {WKJavaScriptBridge-demo/Pods/Pods.xcodeproj/xcuserdata/kevin.xcuserdatad => Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad}/xcschemes/xcschememanagement.plist (57%) create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-frameworks.sh create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.release.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-Info.plist rename WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-acknowledgements.markdown => Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-acknowledgements.markdown (100%) rename WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-acknowledgements.plist => Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-acknowledgements.plist (100%) create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-dummy.m create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.release.xcconfig create mode 100644 Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist create mode 100644 Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-dummy.m create mode 100644 Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-prefix.pch create mode 100644 Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-umbrella.h create mode 100644 Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.modulemap create mode 100644 Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.release.xcconfig create mode 100644 Example/Tests/Tests-Info.plist create mode 100644 Example/Tests/Tests-Prefix.pch create mode 100644 Example/Tests/Tests.m create mode 100644 Example/Tests/en.lproj/InfoPlist.strings create mode 100644 Example/WKJavaScriptBridge.xcodeproj/project.pbxproj create mode 100644 Example/WKJavaScriptBridge.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example/WKJavaScriptBridge.xcodeproj/xcshareddata/xcschemes/WKJavaScriptBridge-Example.xcscheme rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace => Example/WKJavaScriptBridge.xcworkspace}/contents.xcworkspacedata (75%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace => Example/WKJavaScriptBridge.xcworkspace}/xcshareddata/IDEWorkspaceChecks.plist (100%) create mode 100644 Example/WKJavaScriptBridge.xcworkspace/xcuserdata/wangkai.xcuserdatad/UserInterfaceState.xcuserstate rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/kevin.xcuserdatad => Example/WKJavaScriptBridge.xcworkspace/xcuserdata/wangkai.xcuserdatad}/xcdebugger/Breakpoints_v2.xcbkptlist (55%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/Base.lproj/LaunchScreen.storyboard (84%) create mode 100644 Example/WKJavaScriptBridge/Base.lproj/Main.storyboard rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Assets.xcassets => Example/WKJavaScriptBridge/Images.xcassets}/AppIcon.appiconset/Contents.json (99%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/NativePlugin/Security/TestSecurityPlugin.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/NativePlugin/Security/TestSecurityPlugin.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/NativePlugin/Security/TestWebPluginSecurityConfig.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/NativePlugin/TestPlugin.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/NativePlugin/TestPlugin.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/NativePlugin/WKCommonPlugin.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/NativePlugin/WKCommonPlugin.m (100%) create mode 100644 Example/WKJavaScriptBridge/WKAppDelegate.h rename WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/AppDelegate.m => Example/WKJavaScriptBridge/WKAppDelegate.m (71%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example}/WKJavaScriptBridge/WKJSBridge.js (100%) rename WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Info.plist => Example/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist (82%) create mode 100644 Example/WKJavaScriptBridge/WKJavaScriptBridge-Prefix.pch create mode 100644 Example/WKJavaScriptBridge/WKViewController.h rename WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestWKWebViewController.m => Example/WKJavaScriptBridge/WKViewController.m (79%) create mode 100644 Example/WKJavaScriptBridge/en.lproj/InfoPlist.strings rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo => Example/WKJavaScriptBridge}/index.html (100%) create mode 100644 Example/WKJavaScriptBridge/main.m delete mode 100644 WKJavaScriptBridge-demo/Podfile delete mode 100644 WKJavaScriptBridge-demo/Podfile.lock delete mode 100644 WKJavaScriptBridge-demo/Pods/Manifest.lock delete mode 100644 WKJavaScriptBridge-demo/Pods/Pods.xcodeproj/project.pbxproj delete mode 100644 WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-dummy.m delete mode 100755 WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-resources.sh delete mode 100644 WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.debug.xcconfig delete mode 100644 WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.release.xcconfig delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.pbxproj delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/kevin.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/wangkai.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/wangkai.xcuserdatad/WorkspaceSettings.xcsettings delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/kevin.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcuserdata/kevin.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcuserdata/kevin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/AppDelegate.h delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Assets.xcassets/Contents.json delete mode 100755 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Base.lproj/Main.storyboard delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestViewController.h delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestViewController.m delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestWKWebViewController.h delete mode 100755 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/ViewController.h delete mode 100755 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/ViewController.m delete mode 100644 WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/main.m create mode 100644 WKJavaScriptBridge/Assets/.gitkeep create mode 100644 WKJavaScriptBridge/Classes/.gitkeep rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Dispatcher/WKJavaScriptMessageDispatcher.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Dispatcher/WKJavaScriptMessageDispatcher.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Dispatcher/WKMsgCommand.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Dispatcher/WKMsgCommand.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Plugin/WKBasePlugin.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Plugin/WKBasePlugin.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Plugin/WKCommandImpl.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Plugin/WKCommandImpl.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Plugin/WKCommandProtocol.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Plugin/WKPluginProtocol.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Plugin/WKPluginResult.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Plugin/WKPluginResult.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Security/WKJavaScriptBridgePluginAnnotation.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Security/WKJavaScriptBridgePluginAnnotation.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Security/WKPluginSecurityProtocol.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Util/NSString+BridgeJSONPrivate.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Util/NSString+BridgeJSONPrivate.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Util/WKWeakScriptMessageHandlerDelegate.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/Util/WKWeakScriptMessageHandlerDelegate.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/WKJavaScriptBridge.h (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/WKJavaScriptBridge.m (100%) rename {WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge => WKJavaScriptBridge/Classes}/WKJavaScriptBridgeProtocol.h (100%) delete mode 100755 WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.h delete mode 100755 WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.m delete mode 100755 WKJavaScriptBridge/Dispatcher/WKMsgCommand.h delete mode 100755 WKJavaScriptBridge/Dispatcher/WKMsgCommand.m delete mode 100644 WKJavaScriptBridge/Plugin/WKBasePlugin.h delete mode 100644 WKJavaScriptBridge/Plugin/WKBasePlugin.m delete mode 100644 WKJavaScriptBridge/Plugin/WKCommandImpl.h delete mode 100644 WKJavaScriptBridge/Plugin/WKCommandImpl.m delete mode 100644 WKJavaScriptBridge/Plugin/WKCommandProtocol.h delete mode 100644 WKJavaScriptBridge/Plugin/WKPluginProtocol.h delete mode 100644 WKJavaScriptBridge/Plugin/WKPluginResult.h delete mode 100644 WKJavaScriptBridge/Plugin/WKPluginResult.m delete mode 100644 WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h delete mode 100644 WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m delete mode 100644 WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h delete mode 100644 WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.h delete mode 100644 WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.m delete mode 100644 WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.h delete mode 100644 WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.m delete mode 100755 WKJavaScriptBridge/WKJSBridge.js delete mode 100644 WKJavaScriptBridge/WKJavaScriptBridge.h delete mode 100644 WKJavaScriptBridge/WKJavaScriptBridge.m delete mode 100644 WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h create mode 120000 _Pods.xcodeproj diff --git a/.DS_Store b/.DS_Store index 68d42d20b91f52e4b1698e5210ae7c11cdedb244..15a90d2e547ca5e96e51d45fa58493893501e1c5 100644 GIT binary patch literal 6148 zcmeHKJxc>Y5PfTcMr=YV%WEwI_MYL=Xd_%Vh_s7VWKAs+=X@VyWH`@;?X+K1 zyv^_z8IZl(Ko>VSLyo!q%g27YwbpLcBQKJqmlZv>G|I=5z1#bT{bgQ*6}-k5a$0n> z^&=Vd(|o4sWRw-7AzOIL(84healrXbsVVxH;F2@HLdVwz7`~rD?G;bYtH#Z*?5_X1 zqbpl!%)Izm?{{MtSa2_#u8A>V3>X7H$bj6Yl*U#-D~$nTz!;b@AooK=6^s?jfd1-W z;Zp!&on|krOD-WXkz%Y^24oAxg-~J$b(&(h5Keofez9U1FoeTt^5Jx3rx}X#qqG0W zyTio+tuzLVfkg&t;j=04fA{PBe=*3ui~(cdUoqh7Nt$%HBz;>ei<7rDqMlMk#IFoE k3t`1S#q^b@c$?~l_DCwkSg{O93&nl}JPlSD1Ha0^8?d=%*#H0l literal 10244 zcmeI1TW}Or8ppqX2-uw-NE4zN21o{xAXL!YmSC00v8 znNT|{2s037Ak09RfiMGM2F`^HFtf#>8Ony&Fau!*!VHXMK+F$uK7~yLc2rq8b?`+l z0oWFEu{`*m*8wsn9@s=+N0pVK+@@MRAP7aU#DEHCe_T{&n+WWvvMQXQ!U@5f5v))k z-_CJyS)GtjHoS%z2s1D-17hu7M%}cLI(Y3qe*NB0IckwBd5iXuof`7{Q?8fd`o~iJ zuH)xwYrjI#jN+NI&eOD#l9JgayF2%LL!G%~ZoqFzW_OCGEy>*eRB+$rdG6SKGIgzE z5A~YmtzIUVbTW2U20NC`Rd#hd8Os}L@dh%MFWc!<4o%Z_z1NHm4>vTdu8G(Ep=qQh zKHSt)TN7_=ST!=DYZXiD*0k^KJ9udL#*v#IR{cdVXHaQD{~wuZ=Pf_&rugTJ_$g(} z^#@y3wu+AAvvo3`Exp8u%#N+!u)e(`(rcCtaw0bO=NvENUu$Q5w!LPl&&g{~dzmd+ zTll-vo;%Q&@q5j=>7<(;aFaQ^*>yXeLpGO{`su9ax?4Qo5zTDx$=L^T!Z*Ryv%~kY zxmMX&kHhV&TIPUnZ?(BmXV7lrrhOCokvSC$7cX6LY2#&UT8@{RbIT&-kqf#99p6d0 z_O>C%%I)8t^wW06ax(jN@ZTqsbFOpjtUebtdRHddXCE&!=axq2$6`GLDd&a(CwI_X zqG_tF%2-@Ck7~Ote%n=^B_b{9iB-lf(zKnTyftg{RTW2;#g^-4QtR@$TdIkg$R)bz z>s{BgSX5|Tq(L(+eVdz1*{&*D6q z9`WK$Nk6x_-_G#6MHgBtW3la`yxFpBOVhL^c^xfDT&!+of0ra`)sxOJTSWELMw@6a z520bYhaRFQ=~a4-UZ;2IV>(VJ=`?*u-_uX@GyMZaFfbc)P>Lw#V*wUoIqK1XMkLUV z4s60z*ovLlg+1tng+64^j~g(AQT!RV;8xs?`|$uC#1nWPFW^PIgtzcMKE-GF9ADrY zoW|erqxyM8`SGwR-w$Q+6WgiEJD3cL?wwrTRqNKT+t7Xv%lpI}q3L<$=U-3}U%Gr{ zebeR5V~Qvc!5JbQuS_XMr8cR;yvmgNS@{bVE{arbV}05O3P((SB$?-l@uD3UwHIGl zRb>hlsz;-`D#Bw#m%bI%>?;a9mt4x889W@6uc0wgWzJ;ftGLydMIvS~4-MsAa|L^6 z@gPv%mPPC(UH^?L{*b<;zp#S;1;Q*=?>tuSVl2Z-G+`~8(S|Fr4x4ceI?;t~tlPav zB8BUvc0C-xA>4=&+=Sb4Cl0fI?_vEugh%iw9>ddkR_gc&Ud3y89dF=Gyn~Ne%_j;p zys<#TC#S06!Om>P^)maoz8DV`Q-L6@B#Uh7Bkvr;VdLt?ns|ME!*9mnG}AC1jMEGq zhsb9qn?sD*Q8|Zn^qLd!bk+em38eM$glv`&G0Kf;5>m`T(fQE@8k2F1lB%uBC=>GK zNeCIOj7~;KV_CF-kVcJBK*(sFQAo(>Dq|ucqvgf~Lh@@9+5|qz4pc_lG;JIqe~pi( zSnVyMTK>N5pgq)22k9_9K#wyZk1`_Pp^tcSIYED=Z+U|GkrDX|z=$lyOh#k{Pc$(` zI|0f+N(E>51MeV)B`9yh9k@$^@_zozdsu?0R4 z#HR&H?oiM9E54q-k_&K|Zz{CE-we!9KRqt?|F8V-|NsB}b};WwNZL--=M;M1%cKGzy|Nj9{s%uXG diff --git a/Example/Podfile b/Example/Podfile new file mode 100644 index 0000000..d51ee9c --- /dev/null +++ b/Example/Podfile @@ -0,0 +1,13 @@ +use_frameworks! + +platform :ios, '8.0' + +target 'WKJavaScriptBridge_Example' do + pod 'WKJavaScriptBridge', :path => '../' + + target 'WKJavaScriptBridge_Tests' do + inherit! :search_paths + + + end +end diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 0000000..e51efd7 --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,16 @@ +PODS: + - WKJavaScriptBridge (0.1.0) + +DEPENDENCIES: + - WKJavaScriptBridge (from `../`) + +EXTERNAL SOURCES: + WKJavaScriptBridge: + :path: "../" + +SPEC CHECKSUMS: + WKJavaScriptBridge: 002bd91f9541b23acba79c0c02345b0a8015e2b9 + +PODFILE CHECKSUM: 7a8764f9ffcd97bedaf15694e9b25cdbdc128802 + +COCOAPODS: 1.9.3 diff --git a/Example/Pods/Local Podspecs/WKJavaScriptBridge.podspec.json b/Example/Pods/Local Podspecs/WKJavaScriptBridge.podspec.json new file mode 100644 index 0000000..014a8f1 --- /dev/null +++ b/Example/Pods/Local Podspecs/WKJavaScriptBridge.podspec.json @@ -0,0 +1,22 @@ +{ + "name": "WKJavaScriptBridge", + "version": "0.1.0", + "summary": "A short description of WKJavaScriptBridge.", + "description": "TODO: Add long description of the pod here.", + "homepage": "https://github.com/GitWangKai/WKJavaScriptBridge", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "authors": { + "GitWangKai": "18500052382@163.com" + }, + "source": { + "git": "https://github.com/GitWangKai/WKJavaScriptBridge.git", + "tag": "0.1.0" + }, + "platforms": { + "ios": "8.0" + }, + "source_files": "WKJavaScriptBridge/Classes/**/*" +} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock new file mode 100644 index 0000000..e51efd7 --- /dev/null +++ b/Example/Pods/Manifest.lock @@ -0,0 +1,16 @@ +PODS: + - WKJavaScriptBridge (0.1.0) + +DEPENDENCIES: + - WKJavaScriptBridge (from `../`) + +EXTERNAL SOURCES: + WKJavaScriptBridge: + :path: "../" + +SPEC CHECKSUMS: + WKJavaScriptBridge: 002bd91f9541b23acba79c0c02345b0a8015e2b9 + +PODFILE CHECKSUM: 7a8764f9ffcd97bedaf15694e9b25cdbdc128802 + +COCOAPODS: 1.9.3 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..255d76c --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,891 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1214D8B1397FDFC7C68FA8FFB50530F4 /* Pods-WKJavaScriptBridge_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D0E106D87E4CA4077C0CCE709CE9EFCB /* Pods-WKJavaScriptBridge_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1293AB8E8EB7A50E0E88A919E0DDDBFD /* NSString+BridgeJSONPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13A78970988CA4F36A81329A9E972779 /* NSString+BridgeJSONPrivate.m */; }; + 171DC50A236E09A8132C0B4C673D5F77 /* WKJavaScriptMessageDispatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 57F5480989137A1F843A39ABB204B7B7 /* WKJavaScriptMessageDispatcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 1D8253259DF2B6E2F0082CB663D3A041 /* WKJavaScriptBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E2C1968BB5BE0E59527E5A25FE29695 /* WKJavaScriptBridge.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 22D385E2DE1BAF7BCEE1B21EA43E451E /* NSString+BridgeJSONPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C9DDA9B68DBF1D38648A3D03CDA3A23 /* NSString+BridgeJSONPrivate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2D41138DF9056CC39D030EDF28F05B6C /* WKJavaScriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = B1DC064D1CD4B1FB28A728AACF0FB75B /* WKJavaScriptBridge.m */; }; + 3717D3C7A0B4ACC4D2A5062FD4CAF313 /* WKPluginResult.h in Headers */ = {isa = PBXBuildFile; fileRef = AEED66C6B14667D29D84B1294277C104 /* WKPluginResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3F31EE627449D5D691D5CC305AF9747A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + 512B3EC0F988071A7671DD911723915F /* WKPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = EA0A314C2063666AE3721D0A1C08A3BB /* WKPluginResult.m */; }; + 51EC404A49947A5F1AD8EF9D8E248162 /* WKJavaScriptBridgePluginAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4342E9F0CAF4E883E1B3EF0CD878E570 /* WKJavaScriptBridgePluginAnnotation.m */; }; + 7222B424A724F9A62B1FE9A57A9AD967 /* WKPluginProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E9C5305656A340CA612DC00B409CB98 /* WKPluginProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 7AED8BA97CB70766F574CD0C7513BB7C /* WKPluginSecurityProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 047C2E5FFE9EB6B8CBEF2A5881FDCEDA /* WKPluginSecurityProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 83CE0F66AF2019A73B9242B96A3464CD /* WKCommandProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = 32E02F3B0D69A23F1383711218528E0E /* WKCommandProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 86EDF8A10C77F57FECEDE7F2138A8A5D /* WKJavaScriptBridge-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 09D49AA3ED3F4916C06CFAA153E114FF /* WKJavaScriptBridge-dummy.m */; }; + 8B09A5F3B4704F865A363F6768964404 /* WKCommandImpl.h in Headers */ = {isa = PBXBuildFile; fileRef = A2BEB5F6A9C161F963477CF238F93085 /* WKCommandImpl.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8BEA8DFD94F03CD93F74545ADA8A52F2 /* WKJavaScriptBridgeProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = E6908A76FA49546874C3D68ADA9AA819 /* WKJavaScriptBridgeProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 90A96B7A3F7A83BC37DBB7664798B620 /* WKJavaScriptBridge-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C03D8F11A8C5BB7779925D6445FDB946 /* WKJavaScriptBridge-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9A3EDDA49A04314A4EF4BA54AEA2419C /* Pods-WKJavaScriptBridge_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 774A8A3926BCB3417C031CE14D3A5360 /* Pods-WKJavaScriptBridge_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9A991564D9A8F72EB40DDE3E027D848F /* WKMsgCommand.h in Headers */ = {isa = PBXBuildFile; fileRef = 14FB98A3715A8001CF83F96A6FC9905D /* WKMsgCommand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B5CE477ED9D7579D378A9129160D2644 /* WKJavaScriptMessageDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = CC0AED92072FEE10655B3BBA742CB5CC /* WKJavaScriptMessageDispatcher.m */; }; + B7C38F09FD332390AC6481A0ABEDAA69 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + C25C0067D7EFB1A3D14518CEAA1FB048 /* WKBasePlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = F8C0A2AB178663D683E3DEAFB44F2F5B /* WKBasePlugin.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CF862D7D785F63AF909827ED6B00412A /* Pods-WKJavaScriptBridge_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 710D65D9911916E575F5438DB13F6B03 /* Pods-WKJavaScriptBridge_Example-dummy.m */; }; + D0C2A8753E68E6269A8FEBF342BE887D /* WKMsgCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 189E03A538517E791BA53A68C0142FEB /* WKMsgCommand.m */; }; + DB5513079EBA66F6A8FAEEBEB7CFDA25 /* WKCommandImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 11872520D0F6BA1530F9F1323EDD9C93 /* WKCommandImpl.m */; }; + E08B4DFEFC8D967A20D1CE0D379A2E0F /* Pods-WKJavaScriptBridge_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E8ABB81DF77B1BB5E92E6087E819D586 /* Pods-WKJavaScriptBridge_Tests-dummy.m */; }; + F21D8143049F09FE7398C17FD21458EA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */; }; + F33FEC77ED342948EA13A1F2E9BBEE9D /* WKJavaScriptBridgePluginAnnotation.h in Headers */ = {isa = PBXBuildFile; fileRef = B00A422083F80D1D46F925A23DE8C6D6 /* WKJavaScriptBridgePluginAnnotation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F9EAB73FF36E7D4708BAFB80A69F678A /* WKBasePlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = B71FF397D168F81B7C193881EC5546F9 /* WKBasePlugin.m */; }; + FA739C948D5327E2B7C2CDB6375F399E /* WKWeakScriptMessageHandlerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 8661BBF543DAA0FFB45C16BA2A62A27E /* WKWeakScriptMessageHandlerDelegate.m */; }; + FC788FFE91D6FA1861159BD3D0DB7B0A /* WKWeakScriptMessageHandlerDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 23E54793889C168FA3246C5BD1DCEBA0 /* WKWeakScriptMessageHandlerDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 2E3A604F7A0CCAF6CFC2C58772DE835A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 883FE4A98A39F65560738FF8ACC95D71; + remoteInfo = "Pods-WKJavaScriptBridge_Example"; + }; + D5AD4AF2B33A181549ECC1C9E9D2C679 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 8F8347086F8B20856E52922A9A74248D; + remoteInfo = WKJavaScriptBridge; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 047C2E5FFE9EB6B8CBEF2A5881FDCEDA /* WKPluginSecurityProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKPluginSecurityProtocol.h; sourceTree = ""; }; + 09D49AA3ED3F4916C06CFAA153E114FF /* WKJavaScriptBridge-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "WKJavaScriptBridge-dummy.m"; sourceTree = ""; }; + 0AB5A7C657210B3AABD198F5077B679C /* Pods_WKJavaScriptBridge_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WKJavaScriptBridge_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 11872520D0F6BA1530F9F1323EDD9C93 /* WKCommandImpl.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = WKCommandImpl.m; sourceTree = ""; }; + 13A78970988CA4F36A81329A9E972779 /* NSString+BridgeJSONPrivate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "NSString+BridgeJSONPrivate.m"; sourceTree = ""; }; + 14FB98A3715A8001CF83F96A6FC9905D /* WKMsgCommand.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKMsgCommand.h; sourceTree = ""; }; + 1558DF69E71932C3C188D12669EB7F9A /* Pods-WKJavaScriptBridge_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WKJavaScriptBridge_Tests.debug.xcconfig"; sourceTree = ""; }; + 189E03A538517E791BA53A68C0142FEB /* WKMsgCommand.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = WKMsgCommand.m; sourceTree = ""; }; + 23E54793889C168FA3246C5BD1DCEBA0 /* WKWeakScriptMessageHandlerDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKWeakScriptMessageHandlerDelegate.h; sourceTree = ""; }; + 2E497486D5B1997976CEBF772818DA49 /* WKJavaScriptBridge.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = WKJavaScriptBridge.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 301FAB3A4368C3A3C2AD4B4C1322098D /* Pods-WKJavaScriptBridge_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WKJavaScriptBridge_Example-acknowledgements.plist"; sourceTree = ""; }; + 31C031B651BCD53DC4CC88E15C6E6B40 /* Pods-WKJavaScriptBridge_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WKJavaScriptBridge_Tests-Info.plist"; sourceTree = ""; }; + 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 32E02F3B0D69A23F1383711218528E0E /* WKCommandProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKCommandProtocol.h; sourceTree = ""; }; + 33A01A89445811495F46D66F82FC6B09 /* Pods-WKJavaScriptBridge_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WKJavaScriptBridge_Tests.release.xcconfig"; sourceTree = ""; }; + 38CA62BAB103D9DC9F68FB242E185A1E /* WKJavaScriptBridge.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WKJavaScriptBridge.release.xcconfig; sourceTree = ""; }; + 40A403073A77DD168268371A1976EFEC /* WKJavaScriptBridge-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "WKJavaScriptBridge-Info.plist"; sourceTree = ""; }; + 4342E9F0CAF4E883E1B3EF0CD878E570 /* WKJavaScriptBridgePluginAnnotation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = WKJavaScriptBridgePluginAnnotation.m; sourceTree = ""; }; + 4C63C3A44C45DA722C3C6A08B3BA5957 /* Pods-WKJavaScriptBridge_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-WKJavaScriptBridge_Tests.modulemap"; sourceTree = ""; }; + 51F1C41DAFF76B6A011C7B789AF6C36B /* WKJavaScriptBridge-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WKJavaScriptBridge-prefix.pch"; sourceTree = ""; }; + 54A03357C4B6319334F90C606F701E18 /* WKJavaScriptBridge.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = WKJavaScriptBridge.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 57F5480989137A1F843A39ABB204B7B7 /* WKJavaScriptMessageDispatcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKJavaScriptMessageDispatcher.h; sourceTree = ""; }; + 5C9DDA9B68DBF1D38648A3D03CDA3A23 /* NSString+BridgeJSONPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSString+BridgeJSONPrivate.h"; sourceTree = ""; }; + 68ACD6FE7A95E5569C01F672A4B40D92 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 70EDE9F2D19F96B938CDAB814617DE74 /* Pods-WKJavaScriptBridge_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WKJavaScriptBridge_Example-Info.plist"; sourceTree = ""; }; + 710D65D9911916E575F5438DB13F6B03 /* Pods-WKJavaScriptBridge_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WKJavaScriptBridge_Example-dummy.m"; sourceTree = ""; }; + 774A8A3926BCB3417C031CE14D3A5360 /* Pods-WKJavaScriptBridge_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WKJavaScriptBridge_Example-umbrella.h"; sourceTree = ""; }; + 7E2C1968BB5BE0E59527E5A25FE29695 /* WKJavaScriptBridge.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WKJavaScriptBridge.h; path = WKJavaScriptBridge/Classes/WKJavaScriptBridge.h; sourceTree = ""; }; + 834721C590C379A46A40ADBE82C4F15F /* Pods-WKJavaScriptBridge_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WKJavaScriptBridge_Example.release.xcconfig"; sourceTree = ""; }; + 8661BBF543DAA0FFB45C16BA2A62A27E /* WKWeakScriptMessageHandlerDelegate.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = WKWeakScriptMessageHandlerDelegate.m; sourceTree = ""; }; + 8E9C5305656A340CA612DC00B409CB98 /* WKPluginProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKPluginProtocol.h; sourceTree = ""; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + A2BEB5F6A9C161F963477CF238F93085 /* WKCommandImpl.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKCommandImpl.h; sourceTree = ""; }; + A374EBE5CEE67BA43677B57A871EE9D4 /* Pods-WKJavaScriptBridge_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WKJavaScriptBridge_Example-frameworks.sh"; sourceTree = ""; }; + A5F98B8E9357C9C1AACD2E07A72155FF /* WKJavaScriptBridge.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = WKJavaScriptBridge.debug.xcconfig; sourceTree = ""; }; + A8210C3C7F352271AF9E1743C12D05EC /* Pods-WKJavaScriptBridge_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WKJavaScriptBridge_Tests-acknowledgements.plist"; sourceTree = ""; }; + AEED66C6B14667D29D84B1294277C104 /* WKPluginResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKPluginResult.h; sourceTree = ""; }; + B00A422083F80D1D46F925A23DE8C6D6 /* WKJavaScriptBridgePluginAnnotation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKJavaScriptBridgePluginAnnotation.h; sourceTree = ""; }; + B1DC064D1CD4B1FB28A728AACF0FB75B /* WKJavaScriptBridge.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = WKJavaScriptBridge.m; path = WKJavaScriptBridge/Classes/WKJavaScriptBridge.m; sourceTree = ""; }; + B4F8C3C490631E0B1EBC6EE9A0AFB053 /* Pods-WKJavaScriptBridge_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WKJavaScriptBridge_Tests-acknowledgements.markdown"; sourceTree = ""; }; + B71FF397D168F81B7C193881EC5546F9 /* WKBasePlugin.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = WKBasePlugin.m; sourceTree = ""; }; + BEE7AA5F42761CAE8BABAFAF34B582DB /* WKJavaScriptBridge.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = WKJavaScriptBridge.modulemap; sourceTree = ""; }; + C03D8F11A8C5BB7779925D6445FDB946 /* WKJavaScriptBridge-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "WKJavaScriptBridge-umbrella.h"; sourceTree = ""; }; + CA783533AC1F3556251D34C07F048287 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; + CC0AED92072FEE10655B3BBA742CB5CC /* WKJavaScriptMessageDispatcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = WKJavaScriptMessageDispatcher.m; sourceTree = ""; }; + D0E106D87E4CA4077C0CCE709CE9EFCB /* Pods-WKJavaScriptBridge_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WKJavaScriptBridge_Tests-umbrella.h"; sourceTree = ""; }; + D5F895E0793700E5AF2EFE043A921DAA /* Pods-WKJavaScriptBridge_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WKJavaScriptBridge_Example.debug.xcconfig"; sourceTree = ""; }; + E2AE7FCD6E1BEBFC47748F31A33301F3 /* Pods-WKJavaScriptBridge_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WKJavaScriptBridge_Example-acknowledgements.markdown"; sourceTree = ""; }; + E6908A76FA49546874C3D68ADA9AA819 /* WKJavaScriptBridgeProtocol.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = WKJavaScriptBridgeProtocol.h; path = WKJavaScriptBridge/Classes/WKJavaScriptBridgeProtocol.h; sourceTree = ""; }; + E8ABB81DF77B1BB5E92E6087E819D586 /* Pods-WKJavaScriptBridge_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WKJavaScriptBridge_Tests-dummy.m"; sourceTree = ""; }; + EA0A314C2063666AE3721D0A1C08A3BB /* WKPluginResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = WKPluginResult.m; sourceTree = ""; }; + F4963E2EFFAAA15D91F010AD781B1684 /* Pods-WKJavaScriptBridge_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-WKJavaScriptBridge_Example.modulemap"; sourceTree = ""; }; + F8C0A2AB178663D683E3DEAFB44F2F5B /* WKBasePlugin.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = WKBasePlugin.h; sourceTree = ""; }; + FC5F691569AFE0EFF406546F7B6F471A /* Pods_WKJavaScriptBridge_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WKJavaScriptBridge_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 00FDDD0BE9B6BF383866056C6F1DEFEF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + F21D8143049F09FE7398C17FD21458EA /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 05C928CEC9214F94234ABDBD0B969DF2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B7C38F09FD332390AC6481A0ABEDAA69 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 239FD859A12EF8D7DD5765420748EF48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F31EE627449D5D691D5CC305AF9747A /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 184AF76C4404DA009A3D733DB7AC6AE4 /* Pods-WKJavaScriptBridge_Example */ = { + isa = PBXGroup; + children = ( + F4963E2EFFAAA15D91F010AD781B1684 /* Pods-WKJavaScriptBridge_Example.modulemap */, + E2AE7FCD6E1BEBFC47748F31A33301F3 /* Pods-WKJavaScriptBridge_Example-acknowledgements.markdown */, + 301FAB3A4368C3A3C2AD4B4C1322098D /* Pods-WKJavaScriptBridge_Example-acknowledgements.plist */, + 710D65D9911916E575F5438DB13F6B03 /* Pods-WKJavaScriptBridge_Example-dummy.m */, + A374EBE5CEE67BA43677B57A871EE9D4 /* Pods-WKJavaScriptBridge_Example-frameworks.sh */, + 70EDE9F2D19F96B938CDAB814617DE74 /* Pods-WKJavaScriptBridge_Example-Info.plist */, + 774A8A3926BCB3417C031CE14D3A5360 /* Pods-WKJavaScriptBridge_Example-umbrella.h */, + D5F895E0793700E5AF2EFE043A921DAA /* Pods-WKJavaScriptBridge_Example.debug.xcconfig */, + 834721C590C379A46A40ADBE82C4F15F /* Pods-WKJavaScriptBridge_Example.release.xcconfig */, + ); + name = "Pods-WKJavaScriptBridge_Example"; + path = "Target Support Files/Pods-WKJavaScriptBridge_Example"; + sourceTree = ""; + }; + 1D7D3BF891A3217902AE92E6D9E78035 /* Pod */ = { + isa = PBXGroup; + children = ( + CA783533AC1F3556251D34C07F048287 /* LICENSE */, + 68ACD6FE7A95E5569C01F672A4B40D92 /* README.md */, + 54A03357C4B6319334F90C606F701E18 /* WKJavaScriptBridge.podspec */, + ); + name = Pod; + sourceTree = ""; + }; + 3CAE51D0DAC28E1F2E199C9E03945F81 /* Development Pods */ = { + isa = PBXGroup; + children = ( + 8D0B65DAFD19C55863D8EBB8612CDD98 /* WKJavaScriptBridge */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + 3D977E2076CC5E9426494538B9B1A8E5 /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 184AF76C4404DA009A3D733DB7AC6AE4 /* Pods-WKJavaScriptBridge_Example */, + 6807E6C8FAC5F90048B5C8929C8466E5 /* Pods-WKJavaScriptBridge_Tests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 4C660FD0908F60750AE50E75D4F01086 /* Dispatcher */ = { + isa = PBXGroup; + children = ( + 57F5480989137A1F843A39ABB204B7B7 /* WKJavaScriptMessageDispatcher.h */, + CC0AED92072FEE10655B3BBA742CB5CC /* WKJavaScriptMessageDispatcher.m */, + 14FB98A3715A8001CF83F96A6FC9905D /* WKMsgCommand.h */, + 189E03A538517E791BA53A68C0142FEB /* WKMsgCommand.m */, + ); + name = Dispatcher; + path = WKJavaScriptBridge/Classes/Dispatcher; + sourceTree = ""; + }; + 61BDF114AF6E651E40E09A6EE617C424 /* Support Files */ = { + isa = PBXGroup; + children = ( + BEE7AA5F42761CAE8BABAFAF34B582DB /* WKJavaScriptBridge.modulemap */, + 09D49AA3ED3F4916C06CFAA153E114FF /* WKJavaScriptBridge-dummy.m */, + 40A403073A77DD168268371A1976EFEC /* WKJavaScriptBridge-Info.plist */, + 51F1C41DAFF76B6A011C7B789AF6C36B /* WKJavaScriptBridge-prefix.pch */, + C03D8F11A8C5BB7779925D6445FDB946 /* WKJavaScriptBridge-umbrella.h */, + A5F98B8E9357C9C1AACD2E07A72155FF /* WKJavaScriptBridge.debug.xcconfig */, + 38CA62BAB103D9DC9F68FB242E185A1E /* WKJavaScriptBridge.release.xcconfig */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/WKJavaScriptBridge"; + sourceTree = ""; + }; + 6807E6C8FAC5F90048B5C8929C8466E5 /* Pods-WKJavaScriptBridge_Tests */ = { + isa = PBXGroup; + children = ( + 4C63C3A44C45DA722C3C6A08B3BA5957 /* Pods-WKJavaScriptBridge_Tests.modulemap */, + B4F8C3C490631E0B1EBC6EE9A0AFB053 /* Pods-WKJavaScriptBridge_Tests-acknowledgements.markdown */, + A8210C3C7F352271AF9E1743C12D05EC /* Pods-WKJavaScriptBridge_Tests-acknowledgements.plist */, + E8ABB81DF77B1BB5E92E6087E819D586 /* Pods-WKJavaScriptBridge_Tests-dummy.m */, + 31C031B651BCD53DC4CC88E15C6E6B40 /* Pods-WKJavaScriptBridge_Tests-Info.plist */, + D0E106D87E4CA4077C0CCE709CE9EFCB /* Pods-WKJavaScriptBridge_Tests-umbrella.h */, + 1558DF69E71932C3C188D12669EB7F9A /* Pods-WKJavaScriptBridge_Tests.debug.xcconfig */, + 33A01A89445811495F46D66F82FC6B09 /* Pods-WKJavaScriptBridge_Tests.release.xcconfig */, + ); + name = "Pods-WKJavaScriptBridge_Tests"; + path = "Target Support Files/Pods-WKJavaScriptBridge_Tests"; + sourceTree = ""; + }; + 7F07F4DECFE76D5BAF98AA9BB5D5352D /* Security */ = { + isa = PBXGroup; + children = ( + B00A422083F80D1D46F925A23DE8C6D6 /* WKJavaScriptBridgePluginAnnotation.h */, + 4342E9F0CAF4E883E1B3EF0CD878E570 /* WKJavaScriptBridgePluginAnnotation.m */, + 047C2E5FFE9EB6B8CBEF2A5881FDCEDA /* WKPluginSecurityProtocol.h */, + ); + name = Security; + path = WKJavaScriptBridge/Classes/Security; + sourceTree = ""; + }; + 8D0B65DAFD19C55863D8EBB8612CDD98 /* WKJavaScriptBridge */ = { + isa = PBXGroup; + children = ( + 7E2C1968BB5BE0E59527E5A25FE29695 /* WKJavaScriptBridge.h */, + B1DC064D1CD4B1FB28A728AACF0FB75B /* WKJavaScriptBridge.m */, + E6908A76FA49546874C3D68ADA9AA819 /* WKJavaScriptBridgeProtocol.h */, + 4C660FD0908F60750AE50E75D4F01086 /* Dispatcher */, + C5F9BAA5404EE0F752066D47F6FA4AB6 /* Plugin */, + 1D7D3BF891A3217902AE92E6D9E78035 /* Pod */, + 7F07F4DECFE76D5BAF98AA9BB5D5352D /* Security */, + 61BDF114AF6E651E40E09A6EE617C424 /* Support Files */, + E55614D061D7B7B0A91F62C55E9A34E7 /* Util */, + ); + name = WKJavaScriptBridge; + path = ../..; + sourceTree = ""; + }; + C0834CEBB1379A84116EF29F93051C60 /* iOS */ = { + isa = PBXGroup; + children = ( + 3212113385A8FBBDB272BD23C409FF61 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + C5F9BAA5404EE0F752066D47F6FA4AB6 /* Plugin */ = { + isa = PBXGroup; + children = ( + F8C0A2AB178663D683E3DEAFB44F2F5B /* WKBasePlugin.h */, + B71FF397D168F81B7C193881EC5546F9 /* WKBasePlugin.m */, + A2BEB5F6A9C161F963477CF238F93085 /* WKCommandImpl.h */, + 11872520D0F6BA1530F9F1323EDD9C93 /* WKCommandImpl.m */, + 32E02F3B0D69A23F1383711218528E0E /* WKCommandProtocol.h */, + 8E9C5305656A340CA612DC00B409CB98 /* WKPluginProtocol.h */, + AEED66C6B14667D29D84B1294277C104 /* WKPluginResult.h */, + EA0A314C2063666AE3721D0A1C08A3BB /* WKPluginResult.m */, + ); + name = Plugin; + path = WKJavaScriptBridge/Classes/Plugin; + sourceTree = ""; + }; + CF1408CF629C7361332E53B88F7BD30C = { + isa = PBXGroup; + children = ( + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, + 3CAE51D0DAC28E1F2E199C9E03945F81 /* Development Pods */, + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, + F24CBC1171C32BB22C4A0B91B3D187A4 /* Products */, + 3D977E2076CC5E9426494538B9B1A8E5 /* Targets Support Files */, + ); + sourceTree = ""; + }; + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { + isa = PBXGroup; + children = ( + C0834CEBB1379A84116EF29F93051C60 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + E55614D061D7B7B0A91F62C55E9A34E7 /* Util */ = { + isa = PBXGroup; + children = ( + 5C9DDA9B68DBF1D38648A3D03CDA3A23 /* NSString+BridgeJSONPrivate.h */, + 13A78970988CA4F36A81329A9E972779 /* NSString+BridgeJSONPrivate.m */, + 23E54793889C168FA3246C5BD1DCEBA0 /* WKWeakScriptMessageHandlerDelegate.h */, + 8661BBF543DAA0FFB45C16BA2A62A27E /* WKWeakScriptMessageHandlerDelegate.m */, + ); + name = Util; + path = WKJavaScriptBridge/Classes/Util; + sourceTree = ""; + }; + F24CBC1171C32BB22C4A0B91B3D187A4 /* Products */ = { + isa = PBXGroup; + children = ( + FC5F691569AFE0EFF406546F7B6F471A /* Pods_WKJavaScriptBridge_Example.framework */, + 0AB5A7C657210B3AABD198F5077B679C /* Pods_WKJavaScriptBridge_Tests.framework */, + 2E497486D5B1997976CEBF772818DA49 /* WKJavaScriptBridge.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 377CC4D7EE9A563D1C8E6F49B86C5BCD /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 1214D8B1397FDFC7C68FA8FFB50530F4 /* Pods-WKJavaScriptBridge_Tests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7111D6F7B7E24EF901A505A680E5F266 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 9A3EDDA49A04314A4EF4BA54AEA2419C /* Pods-WKJavaScriptBridge_Example-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C2BAAF8BE4874D46706178FB38601793 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 22D385E2DE1BAF7BCEE1B21EA43E451E /* NSString+BridgeJSONPrivate.h in Headers */, + C25C0067D7EFB1A3D14518CEAA1FB048 /* WKBasePlugin.h in Headers */, + 8B09A5F3B4704F865A363F6768964404 /* WKCommandImpl.h in Headers */, + 83CE0F66AF2019A73B9242B96A3464CD /* WKCommandProtocol.h in Headers */, + 90A96B7A3F7A83BC37DBB7664798B620 /* WKJavaScriptBridge-umbrella.h in Headers */, + 1D8253259DF2B6E2F0082CB663D3A041 /* WKJavaScriptBridge.h in Headers */, + F33FEC77ED342948EA13A1F2E9BBEE9D /* WKJavaScriptBridgePluginAnnotation.h in Headers */, + 8BEA8DFD94F03CD93F74545ADA8A52F2 /* WKJavaScriptBridgeProtocol.h in Headers */, + 171DC50A236E09A8132C0B4C673D5F77 /* WKJavaScriptMessageDispatcher.h in Headers */, + 9A991564D9A8F72EB40DDE3E027D848F /* WKMsgCommand.h in Headers */, + 7222B424A724F9A62B1FE9A57A9AD967 /* WKPluginProtocol.h in Headers */, + 3717D3C7A0B4ACC4D2A5062FD4CAF313 /* WKPluginResult.h in Headers */, + 7AED8BA97CB70766F574CD0C7513BB7C /* WKPluginSecurityProtocol.h in Headers */, + FC788FFE91D6FA1861159BD3D0DB7B0A /* WKWeakScriptMessageHandlerDelegate.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 755E204626CE89F863FB451307F6642E /* Pods-WKJavaScriptBridge_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 80D2A0FC26D66A0040A8D5D8E162C4EA /* Build configuration list for PBXNativeTarget "Pods-WKJavaScriptBridge_Tests" */; + buildPhases = ( + 377CC4D7EE9A563D1C8E6F49B86C5BCD /* Headers */, + 9B4AC8FEA1BDA86065E4F7437ADC167F /* Sources */, + 05C928CEC9214F94234ABDBD0B969DF2 /* Frameworks */, + D3293D74D80998F50E914DF00AAE6387 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + DCCC250130921A9DDBE74F6AAB211177 /* PBXTargetDependency */, + ); + name = "Pods-WKJavaScriptBridge_Tests"; + productName = "Pods-WKJavaScriptBridge_Tests"; + productReference = 0AB5A7C657210B3AABD198F5077B679C /* Pods_WKJavaScriptBridge_Tests.framework */; + productType = "com.apple.product-type.framework"; + }; + 883FE4A98A39F65560738FF8ACC95D71 /* Pods-WKJavaScriptBridge_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = D0549A0003E838F487D5BAA25A287FBA /* Build configuration list for PBXNativeTarget "Pods-WKJavaScriptBridge_Example" */; + buildPhases = ( + 7111D6F7B7E24EF901A505A680E5F266 /* Headers */, + AF03383C78837EC02542E07405E9D57D /* Sources */, + 00FDDD0BE9B6BF383866056C6F1DEFEF /* Frameworks */, + DB3BEA9121B49ECE4BFE8E0503002132 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 3A05FA48375D1FB1BCC889DBA6C375C4 /* PBXTargetDependency */, + ); + name = "Pods-WKJavaScriptBridge_Example"; + productName = "Pods-WKJavaScriptBridge_Example"; + productReference = FC5F691569AFE0EFF406546F7B6F471A /* Pods_WKJavaScriptBridge_Example.framework */; + productType = "com.apple.product-type.framework"; + }; + 8F8347086F8B20856E52922A9A74248D /* WKJavaScriptBridge */ = { + isa = PBXNativeTarget; + buildConfigurationList = 51A3D4460D5810FD144D7DF820AFECD7 /* Build configuration list for PBXNativeTarget "WKJavaScriptBridge" */; + buildPhases = ( + C2BAAF8BE4874D46706178FB38601793 /* Headers */, + DA0361B8FA00128D614E0A8CEC28E089 /* Sources */, + 239FD859A12EF8D7DD5765420748EF48 /* Frameworks */, + 28C2609870EA5AC93F94F45A1B7D82C0 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WKJavaScriptBridge; + productName = WKJavaScriptBridge; + productReference = 2E497486D5B1997976CEBF772818DA49 /* WKJavaScriptBridge.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + BFDFE7DC352907FC980B868725387E98 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1100; + LastUpgradeCheck = 1100; + }; + buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CF1408CF629C7361332E53B88F7BD30C; + productRefGroup = F24CBC1171C32BB22C4A0B91B3D187A4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 883FE4A98A39F65560738FF8ACC95D71 /* Pods-WKJavaScriptBridge_Example */, + 755E204626CE89F863FB451307F6642E /* Pods-WKJavaScriptBridge_Tests */, + 8F8347086F8B20856E52922A9A74248D /* WKJavaScriptBridge */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 28C2609870EA5AC93F94F45A1B7D82C0 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D3293D74D80998F50E914DF00AAE6387 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DB3BEA9121B49ECE4BFE8E0503002132 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 9B4AC8FEA1BDA86065E4F7437ADC167F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E08B4DFEFC8D967A20D1CE0D379A2E0F /* Pods-WKJavaScriptBridge_Tests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + AF03383C78837EC02542E07405E9D57D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CF862D7D785F63AF909827ED6B00412A /* Pods-WKJavaScriptBridge_Example-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DA0361B8FA00128D614E0A8CEC28E089 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1293AB8E8EB7A50E0E88A919E0DDDBFD /* NSString+BridgeJSONPrivate.m in Sources */, + F9EAB73FF36E7D4708BAFB80A69F678A /* WKBasePlugin.m in Sources */, + DB5513079EBA66F6A8FAEEBEB7CFDA25 /* WKCommandImpl.m in Sources */, + 86EDF8A10C77F57FECEDE7F2138A8A5D /* WKJavaScriptBridge-dummy.m in Sources */, + 2D41138DF9056CC39D030EDF28F05B6C /* WKJavaScriptBridge.m in Sources */, + 51EC404A49947A5F1AD8EF9D8E248162 /* WKJavaScriptBridgePluginAnnotation.m in Sources */, + B5CE477ED9D7579D378A9129160D2644 /* WKJavaScriptMessageDispatcher.m in Sources */, + D0C2A8753E68E6269A8FEBF342BE887D /* WKMsgCommand.m in Sources */, + 512B3EC0F988071A7671DD911723915F /* WKPluginResult.m in Sources */, + FA739C948D5327E2B7C2CDB6375F399E /* WKWeakScriptMessageHandlerDelegate.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 3A05FA48375D1FB1BCC889DBA6C375C4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = WKJavaScriptBridge; + target = 8F8347086F8B20856E52922A9A74248D /* WKJavaScriptBridge */; + targetProxy = D5AD4AF2B33A181549ECC1C9E9D2C679 /* PBXContainerItemProxy */; + }; + DCCC250130921A9DDBE74F6AAB211177 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "Pods-WKJavaScriptBridge_Example"; + target = 883FE4A98A39F65560738FF8ACC95D71 /* Pods-WKJavaScriptBridge_Example */; + targetProxy = 2E3A604F7A0CCAF6CFC2C58772DE835A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 2D8002AAF2E228D2CEA3CAA635A14CFC /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1558DF69E71932C3C188D12669EB7F9A /* Pods-WKJavaScriptBridge_Tests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 3F108DF09AC5FBD618780D2CD91B634C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D5F895E0793700E5AF2EFE043A921DAA /* Pods-WKJavaScriptBridge_Example.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 47248B9EF369065BF8C8C1F720E5DD1E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33A01A89445811495F46D66F82FC6B09 /* Pods-WKJavaScriptBridge_Tests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 4BE66A09A74FD25164AAB3C2645B9B93 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Release; + }; + 6C025F14181343F6BD4E02560339318C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 38CA62BAB103D9DC9F68FB242E185A1E /* WKJavaScriptBridge.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.modulemap"; + PRODUCT_MODULE_NAME = WKJavaScriptBridge; + PRODUCT_NAME = WKJavaScriptBridge; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 7EF7227D9B20A1D549000096ACCB23D7 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + STRIP_INSTALLED_PRODUCT = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 919A9CECC1A835592B9AA58FC24FAD96 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A5F98B8E9357C9C1AACD2E07A72155FF /* WKJavaScriptBridge.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + GCC_PREFIX_HEADER = "Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.modulemap"; + PRODUCT_MODULE_NAME = WKJavaScriptBridge; + PRODUCT_NAME = WKJavaScriptBridge; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BAC2DACE965431330E545661AE5098E7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 834721C590C379A46A40ADBE82C4F15F /* Pods-WKJavaScriptBridge_Example.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + INFOPLIST_FILE = "Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.modulemap"; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7EF7227D9B20A1D549000096ACCB23D7 /* Debug */, + 4BE66A09A74FD25164AAB3C2645B9B93 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 51A3D4460D5810FD144D7DF820AFECD7 /* Build configuration list for PBXNativeTarget "WKJavaScriptBridge" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 919A9CECC1A835592B9AA58FC24FAD96 /* Debug */, + 6C025F14181343F6BD4E02560339318C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 80D2A0FC26D66A0040A8D5D8E162C4EA /* Build configuration list for PBXNativeTarget "Pods-WKJavaScriptBridge_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 2D8002AAF2E228D2CEA3CAA635A14CFC /* Debug */, + 47248B9EF369065BF8C8C1F720E5DD1E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D0549A0003E838F487D5BAA25A287FBA /* Build configuration list for PBXNativeTarget "Pods-WKJavaScriptBridge_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3F108DF09AC5FBD618780D2CD91B634C /* Debug */, + BAC2DACE965431330E545661AE5098E7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; +} diff --git a/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/Pods-WKJavaScriptBridge_Example.xcscheme b/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/Pods-WKJavaScriptBridge_Example.xcscheme new file mode 100644 index 0000000..298fffe --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/Pods-WKJavaScriptBridge_Example.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/Pods-WKJavaScriptBridge_Tests.xcscheme b/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/Pods-WKJavaScriptBridge_Tests.xcscheme new file mode 100644 index 0000000..1d3a2f1 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/Pods-WKJavaScriptBridge_Tests.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/WKJavaScriptBridge.xcscheme b/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/WKJavaScriptBridge.xcscheme new file mode 100644 index 0000000..bc0da50 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/WKJavaScriptBridge.xcscheme @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WKJavaScriptBridge-demo/Pods/Pods.xcodeproj/xcuserdata/kevin.xcuserdatad/xcschemes/xcschememanagement.plist b/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/xcschememanagement.plist similarity index 57% rename from WKJavaScriptBridge-demo/Pods/Pods.xcodeproj/xcuserdata/kevin.xcuserdatad/xcschemes/xcschememanagement.plist rename to Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/xcschememanagement.plist index 6bf8a9a..40c69b6 100644 --- a/WKJavaScriptBridge-demo/Pods/Pods.xcodeproj/xcuserdata/kevin.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Example/Pods/Pods.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/xcschememanagement.plist @@ -4,12 +4,20 @@ SchemeUserState - Pods-WKJavaScriptBridge-demo.xcscheme + Pods-WKJavaScriptBridge_Example.xcscheme + + isShown + + + Pods-WKJavaScriptBridge_Tests.xcscheme + + isShown + + + WKJavaScriptBridge.xcscheme isShown - orderHint - 0 SuppressBuildableAutocreation diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-Info.plist b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-acknowledgements.markdown new file mode 100644 index 0000000..48228a8 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-acknowledgements.markdown @@ -0,0 +1,26 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## WKJavaScriptBridge + +Copyright (c) 2020 GitWangKai <18500052382@163.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-acknowledgements.plist new file mode 100644 index 0000000..8d9e999 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-acknowledgements.plist @@ -0,0 +1,58 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Copyright (c) 2020 GitWangKai <18500052382@163.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + License + MIT + Title + WKJavaScriptBridge + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-dummy.m b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-dummy.m new file mode 100644 index 0000000..55cf188 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_WKJavaScriptBridge_Example : NSObject +@end +@implementation PodsDummy_Pods_WKJavaScriptBridge_Example +@end diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-frameworks.sh new file mode 100755 index 0000000..a1f6207 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-frameworks.sh @@ -0,0 +1,207 @@ +#!/bin/sh +set -e +set -u +set -o pipefail + +function on_error { + echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" +} +trap 'on_error $LINENO' ERR + +if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then + # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy + # frameworks to, so exit 0 (signalling the script phase was successful). + exit 0 +fi + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +# Used as a return value for each invocation of `strip_invalid_archs` function. +STRIP_BINARY_RETVAL=0 + +# This protects against multiple targets copying the same framework dependency at the same time. The solution +# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html +RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") + +# Copies and strips a vendored framework +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # Use filter instead of exclude so missing patterns don't throw errors. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + elif [ -L "${binary}" ]; then + echo "Destination binary is symlinked..." + dirname="$(dirname "${binary}")" + binary="${dirname}/$(readlink "${binary}")" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Copies and strips a vendored dSYM +install_dsym() { + local source="$1" + warn_missing_arch=${2:-true} + if [ -r "$source" ]; then + # Copy the dSYM into the targets temp dir. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" + + local basename + basename="$(basename -s .dSYM "$source")" + binary_name="$(ls "$source/Contents/Resources/DWARF")" + binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then + strip_invalid_archs "$binary" "$warn_missing_arch" + fi + + if [[ $STRIP_BINARY_RETVAL == 1 ]]; then + # Move the stripped file into its final destination. + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" + else + # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. + touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" + fi + fi +} + +# Copies the bcsymbolmap files of a vendored framework +install_bcsymbolmap() { + local bcsymbolmap_path="$1" + local destination="${BUILT_PRODUCTS_DIR}" + echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" + rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identity + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + warn_missing_arch=${2:-true} + # Get architectures for current target binary + binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" + # Intersect them with the architectures we are building for + intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" + # If there are no archs supported by this binary then warn the user + if [[ -z "$intersected_archs" ]]; then + if [[ "$warn_missing_arch" == "true" ]]; then + echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." + fi + STRIP_BINARY_RETVAL=0 + return + fi + stripped="" + for arch in $binary_archs; do + if ! [[ "${ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi + STRIP_BINARY_RETVAL=1 +} + +install_artifact() { + artifact="$1" + base="$(basename "$artifact")" + case $base in + *.framework) + install_framework "$artifact" + ;; + *.dSYM) + # Suppress arch warnings since XCFrameworks will include many dSYM files + install_dsym "$artifact" "false" + ;; + *.bcsymbolmap) + install_bcsymbolmap "$artifact" + ;; + *) + echo "error: Unrecognized artifact "$artifact"" + ;; + esac +} + +copy_artifacts() { + file_list="$1" + while read artifact; do + install_artifact "$artifact" + done <$file_list +} + +ARTIFACT_LIST_FILE="${BUILT_PRODUCTS_DIR}/cocoapods-artifacts-${CONFIGURATION}.txt" +if [ -r "${ARTIFACT_LIST_FILE}" ]; then + copy_artifacts "${ARTIFACT_LIST_FILE}" +fi + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/WKJavaScriptBridge/WKJavaScriptBridge.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "${BUILT_PRODUCTS_DIR}/WKJavaScriptBridge/WKJavaScriptBridge.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-umbrella.h b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-umbrella.h new file mode 100644 index 0000000..2a3f78e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_WKJavaScriptBridge_ExampleVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_WKJavaScriptBridge_ExampleVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.debug.xcconfig new file mode 100644 index 0000000..4ae5683 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.debug.xcconfig @@ -0,0 +1,10 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge/WKJavaScriptBridge.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "WKJavaScriptBridge" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.modulemap b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.modulemap new file mode 100644 index 0000000..6733c2f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.modulemap @@ -0,0 +1,6 @@ +framework module Pods_WKJavaScriptBridge_Example { + umbrella header "Pods-WKJavaScriptBridge_Example-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.release.xcconfig new file mode 100644 index 0000000..4ae5683 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.release.xcconfig @@ -0,0 +1,10 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge/WKJavaScriptBridge.framework/Headers" +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_LDFLAGS = $(inherited) -framework "WKJavaScriptBridge" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-Info.plist b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-acknowledgements.markdown similarity index 100% rename from WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-acknowledgements.markdown rename to Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-acknowledgements.markdown diff --git a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-acknowledgements.plist similarity index 100% rename from WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-acknowledgements.plist rename to Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-acknowledgements.plist diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-dummy.m new file mode 100644 index 0000000..6ca86e5 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_WKJavaScriptBridge_Tests : NSObject +@end +@implementation PodsDummy_Pods_WKJavaScriptBridge_Tests +@end diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-umbrella.h new file mode 100644 index 0000000..7c8d75b --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_WKJavaScriptBridge_TestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_WKJavaScriptBridge_TestsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.debug.xcconfig new file mode 100644 index 0000000..11c6bc3 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.debug.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge/WKJavaScriptBridge.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "WKJavaScriptBridge" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.modulemap b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.modulemap new file mode 100644 index 0000000..b72485e --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_WKJavaScriptBridge_Tests { + umbrella header "Pods-WKJavaScriptBridge_Tests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.release.xcconfig new file mode 100644 index 0000000..11c6bc3 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.release.xcconfig @@ -0,0 +1,9 @@ +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge/WKJavaScriptBridge.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "WKJavaScriptBridge" +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist new file mode 100644 index 0000000..161a9d3 --- /dev/null +++ b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 0.1.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-dummy.m b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-dummy.m new file mode 100644 index 0000000..c7230f1 --- /dev/null +++ b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_WKJavaScriptBridge : NSObject +@end +@implementation PodsDummy_WKJavaScriptBridge +@end diff --git a/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-prefix.pch b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-umbrella.h b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-umbrella.h new file mode 100644 index 0000000..de3000a --- /dev/null +++ b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge-umbrella.h @@ -0,0 +1,29 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + +#import "WKJavaScriptMessageDispatcher.h" +#import "WKMsgCommand.h" +#import "WKBasePlugin.h" +#import "WKCommandImpl.h" +#import "WKCommandProtocol.h" +#import "WKPluginProtocol.h" +#import "WKPluginResult.h" +#import "WKJavaScriptBridgePluginAnnotation.h" +#import "WKPluginSecurityProtocol.h" +#import "NSString+BridgeJSONPrivate.h" +#import "WKWeakScriptMessageHandlerDelegate.h" +#import "WKJavaScriptBridge.h" +#import "WKJavaScriptBridgeProtocol.h" + +FOUNDATION_EXPORT double WKJavaScriptBridgeVersionNumber; +FOUNDATION_EXPORT const unsigned char WKJavaScriptBridgeVersionString[]; + diff --git a/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.debug.xcconfig b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.debug.xcconfig new file mode 100644 index 0000000..510b0b2 --- /dev/null +++ b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.debug.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.modulemap b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.modulemap new file mode 100644 index 0000000..369dc7a --- /dev/null +++ b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.modulemap @@ -0,0 +1,6 @@ +framework module WKJavaScriptBridge { + umbrella header "WKJavaScriptBridge-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.release.xcconfig b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.release.xcconfig new file mode 100644 index 0000000..510b0b2 --- /dev/null +++ b/Example/Pods/Target Support Files/WKJavaScriptBridge/WKJavaScriptBridge.release.xcconfig @@ -0,0 +1,9 @@ +CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/WKJavaScriptBridge +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +PODS_BUILD_DIR = ${BUILD_DIR} +PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES +USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Tests/Tests-Info.plist b/Example/Tests/Tests-Info.plist new file mode 100644 index 0000000..169b6f7 --- /dev/null +++ b/Example/Tests/Tests-Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Example/Tests/Tests-Prefix.pch b/Example/Tests/Tests-Prefix.pch new file mode 100644 index 0000000..0bfb741 --- /dev/null +++ b/Example/Tests/Tests-Prefix.pch @@ -0,0 +1,7 @@ +// The contents of this file are implicitly included at the beginning of every test case source file. + +#ifdef __OBJC__ + + + +#endif diff --git a/Example/Tests/Tests.m b/Example/Tests/Tests.m new file mode 100644 index 0000000..6cafce3 --- /dev/null +++ b/Example/Tests/Tests.m @@ -0,0 +1,35 @@ +// +// WKJavaScriptBridgeTests.m +// WKJavaScriptBridgeTests +// +// Created by GitWangKai on 09/14/2020. +// Copyright (c) 2020 GitWangKai. All rights reserved. +// + +@import XCTest; + +@interface Tests : XCTestCase + +@end + +@implementation Tests + +- (void)setUp +{ + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown +{ + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample +{ + XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); +} + +@end + diff --git a/Example/Tests/en.lproj/InfoPlist.strings b/Example/Tests/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Example/Tests/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/Example/WKJavaScriptBridge.xcodeproj/project.pbxproj b/Example/WKJavaScriptBridge.xcodeproj/project.pbxproj new file mode 100644 index 0000000..daed096 --- /dev/null +++ b/Example/WKJavaScriptBridge.xcodeproj/project.pbxproj @@ -0,0 +1,649 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1EDAA9BE5DCF363024F58224 /* Pods_WKJavaScriptBridge_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 86A22B218D3CFD606912451D /* Pods_WKJavaScriptBridge_Tests.framework */; }; + 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; + 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58F195388D20070C39A /* CoreGraphics.framework */; }; + 6003F592195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; + 6003F598195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F596195388D20070C39A /* InfoPlist.strings */; }; + 6003F59A195388D20070C39A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F599195388D20070C39A /* main.m */; }; + 6003F59E195388D20070C39A /* WKAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F59D195388D20070C39A /* WKAppDelegate.m */; }; + 6003F5A7195388D20070C39A /* WKViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5A6195388D20070C39A /* WKViewController.m */; }; + 6003F5A9195388D20070C39A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5A8195388D20070C39A /* Images.xcassets */; }; + 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F5AF195388D20070C39A /* XCTest.framework */; }; + 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F58D195388D20070C39A /* Foundation.framework */; }; + 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6003F591195388D20070C39A /* UIKit.framework */; }; + 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 6003F5B8195388D20070C39A /* InfoPlist.strings */; }; + 6003F5BC195388D20070C39A /* Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6003F5BB195388D20070C39A /* Tests.m */; }; + 631ECE893F6CFF6B28B3E7B1 /* Pods_WKJavaScriptBridge_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C81FD33F66658FB090696698 /* Pods_WKJavaScriptBridge_Example.framework */; }; + 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */; }; + 83F53EFD250EFFB3008B0321 /* TestSecurityPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F53EF7250EFFB3008B0321 /* TestSecurityPlugin.m */; }; + 83F53EFE250EFFB3008B0321 /* TestPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F53EFA250EFFB3008B0321 /* TestPlugin.m */; }; + 83F53EFF250EFFB3008B0321 /* WKCommonPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 83F53EFB250EFFB3008B0321 /* WKCommonPlugin.m */; }; + 83F53F01250EFFC5008B0321 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 83F53F00250EFFC5008B0321 /* index.html */; }; + 83F53F03250F0136008B0321 /* WKJSBridge.js in Resources */ = {isa = PBXBuildFile; fileRef = 83F53F02250F0136008B0321 /* WKJSBridge.js */; }; + 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 6003F5B3195388D20070C39A /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6003F582195388D10070C39A /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6003F589195388D20070C39A; + remoteInfo = WKJavaScriptBridge; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 03D8C67F75C319920C51C1F5 /* WKJavaScriptBridge.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = WKJavaScriptBridge.podspec; path = ../WKJavaScriptBridge.podspec; sourceTree = ""; }; + 1676BACDF544EC174D2EE1C3 /* Pods-WKJavaScriptBridge_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WKJavaScriptBridge_Tests.release.xcconfig"; path = "Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.release.xcconfig"; sourceTree = ""; }; + 3DE9B6B533B90FF6E2EEDC2F /* Pods-WKJavaScriptBridge_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WKJavaScriptBridge_Tests.debug.xcconfig"; path = "Target Support Files/Pods-WKJavaScriptBridge_Tests/Pods-WKJavaScriptBridge_Tests.debug.xcconfig"; sourceTree = ""; }; + 3FE1E5AD60555277E56091E2 /* Pods-WKJavaScriptBridge_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WKJavaScriptBridge_Example.release.xcconfig"; path = "Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.release.xcconfig"; sourceTree = ""; }; + 6003F58A195388D20070C39A /* WKJavaScriptBridge_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = WKJavaScriptBridge_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 6003F58D195388D20070C39A /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 6003F58F195388D20070C39A /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 6003F591195388D20070C39A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + 6003F595195388D20070C39A /* WKJavaScriptBridge-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WKJavaScriptBridge-Info.plist"; sourceTree = ""; }; + 6003F597195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6003F599195388D20070C39A /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 6003F59B195388D20070C39A /* WKJavaScriptBridge-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WKJavaScriptBridge-Prefix.pch"; sourceTree = ""; }; + 6003F59C195388D20070C39A /* WKAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKAppDelegate.h; sourceTree = ""; }; + 6003F59D195388D20070C39A /* WKAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKAppDelegate.m; sourceTree = ""; }; + 6003F5A5195388D20070C39A /* WKViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKViewController.h; sourceTree = ""; }; + 6003F5A6195388D20070C39A /* WKViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKViewController.m; sourceTree = ""; }; + 6003F5A8195388D20070C39A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 6003F5AE195388D20070C39A /* WKJavaScriptBridge_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WKJavaScriptBridge_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 6003F5AF195388D20070C39A /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 6003F5B7195388D20070C39A /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; + 6003F5B9195388D20070C39A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 6003F5BB195388D20070C39A /* Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Tests.m; sourceTree = ""; }; + 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Tests-Prefix.pch"; sourceTree = ""; }; + 61FCBE622911F16EAE21EEDC /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; + 71719F9E1E33DC2100824A3D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 83F53EF5250EFFB3008B0321 /* WKCommonPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKCommonPlugin.h; sourceTree = ""; }; + 83F53EF7250EFFB3008B0321 /* TestSecurityPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestSecurityPlugin.m; sourceTree = ""; }; + 83F53EF8250EFFB3008B0321 /* TestWebPluginSecurityConfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestWebPluginSecurityConfig.h; sourceTree = ""; }; + 83F53EF9250EFFB3008B0321 /* TestSecurityPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestSecurityPlugin.h; sourceTree = ""; }; + 83F53EFA250EFFB3008B0321 /* TestPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestPlugin.m; sourceTree = ""; }; + 83F53EFB250EFFB3008B0321 /* WKCommonPlugin.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WKCommonPlugin.m; sourceTree = ""; }; + 83F53EFC250EFFB3008B0321 /* TestPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestPlugin.h; sourceTree = ""; }; + 83F53F00250EFFC5008B0321 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = ""; }; + 83F53F02250F0136008B0321 /* WKJSBridge.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = WKJSBridge.js; sourceTree = ""; }; + 86A22B218D3CFD606912451D /* Pods_WKJavaScriptBridge_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WKJavaScriptBridge_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Main.storyboard; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 92142D68D116C7CE45F4713A /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + BC1335159DC9AD10901908FC /* Pods-WKJavaScriptBridge_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WKJavaScriptBridge_Example.debug.xcconfig"; path = "Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example.debug.xcconfig"; sourceTree = ""; }; + C81FD33F66658FB090696698 /* Pods_WKJavaScriptBridge_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_WKJavaScriptBridge_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 6003F587195388D20070C39A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6003F590195388D20070C39A /* CoreGraphics.framework in Frameworks */, + 6003F592195388D20070C39A /* UIKit.framework in Frameworks */, + 6003F58E195388D20070C39A /* Foundation.framework in Frameworks */, + 631ECE893F6CFF6B28B3E7B1 /* Pods_WKJavaScriptBridge_Example.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6003F5AB195388D20070C39A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6003F5B0195388D20070C39A /* XCTest.framework in Frameworks */, + 6003F5B2195388D20070C39A /* UIKit.framework in Frameworks */, + 6003F5B1195388D20070C39A /* Foundation.framework in Frameworks */, + 1EDAA9BE5DCF363024F58224 /* Pods_WKJavaScriptBridge_Tests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 6003F581195388D10070C39A = { + isa = PBXGroup; + children = ( + 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */, + 6003F593195388D20070C39A /* Example for WKJavaScriptBridge */, + 6003F5B5195388D20070C39A /* Tests */, + 6003F58C195388D20070C39A /* Frameworks */, + 6003F58B195388D20070C39A /* Products */, + C74692C90E0E9C0B97DAA53D /* Pods */, + ); + sourceTree = ""; + }; + 6003F58B195388D20070C39A /* Products */ = { + isa = PBXGroup; + children = ( + 6003F58A195388D20070C39A /* WKJavaScriptBridge_Example.app */, + 6003F5AE195388D20070C39A /* WKJavaScriptBridge_Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 6003F58C195388D20070C39A /* Frameworks */ = { + isa = PBXGroup; + children = ( + 6003F58D195388D20070C39A /* Foundation.framework */, + 6003F58F195388D20070C39A /* CoreGraphics.framework */, + 6003F591195388D20070C39A /* UIKit.framework */, + 6003F5AF195388D20070C39A /* XCTest.framework */, + C81FD33F66658FB090696698 /* Pods_WKJavaScriptBridge_Example.framework */, + 86A22B218D3CFD606912451D /* Pods_WKJavaScriptBridge_Tests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 6003F593195388D20070C39A /* Example for WKJavaScriptBridge */ = { + isa = PBXGroup; + children = ( + 83F53EF4250EFFB3008B0321 /* NativePlugin */, + 6003F59C195388D20070C39A /* WKAppDelegate.h */, + 6003F59D195388D20070C39A /* WKAppDelegate.m */, + 873B8AEA1B1F5CCA007FD442 /* Main.storyboard */, + 6003F5A5195388D20070C39A /* WKViewController.h */, + 6003F5A6195388D20070C39A /* WKViewController.m */, + 83F53F00250EFFC5008B0321 /* index.html */, + 83F53F02250F0136008B0321 /* WKJSBridge.js */, + 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */, + 6003F5A8195388D20070C39A /* Images.xcassets */, + 6003F594195388D20070C39A /* Supporting Files */, + ); + name = "Example for WKJavaScriptBridge"; + path = WKJavaScriptBridge; + sourceTree = ""; + }; + 6003F594195388D20070C39A /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 6003F595195388D20070C39A /* WKJavaScriptBridge-Info.plist */, + 6003F596195388D20070C39A /* InfoPlist.strings */, + 6003F599195388D20070C39A /* main.m */, + 6003F59B195388D20070C39A /* WKJavaScriptBridge-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 6003F5B5195388D20070C39A /* Tests */ = { + isa = PBXGroup; + children = ( + 6003F5BB195388D20070C39A /* Tests.m */, + 6003F5B6195388D20070C39A /* Supporting Files */, + ); + path = Tests; + sourceTree = ""; + }; + 6003F5B6195388D20070C39A /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 6003F5B7195388D20070C39A /* Tests-Info.plist */, + 6003F5B8195388D20070C39A /* InfoPlist.strings */, + 606FC2411953D9B200FFA9A0 /* Tests-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 60FF7A9C1954A5C5007DD14C /* Podspec Metadata */ = { + isa = PBXGroup; + children = ( + 03D8C67F75C319920C51C1F5 /* WKJavaScriptBridge.podspec */, + 61FCBE622911F16EAE21EEDC /* README.md */, + 92142D68D116C7CE45F4713A /* LICENSE */, + ); + name = "Podspec Metadata"; + sourceTree = ""; + }; + 83F53EF4250EFFB3008B0321 /* NativePlugin */ = { + isa = PBXGroup; + children = ( + 83F53EF6250EFFB3008B0321 /* Security */, + 83F53EFA250EFFB3008B0321 /* TestPlugin.m */, + 83F53EFC250EFFB3008B0321 /* TestPlugin.h */, + 83F53EF5250EFFB3008B0321 /* WKCommonPlugin.h */, + 83F53EFB250EFFB3008B0321 /* WKCommonPlugin.m */, + ); + path = NativePlugin; + sourceTree = ""; + }; + 83F53EF6250EFFB3008B0321 /* Security */ = { + isa = PBXGroup; + children = ( + 83F53EF8250EFFB3008B0321 /* TestWebPluginSecurityConfig.h */, + 83F53EF7250EFFB3008B0321 /* TestSecurityPlugin.m */, + 83F53EF9250EFFB3008B0321 /* TestSecurityPlugin.h */, + ); + path = Security; + sourceTree = ""; + }; + C74692C90E0E9C0B97DAA53D /* Pods */ = { + isa = PBXGroup; + children = ( + BC1335159DC9AD10901908FC /* Pods-WKJavaScriptBridge_Example.debug.xcconfig */, + 3FE1E5AD60555277E56091E2 /* Pods-WKJavaScriptBridge_Example.release.xcconfig */, + 3DE9B6B533B90FF6E2EEDC2F /* Pods-WKJavaScriptBridge_Tests.debug.xcconfig */, + 1676BACDF544EC174D2EE1C3 /* Pods-WKJavaScriptBridge_Tests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 6003F589195388D20070C39A /* WKJavaScriptBridge_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "WKJavaScriptBridge_Example" */; + buildPhases = ( + 2A5D66C0B451A8F7B6EA9130 /* [CP] Check Pods Manifest.lock */, + 6003F586195388D20070C39A /* Sources */, + 6003F587195388D20070C39A /* Frameworks */, + 6003F588195388D20070C39A /* Resources */, + 0557EFF8257E8E021A35371A /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = WKJavaScriptBridge_Example; + productName = WKJavaScriptBridge; + productReference = 6003F58A195388D20070C39A /* WKJavaScriptBridge_Example.app */; + productType = "com.apple.product-type.application"; + }; + 6003F5AD195388D20070C39A /* WKJavaScriptBridge_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "WKJavaScriptBridge_Tests" */; + buildPhases = ( + 0657025DFA32CED84D3527AD /* [CP] Check Pods Manifest.lock */, + 6003F5AA195388D20070C39A /* Sources */, + 6003F5AB195388D20070C39A /* Frameworks */, + 6003F5AC195388D20070C39A /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 6003F5B4195388D20070C39A /* PBXTargetDependency */, + ); + name = WKJavaScriptBridge_Tests; + productName = WKJavaScriptBridgeTests; + productReference = 6003F5AE195388D20070C39A /* WKJavaScriptBridge_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 6003F582195388D10070C39A /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = WK; + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = GitWangKai; + TargetAttributes = { + 6003F5AD195388D20070C39A = { + TestTargetID = 6003F589195388D20070C39A; + }; + }; + }; + buildConfigurationList = 6003F585195388D10070C39A /* Build configuration list for PBXProject "WKJavaScriptBridge" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 6003F581195388D10070C39A; + productRefGroup = 6003F58B195388D20070C39A /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 6003F589195388D20070C39A /* WKJavaScriptBridge_Example */, + 6003F5AD195388D20070C39A /* WKJavaScriptBridge_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 6003F588195388D20070C39A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 83F53F03250F0136008B0321 /* WKJSBridge.js in Resources */, + 83F53F01250EFFC5008B0321 /* index.html in Resources */, + 873B8AEB1B1F5CCA007FD442 /* Main.storyboard in Resources */, + 71719F9F1E33DC2100824A3D /* LaunchScreen.storyboard in Resources */, + 6003F5A9195388D20070C39A /* Images.xcassets in Resources */, + 6003F598195388D20070C39A /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6003F5AC195388D20070C39A /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6003F5BA195388D20070C39A /* InfoPlist.strings in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0557EFF8257E8E021A35371A /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/WKJavaScriptBridge/WKJavaScriptBridge.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/WKJavaScriptBridge.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-WKJavaScriptBridge_Example/Pods-WKJavaScriptBridge_Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 0657025DFA32CED84D3527AD /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-WKJavaScriptBridge_Tests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 2A5D66C0B451A8F7B6EA9130 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-WKJavaScriptBridge_Example-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 6003F586195388D20070C39A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6003F59E195388D20070C39A /* WKAppDelegate.m in Sources */, + 83F53EFF250EFFB3008B0321 /* WKCommonPlugin.m in Sources */, + 6003F5A7195388D20070C39A /* WKViewController.m in Sources */, + 83F53EFD250EFFB3008B0321 /* TestSecurityPlugin.m in Sources */, + 6003F59A195388D20070C39A /* main.m in Sources */, + 83F53EFE250EFFB3008B0321 /* TestPlugin.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 6003F5AA195388D20070C39A /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 6003F5BC195388D20070C39A /* Tests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 6003F5B4195388D20070C39A /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6003F589195388D20070C39A /* WKJavaScriptBridge_Example */; + targetProxy = 6003F5B3195388D20070C39A /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 6003F596195388D20070C39A /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 6003F597195388D20070C39A /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 6003F5B8195388D20070C39A /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 6003F5B9195388D20070C39A /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 71719F9D1E33DC2100824A3D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 71719F9E1E33DC2100824A3D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 6003F5BD195388D20070C39A /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 6003F5BE195388D20070C39A /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.3; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 6003F5C0195388D20070C39A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC1335159DC9AD10901908FC /* Pods-WKJavaScriptBridge_Example.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "WKJavaScriptBridge/WKJavaScriptBridge-Prefix.pch"; + INFOPLIST_FILE = "WKJavaScriptBridge/WKJavaScriptBridge-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 6003F5C1195388D20070C39A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3FE1E5AD60555277E56091E2 /* Pods-WKJavaScriptBridge_Example.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "WKJavaScriptBridge/WKJavaScriptBridge-Prefix.pch"; + INFOPLIST_FILE = "WKJavaScriptBridge/WKJavaScriptBridge-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; + 6003F5C3195388D20070C39A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3DE9B6B533B90FF6E2EEDC2F /* Pods-WKJavaScriptBridge_Tests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "Tests/Tests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WKJavaScriptBridge_Example.app/WKJavaScriptBridge_Example"; + WRAPPER_EXTENSION = xctest; + }; + name = Debug; + }; + 6003F5C4195388D20070C39A /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1676BACDF544EC174D2EE1C3 /* Pods-WKJavaScriptBridge_Tests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + "$(inherited)", + "$(DEVELOPER_FRAMEWORKS_DIR)", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "Tests/Tests-Prefix.pch"; + INFOPLIST_FILE = "Tests/Tests-Info.plist"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WKJavaScriptBridge_Example.app/WKJavaScriptBridge_Example"; + WRAPPER_EXTENSION = xctest; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 6003F585195388D10070C39A /* Build configuration list for PBXProject "WKJavaScriptBridge" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6003F5BD195388D20070C39A /* Debug */, + 6003F5BE195388D20070C39A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6003F5BF195388D20070C39A /* Build configuration list for PBXNativeTarget "WKJavaScriptBridge_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6003F5C0195388D20070C39A /* Debug */, + 6003F5C1195388D20070C39A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 6003F5C2195388D20070C39A /* Build configuration list for PBXNativeTarget "WKJavaScriptBridge_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 6003F5C3195388D20070C39A /* Debug */, + 6003F5C4195388D20070C39A /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 6003F582195388D10070C39A /* Project object */; +} diff --git a/Example/WKJavaScriptBridge.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/WKJavaScriptBridge.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..aac1f86 --- /dev/null +++ b/Example/WKJavaScriptBridge.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Example/WKJavaScriptBridge.xcodeproj/xcshareddata/xcschemes/WKJavaScriptBridge-Example.xcscheme b/Example/WKJavaScriptBridge.xcodeproj/xcshareddata/xcschemes/WKJavaScriptBridge-Example.xcscheme new file mode 100644 index 0000000..187b6e0 --- /dev/null +++ b/Example/WKJavaScriptBridge.xcodeproj/xcshareddata/xcschemes/WKJavaScriptBridge-Example.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/contents.xcworkspacedata b/Example/WKJavaScriptBridge.xcworkspace/contents.xcworkspacedata similarity index 75% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/contents.xcworkspacedata rename to Example/WKJavaScriptBridge.xcworkspace/contents.xcworkspacedata index ac5b3c9..c242482 100644 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/contents.xcworkspacedata +++ b/Example/WKJavaScriptBridge.xcworkspace/contents.xcworkspacedata @@ -2,7 +2,7 @@ + location = "group:WKJavaScriptBridge.xcodeproj"> diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/WKJavaScriptBridge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Example/WKJavaScriptBridge.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Example/WKJavaScriptBridge.xcworkspace/xcuserdata/wangkai.xcuserdatad/UserInterfaceState.xcuserstate b/Example/WKJavaScriptBridge.xcworkspace/xcuserdata/wangkai.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..2b4ac0258c65936099d2fd354726d106a0785698 GIT binary patch literal 37614 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 diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Base.lproj/LaunchScreen.storyboard b/Example/WKJavaScriptBridge/Base.lproj/LaunchScreen.storyboard similarity index 84% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Base.lproj/LaunchScreen.storyboard rename to Example/WKJavaScriptBridge/Base.lproj/LaunchScreen.storyboard index 0cf6fcd..fc810a6 100644 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Base.lproj/LaunchScreen.storyboard +++ b/Example/WKJavaScriptBridge/Base.lproj/LaunchScreen.storyboard @@ -1,11 +1,11 @@ - + - + @@ -14,8 +14,8 @@ - - + + diff --git a/Example/WKJavaScriptBridge/Base.lproj/Main.storyboard b/Example/WKJavaScriptBridge/Base.lproj/Main.storyboard new file mode 100644 index 0000000..1052423 --- /dev/null +++ b/Example/WKJavaScriptBridge/Base.lproj/Main.storyboard @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example/WKJavaScriptBridge/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 99% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Example/WKJavaScriptBridge/Images.xcassets/AppIcon.appiconset/Contents.json index d8db8d6..b542ec2 100644 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Example/WKJavaScriptBridge/Images.xcassets/AppIcon.appiconset/Contents.json @@ -95,4 +95,4 @@ "version" : 1, "author" : "xcode" } -} \ No newline at end of file +} diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/Security/TestSecurityPlugin.h b/Example/WKJavaScriptBridge/NativePlugin/Security/TestSecurityPlugin.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/Security/TestSecurityPlugin.h rename to Example/WKJavaScriptBridge/NativePlugin/Security/TestSecurityPlugin.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/Security/TestSecurityPlugin.m b/Example/WKJavaScriptBridge/NativePlugin/Security/TestSecurityPlugin.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/Security/TestSecurityPlugin.m rename to Example/WKJavaScriptBridge/NativePlugin/Security/TestSecurityPlugin.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/Security/TestWebPluginSecurityConfig.h b/Example/WKJavaScriptBridge/NativePlugin/Security/TestWebPluginSecurityConfig.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/Security/TestWebPluginSecurityConfig.h rename to Example/WKJavaScriptBridge/NativePlugin/Security/TestWebPluginSecurityConfig.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/TestPlugin.h b/Example/WKJavaScriptBridge/NativePlugin/TestPlugin.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/TestPlugin.h rename to Example/WKJavaScriptBridge/NativePlugin/TestPlugin.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/TestPlugin.m b/Example/WKJavaScriptBridge/NativePlugin/TestPlugin.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/TestPlugin.m rename to Example/WKJavaScriptBridge/NativePlugin/TestPlugin.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/WKCommonPlugin.h b/Example/WKJavaScriptBridge/NativePlugin/WKCommonPlugin.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/WKCommonPlugin.h rename to Example/WKJavaScriptBridge/NativePlugin/WKCommonPlugin.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/WKCommonPlugin.m b/Example/WKJavaScriptBridge/NativePlugin/WKCommonPlugin.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/NativePlugin/WKCommonPlugin.m rename to Example/WKJavaScriptBridge/NativePlugin/WKCommonPlugin.m diff --git a/Example/WKJavaScriptBridge/WKAppDelegate.h b/Example/WKJavaScriptBridge/WKAppDelegate.h new file mode 100644 index 0000000..077bc1c --- /dev/null +++ b/Example/WKJavaScriptBridge/WKAppDelegate.h @@ -0,0 +1,15 @@ +// +// WKAppDelegate.h +// WKJavaScriptBridge +// +// Created by GitWangKai on 09/14/2020. +// Copyright (c) 2020 GitWangKai. All rights reserved. +// + +@import UIKit; + +@interface WKAppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/AppDelegate.m b/Example/WKJavaScriptBridge/WKAppDelegate.m similarity index 71% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/AppDelegate.m rename to Example/WKJavaScriptBridge/WKAppDelegate.m index 4bf735c..ca8fc0e 100644 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/AppDelegate.m +++ b/Example/WKJavaScriptBridge/WKAppDelegate.m @@ -1,51 +1,46 @@ // -// AppDelegate.m -// Hybrid-framework +// WKAppDelegate.m +// WKJavaScriptBridge // -// Created by 王凯 on 2018/12/5. -// Copyright © 2018 王凯. All rights reserved. +// Created by GitWangKai on 09/14/2020. +// Copyright (c) 2020 GitWangKai. All rights reserved. // -#import "AppDelegate.h" +#import "WKAppDelegate.h" -@interface AppDelegate () +@implementation WKAppDelegate -@end - -@implementation AppDelegate - - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ // Override point for customization after application launch. return YES; } - -- (void)applicationWillResignActive:(UIApplication *)application { +- (void)applicationWillResignActive:(UIApplication *)application +{ // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - -- (void)applicationDidEnterBackground:(UIApplication *)application { +- (void)applicationDidEnterBackground:(UIApplication *)application +{ // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - -- (void)applicationWillEnterForeground:(UIApplication *)application { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. +- (void)applicationWillEnterForeground:(UIApplication *)application +{ + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - -- (void)applicationDidBecomeActive:(UIApplication *)application { +- (void)applicationDidBecomeActive:(UIApplication *)application +{ // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - -- (void)applicationWillTerminate:(UIApplication *)application { +- (void)applicationWillTerminate:(UIApplication *)application +{ // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. } - @end diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/WKJSBridge.js b/Example/WKJavaScriptBridge/WKJSBridge.js similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/WKJSBridge.js rename to Example/WKJavaScriptBridge/WKJSBridge.js diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Info.plist b/Example/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist similarity index 82% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Info.plist rename to Example/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist index 173fdf5..7576a0d 100644 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Info.plist +++ b/Example/WKJavaScriptBridge/WKJavaScriptBridge-Info.plist @@ -2,29 +2,26 @@ - NSAppTransportSecurity - - NSAllowsArbitraryLoadsInWebContent - - NSAllowsArbitraryLoads - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) + en + CFBundleDisplayName + ${PRODUCT_NAME} CFBundleExecutable - $(EXECUTABLE_NAME) + ${EXECUTABLE_NAME} CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName - $(PRODUCT_NAME) + ${PRODUCT_NAME} CFBundlePackageType APPL CFBundleShortVersionString 1.0 + CFBundleSignature + ???? CFBundleVersion - 1 + 1.0 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/Example/WKJavaScriptBridge/WKJavaScriptBridge-Prefix.pch b/Example/WKJavaScriptBridge/WKJavaScriptBridge-Prefix.pch new file mode 100644 index 0000000..7825372 --- /dev/null +++ b/Example/WKJavaScriptBridge/WKJavaScriptBridge-Prefix.pch @@ -0,0 +1,16 @@ +// +// Prefix header +// +// The contents of this file are implicitly included at the beginning of every source file. +// + +#import + +#ifndef __IPHONE_5_0 +#warning "This project uses features only available in iOS SDK 5.0 and later." +#endif + +#ifdef __OBJC__ + @import UIKit; + @import Foundation; +#endif diff --git a/Example/WKJavaScriptBridge/WKViewController.h b/Example/WKJavaScriptBridge/WKViewController.h new file mode 100644 index 0000000..da144ee --- /dev/null +++ b/Example/WKJavaScriptBridge/WKViewController.h @@ -0,0 +1,13 @@ +// +// WKViewController.h +// WKJavaScriptBridge +// +// Created by GitWangKai on 09/14/2020. +// Copyright (c) 2020 GitWangKai. All rights reserved. +// + +@import UIKit; + +@interface WKViewController : UIViewController + +@end diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestWKWebViewController.m b/Example/WKJavaScriptBridge/WKViewController.m similarity index 79% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestWKWebViewController.m rename to Example/WKJavaScriptBridge/WKViewController.m index 8423cc7..3430736 100644 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestWKWebViewController.m +++ b/Example/WKJavaScriptBridge/WKViewController.m @@ -1,27 +1,29 @@ // -// TestWKwebViewController.m -// Hybrid-framework +// WKViewController.m +// WKJavaScriptBridge // -// Created by Kevin on 2019/4/22. -// Copyright © 2019 王凯. All rights reserved. +// Created by GitWangKai on 09/14/2020. +// Copyright (c) 2020 GitWangKai. All rights reserved. // -#import "TestWKWebViewController.h" +#import "WKViewController.h" #import #import "WKJavaScriptBridge.h" -@interface TestWKWebViewController () +@interface WKViewController () @property (nonatomic, strong) WKJavaScriptBridge *bridge; @property (nonatomic, strong) WKWebView *webView; @property (nonatomic, strong) WKProcessPool *processPool; @property (nonatomic, assign, getter=loadFinished) BOOL isLoadFinished; @end -@implementation TestWKWebViewController +@implementation WKViewController -- (void)viewDidLoad { +- (void)viewDidLoad +{ [super viewDidLoad]; - // Do any additional setup after loading the view. + // Do any additional setup after loading the view, typically from a nib. + self.isLoadFinished = NO; /* 由于WKWebView在请求过程中用户可能退出界面销毁对象,当请求回调时由于接收处理对象不存在,造成Bad Access crash,所以可将WKProcessPool设为单例 @@ -42,7 +44,7 @@ - (void)viewDidLoad { WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration]; self.webView = webView; webView.navigationDelegate = self; - [self addUserScript:webView]; +// [self addUserScript:webView]; /***/ self.bridge = [WKJavaScriptBridge bindBridgeWithWebView:webView]; /***/ @@ -79,21 +81,6 @@ - (void)viewDidAppear:(BOOL)animated { self.isLoadFinished = YES; } -#pragma mark - privite - -/** - 通过·document.cookie·设置cookie解决后续页面(同域)Ajax、iframe请求的cookie问题 - - @param webView wkwebview - */ -- (void)addUserScript:(WKWebView *)webView { -// NSString *js = [WKWebViewCookieMgr clientCookieScripts]; -// if (!js) return; -// WKUserScript *jsscript = [[WKUserScript alloc]initWithSource:js -// injectionTime:WKUserScriptInjectionTimeAtDocumentStart -// forMainFrameOnly:NO]; -// [webView.configuration.userContentController addUserScript:jsscript]; -} #pragma mark - WKNavigationDelegate diff --git a/Example/WKJavaScriptBridge/en.lproj/InfoPlist.strings b/Example/WKJavaScriptBridge/en.lproj/InfoPlist.strings new file mode 100644 index 0000000..477b28f --- /dev/null +++ b/Example/WKJavaScriptBridge/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/index.html b/Example/WKJavaScriptBridge/index.html similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/index.html rename to Example/WKJavaScriptBridge/index.html diff --git a/Example/WKJavaScriptBridge/main.m b/Example/WKJavaScriptBridge/main.m new file mode 100644 index 0000000..696e190 --- /dev/null +++ b/Example/WKJavaScriptBridge/main.m @@ -0,0 +1,17 @@ +// +// main.m +// WKJavaScriptBridge +// +// Created by GitWangKai on 09/14/2020. +// Copyright (c) 2020 GitWangKai. All rights reserved. +// + +@import UIKit; +#import "WKAppDelegate.h" + +int main(int argc, char * argv[]) +{ + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([WKAppDelegate class])); + } +} diff --git a/LICENSE b/LICENSE index 261eeb9..c6b608c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,201 +1,19 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. +Copyright (c) 2020 GitWangKai <18500052382@163.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md index 568bb69..0b2cb54 100644 --- a/README.md +++ b/README.md @@ -93,3 +93,4 @@ callbackId:H5传过来的回调ID WKJavaScriptBridge is available under the Apache License 2.0. See the [LICENSE](https://github.com/GitWangKai/WKJavaScriptBridge/blob/master/LICENSE) file for more info. + diff --git a/WKJavaScriptBridge-demo/Podfile b/WKJavaScriptBridge-demo/Podfile deleted file mode 100644 index d1a6c1f..0000000 --- a/WKJavaScriptBridge-demo/Podfile +++ /dev/null @@ -1,7 +0,0 @@ -# Uncomment the next line to define a global platform for your project - platform :ios, '8.0' - -target 'WKJavaScriptBridge-demo' do -# pod 'WKJavaScriptBridge' - -end diff --git a/WKJavaScriptBridge-demo/Podfile.lock b/WKJavaScriptBridge-demo/Podfile.lock deleted file mode 100644 index fa1d3fd..0000000 --- a/WKJavaScriptBridge-demo/Podfile.lock +++ /dev/null @@ -1,3 +0,0 @@ -PODFILE CHECKSUM: daae038c02c5239e8a8c75280f94ffe59b4c6886 - -COCOAPODS: 1.6.1 diff --git a/WKJavaScriptBridge-demo/Pods/Manifest.lock b/WKJavaScriptBridge-demo/Pods/Manifest.lock deleted file mode 100644 index fa1d3fd..0000000 --- a/WKJavaScriptBridge-demo/Pods/Manifest.lock +++ /dev/null @@ -1,3 +0,0 @@ -PODFILE CHECKSUM: daae038c02c5239e8a8c75280f94ffe59b4c6886 - -COCOAPODS: 1.6.1 diff --git a/WKJavaScriptBridge-demo/Pods/Pods.xcodeproj/project.pbxproj b/WKJavaScriptBridge-demo/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index 3e7e3c5..0000000 --- a/WKJavaScriptBridge-demo/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,339 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - AF2961BD438BA5FFD28B94B42C34F2B9 /* Pods-WKJavaScriptBridge-demo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E406C346583620BF061EAD06B4E8E6D /* Pods-WKJavaScriptBridge-demo-dummy.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 53C367029AA29477145A56561FD386C3 /* Pods-WKJavaScriptBridge-demo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WKJavaScriptBridge-demo-acknowledgements.plist"; sourceTree = ""; }; - 6D080D3D8A5B7EAF386BA0694E59DCE1 /* libPods-WKJavaScriptBridge-demo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-WKJavaScriptBridge-demo.a"; path = "libPods-WKJavaScriptBridge-demo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 7AD1600727BB580BAC0219952D8F8A7A /* Pods-WKJavaScriptBridge-demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WKJavaScriptBridge-demo.release.xcconfig"; sourceTree = ""; }; - 8E406C346583620BF061EAD06B4E8E6D /* Pods-WKJavaScriptBridge-demo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WKJavaScriptBridge-demo-dummy.m"; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - BB35D1B0F5E5B98696111B3EB6D59CC0 /* Pods-WKJavaScriptBridge-demo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WKJavaScriptBridge-demo-acknowledgements.markdown"; sourceTree = ""; }; - C194B1208F4DCFECE738EF083AE5BB6F /* Pods-WKJavaScriptBridge-demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WKJavaScriptBridge-demo.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - A0D5DD0089E98240D636A646CA4ACF53 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 01C7CB5A90D9F06DA5C3EF48F4F2A3E9 /* Products */ = { - isa = PBXGroup; - children = ( - 6D080D3D8A5B7EAF386BA0694E59DCE1 /* libPods-WKJavaScriptBridge-demo.a */, - ); - name = Products; - sourceTree = ""; - }; - A61F024E86D179AA1756A9ED04F4A3CD /* Pods-WKJavaScriptBridge-demo */ = { - isa = PBXGroup; - children = ( - BB35D1B0F5E5B98696111B3EB6D59CC0 /* Pods-WKJavaScriptBridge-demo-acknowledgements.markdown */, - 53C367029AA29477145A56561FD386C3 /* Pods-WKJavaScriptBridge-demo-acknowledgements.plist */, - 8E406C346583620BF061EAD06B4E8E6D /* Pods-WKJavaScriptBridge-demo-dummy.m */, - C194B1208F4DCFECE738EF083AE5BB6F /* Pods-WKJavaScriptBridge-demo.debug.xcconfig */, - 7AD1600727BB580BAC0219952D8F8A7A /* Pods-WKJavaScriptBridge-demo.release.xcconfig */, - ); - name = "Pods-WKJavaScriptBridge-demo"; - path = "Target Support Files/Pods-WKJavaScriptBridge-demo"; - sourceTree = ""; - }; - B79833D723E78110D8B983CFD27C8C17 /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - A61F024E86D179AA1756A9ED04F4A3CD /* Pods-WKJavaScriptBridge-demo */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - CF1408CF629C7361332E53B88F7BD30C = { - isa = PBXGroup; - children = ( - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - D89477F20FB1DE18A04690586D7808C4 /* Frameworks */, - 01C7CB5A90D9F06DA5C3EF48F4F2A3E9 /* Products */, - B79833D723E78110D8B983CFD27C8C17 /* Targets Support Files */, - ); - sourceTree = ""; - }; - D89477F20FB1DE18A04690586D7808C4 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - FA6B2F9957BEEE0D810C7847B870BFD0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - B30352F5B8D45B1CE24298B4480DEC99 /* Pods-WKJavaScriptBridge-demo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7417409D1A9A17FB884B95CCF56BB2CC /* Build configuration list for PBXNativeTarget "Pods-WKJavaScriptBridge-demo" */; - buildPhases = ( - FA6B2F9957BEEE0D810C7847B870BFD0 /* Headers */, - 7AB8B8B5DE29F93DF42A363F47EC9693 /* Sources */, - A0D5DD0089E98240D636A646CA4ACF53 /* Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "Pods-WKJavaScriptBridge-demo"; - productName = "Pods-WKJavaScriptBridge-demo"; - productReference = 6D080D3D8A5B7EAF386BA0694E59DCE1 /* libPods-WKJavaScriptBridge-demo.a */; - productType = "com.apple.product-type.library.static"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - BFDFE7DC352907FC980B868725387E98 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0930; - LastUpgradeCheck = 0930; - }; - buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 01C7CB5A90D9F06DA5C3EF48F4F2A3E9 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - B30352F5B8D45B1CE24298B4480DEC99 /* Pods-WKJavaScriptBridge-demo */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 7AB8B8B5DE29F93DF42A363F47EC9693 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - AF2961BD438BA5FFD28B94B42C34F2B9 /* Pods-WKJavaScriptBridge-demo-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 05DF210AC65EBB0E593AAF976B2C2177 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_VERSION = 4.2; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Release; - }; - 155B4CA3B9B19A89BD73795ABE70F626 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AD1600727BB580BAC0219952D8F8A7A /* Pods-WKJavaScriptBridge-demo.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 40BD47788BD70DFAFAF98DA104659803 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C194B1208F4DCFECE738EF083AE5BB6F /* Pods-WKJavaScriptBridge-demo.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MACH_O_TYPE = staticlib; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 421ECB1396280A8D83853C3DDBED1700 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.2; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 421ECB1396280A8D83853C3DDBED1700 /* Debug */, - 05DF210AC65EBB0E593AAF976B2C2177 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7417409D1A9A17FB884B95CCF56BB2CC /* Build configuration list for PBXNativeTarget "Pods-WKJavaScriptBridge-demo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 40BD47788BD70DFAFAF98DA104659803 /* Debug */, - 155B4CA3B9B19A89BD73795ABE70F626 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; -} diff --git a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-dummy.m b/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-dummy.m deleted file mode 100644 index 995a3c9..0000000 --- a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_WKJavaScriptBridge_demo : NSObject -@end -@implementation PodsDummy_Pods_WKJavaScriptBridge_demo -@end diff --git a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-resources.sh b/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-resources.sh deleted file mode 100755 index 8c3879b..0000000 --- a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo-resources.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/sh -set -e -set -u -set -o pipefail - -function on_error { - echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" -} -trap 'on_error $LINENO' ERR - -if [ -z ${UNLOCALIZED_RESOURCES_FOLDER_PATH+x} ]; then - # If UNLOCALIZED_RESOURCES_FOLDER_PATH is not set, then there's nowhere for us to copy - # resources to, so exit 0 (signalling the script phase was successful). - exit 0 -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -# This protects against multiple targets copying the same framework dependency at the same time. The solution -# was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html -RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") - -case "${TARGETED_DEVICE_FAMILY:-}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - 3) - TARGET_DEVICE_ARGS="--target-device tv" - ;; - 4) - TARGET_DEVICE_ARGS="--target-device watch" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; -esac - -install_resource() -{ - if [[ "$1" = /* ]] ; then - RESOURCE_PATH="$1" - else - RESOURCE_PATH="${PODS_ROOT}/$1" - fi - if [[ ! -e "$RESOURCE_PATH" ]] ; then - cat << EOM -error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. -EOM - exit 1 - fi - case $RESOURCE_PATH in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" || true - ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} - ;; - *.framework) - echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" || true - rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" || true - xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" || true - xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - *) - echo "$RESOURCE_PATH" || true - echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" - ;; - esac -} -if [[ "$CONFIGURATION" == "Debug" ]]; then - install_resource "${PODS_ROOT}/WKJavaScriptBridge/WKJavaScriptBridge/WKJSBridge.js" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_resource "${PODS_ROOT}/WKJavaScriptBridge/WKJavaScriptBridge/WKJSBridge.js" -fi - -mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "${XCASSET_FILES:-}" ] -then - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "${PODS_ROOT}*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - if [ -z ${ASSETCATALOG_COMPILER_APPICON_NAME+x} ]; then - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - else - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" --app-icon "${ASSETCATALOG_COMPILER_APPICON_NAME}" --output-partial-info-plist "${TARGET_TEMP_DIR}/assetcatalog_generated_info_cocoapods.plist" - fi -fi diff --git a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.debug.xcconfig b/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.debug.xcconfig deleted file mode 100644 index 729bac8..0000000 --- a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.debug.xcconfig +++ /dev/null @@ -1,6 +0,0 @@ -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -ObjC -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.release.xcconfig b/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.release.xcconfig deleted file mode 100644 index 729bac8..0000000 --- a/WKJavaScriptBridge-demo/Pods/Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.release.xcconfig +++ /dev/null @@ -1,6 +0,0 @@ -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -ObjC -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_PODFILE_DIR_PATH = ${SRCROOT}/. -PODS_ROOT = ${SRCROOT}/Pods diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.pbxproj b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.pbxproj deleted file mode 100644 index 0d3da0c..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.pbxproj +++ /dev/null @@ -1,558 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 50; - objects = { - -/* Begin PBXBuildFile section */ - 0A0EE1B1235F0E77002232BB /* WKJavaScriptBridge.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1B0235F0E77002232BB /* WKJavaScriptBridge.m */; }; - 0A0EE1B8235F0F36002232BB /* WKJavaScriptMessageDispatcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1B7235F0F36002232BB /* WKJavaScriptMessageDispatcher.m */; }; - 0A0EE1BB235F0F87002232BB /* WKMsgCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1BA235F0F87002232BB /* WKMsgCommand.m */; }; - 0A0EE1BF235F100B002232BB /* WKBasePlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1BE235F100B002232BB /* WKBasePlugin.m */; }; - 0A0EE1C2235F103E002232BB /* WKCommandImpl.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1C1235F103E002232BB /* WKCommandImpl.m */; }; - 0A0EE1C7235F10C4002232BB /* WKPluginResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1C6235F10C4002232BB /* WKPluginResult.m */; }; - 0A0EE1CD235F1152002232BB /* NSString+BridgeJSONPrivate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1CC235F1152002232BB /* NSString+BridgeJSONPrivate.m */; }; - 0A0EE1D0235F117F002232BB /* WKWeakScriptMessageHandlerDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1CF235F117F002232BB /* WKWeakScriptMessageHandlerDelegate.m */; }; - 0A0EE1D7235F12A5002232BB /* WKCommonPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A0EE1D6235F12A5002232BB /* WKCommonPlugin.m */; }; - 0A0EE1D9235F1BBC002232BB /* WKJSBridge.js in Resources */ = {isa = PBXBuildFile; fileRef = 0A0EE1D8235F1BBC002232BB /* WKJSBridge.js */; }; - 0A10882824861C0C00D7ECEE /* WKJavaScriptBridgePluginAnnotation.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A10882724861C0C00D7ECEE /* WKJavaScriptBridgePluginAnnotation.m */; }; - 0A10882E2486237A00D7ECEE /* TestSecurityPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A10882D2486237A00D7ECEE /* TestSecurityPlugin.m */; }; - 0A10883124862CA400D7ECEE /* TestPlugin.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A10883024862CA400D7ECEE /* TestPlugin.m */; }; - 0A9A3965226D940600D0DF43 /* TestWKWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A9A3962226D940600D0DF43 /* TestWKWebViewController.m */; }; - 0A9E4690225B2922003F6574 /* TestViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 0A9E468F225B2922003F6574 /* TestViewController.m */; }; - 832F7C8821B822510076D164 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 832F7C8721B822510076D164 /* AppDelegate.m */; }; - 832F7C8B21B822510076D164 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 832F7C8A21B822510076D164 /* ViewController.m */; }; - 832F7C8E21B822510076D164 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 832F7C8C21B822510076D164 /* Main.storyboard */; }; - 832F7C9021B822530076D164 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 832F7C8F21B822530076D164 /* Assets.xcassets */; }; - 832F7C9321B822530076D164 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 832F7C9121B822530076D164 /* LaunchScreen.storyboard */; }; - 832F7C9621B822530076D164 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 832F7C9521B822530076D164 /* main.m */; }; - 832F7CB221B8E6460076D164 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 832F7CB121B8E6460076D164 /* WebKit.framework */; }; - 832F7CB721B904C60076D164 /* index.html in Resources */ = {isa = PBXBuildFile; fileRef = 832F7CB621B904C50076D164 /* index.html */; }; - BAE91BDBD128B2356F07975D /* libPods-WKJavaScriptBridge-demo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E5973883F04EEF4EBBB3F713 /* libPods-WKJavaScriptBridge-demo.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 05DB13B25C25AB5F7DA35A90 /* Pods-WKJavaScriptBridge-demo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WKJavaScriptBridge-demo.debug.xcconfig"; path = "Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.debug.xcconfig"; sourceTree = ""; }; - 0A0EE1AF235F0E77002232BB /* WKJavaScriptBridge.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKJavaScriptBridge.h; sourceTree = ""; }; - 0A0EE1B0235F0E77002232BB /* WKJavaScriptBridge.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKJavaScriptBridge.m; sourceTree = ""; }; - 0A0EE1B5235F0EFC002232BB /* WKJavaScriptBridgeProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKJavaScriptBridgeProtocol.h; sourceTree = ""; }; - 0A0EE1B6235F0F36002232BB /* WKJavaScriptMessageDispatcher.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKJavaScriptMessageDispatcher.h; sourceTree = ""; }; - 0A0EE1B7235F0F36002232BB /* WKJavaScriptMessageDispatcher.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKJavaScriptMessageDispatcher.m; sourceTree = ""; }; - 0A0EE1B9235F0F87002232BB /* WKMsgCommand.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKMsgCommand.h; sourceTree = ""; }; - 0A0EE1BA235F0F87002232BB /* WKMsgCommand.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKMsgCommand.m; sourceTree = ""; }; - 0A0EE1BD235F100B002232BB /* WKBasePlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKBasePlugin.h; sourceTree = ""; }; - 0A0EE1BE235F100B002232BB /* WKBasePlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKBasePlugin.m; sourceTree = ""; }; - 0A0EE1C0235F103E002232BB /* WKCommandImpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKCommandImpl.h; sourceTree = ""; }; - 0A0EE1C1235F103E002232BB /* WKCommandImpl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKCommandImpl.m; sourceTree = ""; }; - 0A0EE1C3235F1072002232BB /* WKCommandProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKCommandProtocol.h; sourceTree = ""; }; - 0A0EE1C4235F109E002232BB /* WKPluginProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKPluginProtocol.h; sourceTree = ""; }; - 0A0EE1C5235F10C4002232BB /* WKPluginResult.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKPluginResult.h; sourceTree = ""; }; - 0A0EE1C6235F10C4002232BB /* WKPluginResult.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKPluginResult.m; sourceTree = ""; }; - 0A0EE1CB235F1152002232BB /* NSString+BridgeJSONPrivate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSString+BridgeJSONPrivate.h"; sourceTree = ""; }; - 0A0EE1CC235F1152002232BB /* NSString+BridgeJSONPrivate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSString+BridgeJSONPrivate.m"; sourceTree = ""; }; - 0A0EE1CE235F117F002232BB /* WKWeakScriptMessageHandlerDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKWeakScriptMessageHandlerDelegate.h; sourceTree = ""; }; - 0A0EE1CF235F117F002232BB /* WKWeakScriptMessageHandlerDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKWeakScriptMessageHandlerDelegate.m; sourceTree = ""; }; - 0A0EE1D5235F12A5002232BB /* WKCommonPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKCommonPlugin.h; sourceTree = ""; }; - 0A0EE1D6235F12A5002232BB /* WKCommonPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = WKCommonPlugin.m; sourceTree = ""; }; - 0A0EE1D8235F1BBC002232BB /* WKJSBridge.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = WKJSBridge.js; sourceTree = ""; }; - 0A10882624861C0C00D7ECEE /* WKJavaScriptBridgePluginAnnotation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKJavaScriptBridgePluginAnnotation.h; sourceTree = ""; }; - 0A10882724861C0C00D7ECEE /* WKJavaScriptBridgePluginAnnotation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WKJavaScriptBridgePluginAnnotation.m; sourceTree = ""; }; - 0A10882924861E1200D7ECEE /* WKPluginSecurityProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = WKPluginSecurityProtocol.h; sourceTree = ""; }; - 0A10882B2486221000D7ECEE /* TestWebPluginSecurityConfig.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestWebPluginSecurityConfig.h; sourceTree = ""; }; - 0A10882C2486237A00D7ECEE /* TestSecurityPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestSecurityPlugin.h; sourceTree = ""; }; - 0A10882D2486237A00D7ECEE /* TestSecurityPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestSecurityPlugin.m; sourceTree = ""; }; - 0A10882F24862CA400D7ECEE /* TestPlugin.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestPlugin.h; sourceTree = ""; }; - 0A10883024862CA400D7ECEE /* TestPlugin.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestPlugin.m; sourceTree = ""; }; - 0A9A395F226D940500D0DF43 /* TestWKWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TestWKWebViewController.h; sourceTree = ""; }; - 0A9A3962226D940600D0DF43 /* TestWKWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TestWKWebViewController.m; sourceTree = ""; }; - 0A9E468E225B2922003F6574 /* TestViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestViewController.h; sourceTree = ""; }; - 0A9E468F225B2922003F6574 /* TestViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TestViewController.m; sourceTree = ""; }; - 29E50CB97F5DD0FD75EBAF15 /* Pods-WKJavaScriptBridge-demo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WKJavaScriptBridge-demo.release.xcconfig"; path = "Target Support Files/Pods-WKJavaScriptBridge-demo/Pods-WKJavaScriptBridge-demo.release.xcconfig"; sourceTree = ""; }; - 832F7C8321B822510076D164 /* WKJavaScriptBridge-demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "WKJavaScriptBridge-demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; - 832F7C8621B822510076D164 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 832F7C8721B822510076D164 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 832F7C8921B822510076D164 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 832F7C8A21B822510076D164 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 832F7C8D21B822510076D164 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 832F7C8F21B822530076D164 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 832F7C9221B822530076D164 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 832F7C9421B822530076D164 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 832F7C9521B822530076D164 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 832F7CB121B8E6460076D164 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; - 832F7CB621B904C50076D164 /* index.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = index.html; sourceTree = ""; }; - E5973883F04EEF4EBBB3F713 /* libPods-WKJavaScriptBridge-demo.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-WKJavaScriptBridge-demo.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 832F7C8021B822510076D164 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 832F7CB221B8E6460076D164 /* WebKit.framework in Frameworks */, - BAE91BDBD128B2356F07975D /* libPods-WKJavaScriptBridge-demo.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0A0EE1BC235F0FFF002232BB /* Plugin */ = { - isa = PBXGroup; - children = ( - 0A0EE1BD235F100B002232BB /* WKBasePlugin.h */, - 0A0EE1BE235F100B002232BB /* WKBasePlugin.m */, - 0A0EE1C0235F103E002232BB /* WKCommandImpl.h */, - 0A0EE1C1235F103E002232BB /* WKCommandImpl.m */, - 0A0EE1C3235F1072002232BB /* WKCommandProtocol.h */, - 0A0EE1C4235F109E002232BB /* WKPluginProtocol.h */, - 0A0EE1C5235F10C4002232BB /* WKPluginResult.h */, - 0A0EE1C6235F10C4002232BB /* WKPluginResult.m */, - ); - path = Plugin; - sourceTree = ""; - }; - 0A0EE1D1235F122B002232BB /* NativePlugin */ = { - isa = PBXGroup; - children = ( - 0A10882A248621E900D7ECEE /* Security */, - 0A0EE1D5235F12A5002232BB /* WKCommonPlugin.h */, - 0A0EE1D6235F12A5002232BB /* WKCommonPlugin.m */, - 0A10882F24862CA400D7ECEE /* TestPlugin.h */, - 0A10883024862CA400D7ECEE /* TestPlugin.m */, - ); - path = NativePlugin; - sourceTree = ""; - }; - 0A10882524861BD400D7ECEE /* Security */ = { - isa = PBXGroup; - children = ( - 0A10882624861C0C00D7ECEE /* WKJavaScriptBridgePluginAnnotation.h */, - 0A10882724861C0C00D7ECEE /* WKJavaScriptBridgePluginAnnotation.m */, - 0A10882924861E1200D7ECEE /* WKPluginSecurityProtocol.h */, - ); - path = Security; - sourceTree = ""; - }; - 0A10882A248621E900D7ECEE /* Security */ = { - isa = PBXGroup; - children = ( - 0A10882B2486221000D7ECEE /* TestWebPluginSecurityConfig.h */, - 0A10882C2486237A00D7ECEE /* TestSecurityPlugin.h */, - 0A10882D2486237A00D7ECEE /* TestSecurityPlugin.m */, - ); - path = Security; - sourceTree = ""; - }; - 0AB7D4DB235437C00054719A /* Dispatcher */ = { - isa = PBXGroup; - children = ( - 0A0EE1B6235F0F36002232BB /* WKJavaScriptMessageDispatcher.h */, - 0A0EE1B7235F0F36002232BB /* WKJavaScriptMessageDispatcher.m */, - 0A0EE1B9235F0F87002232BB /* WKMsgCommand.h */, - 0A0EE1BA235F0F87002232BB /* WKMsgCommand.m */, - ); - path = Dispatcher; - sourceTree = ""; - }; - 0AB7D4EA235437C00054719A /* Util */ = { - isa = PBXGroup; - children = ( - 0A0EE1CB235F1152002232BB /* NSString+BridgeJSONPrivate.h */, - 0A0EE1CC235F1152002232BB /* NSString+BridgeJSONPrivate.m */, - 0A0EE1CE235F117F002232BB /* WKWeakScriptMessageHandlerDelegate.h */, - 0A0EE1CF235F117F002232BB /* WKWeakScriptMessageHandlerDelegate.m */, - ); - path = Util; - sourceTree = ""; - }; - 0AEB5C8422A529FD00B13C09 /* WKJavaScriptBridge */ = { - isa = PBXGroup; - children = ( - 0A10882524861BD400D7ECEE /* Security */, - 0AB7D4DB235437C00054719A /* Dispatcher */, - 0A0EE1BC235F0FFF002232BB /* Plugin */, - 0AB7D4EA235437C00054719A /* Util */, - 0A0EE1AF235F0E77002232BB /* WKJavaScriptBridge.h */, - 0A0EE1B0235F0E77002232BB /* WKJavaScriptBridge.m */, - 0A0EE1B5235F0EFC002232BB /* WKJavaScriptBridgeProtocol.h */, - 0A0EE1D8235F1BBC002232BB /* WKJSBridge.js */, - ); - path = WKJavaScriptBridge; - sourceTree = ""; - }; - 832F7C7A21B822510076D164 = { - isa = PBXGroup; - children = ( - 832F7C8521B822510076D164 /* WKJavaScriptBridge-demo */, - 832F7C8421B822510076D164 /* Products */, - 832F7CB021B8E6460076D164 /* Frameworks */, - EDC6E15DAEDCFEAB3060DBC2 /* Pods */, - ); - sourceTree = ""; - }; - 832F7C8421B822510076D164 /* Products */ = { - isa = PBXGroup; - children = ( - 832F7C8321B822510076D164 /* WKJavaScriptBridge-demo.app */, - ); - name = Products; - sourceTree = ""; - }; - 832F7C8521B822510076D164 /* WKJavaScriptBridge-demo */ = { - isa = PBXGroup; - children = ( - 0A0EE1D1235F122B002232BB /* NativePlugin */, - 832F7CB621B904C50076D164 /* index.html */, - 0AEB5C8422A529FD00B13C09 /* WKJavaScriptBridge */, - 832F7C8621B822510076D164 /* AppDelegate.h */, - 832F7C8721B822510076D164 /* AppDelegate.m */, - 832F7C8921B822510076D164 /* ViewController.h */, - 832F7C8A21B822510076D164 /* ViewController.m */, - 0A9A395F226D940500D0DF43 /* TestWKWebViewController.h */, - 0A9A3962226D940600D0DF43 /* TestWKWebViewController.m */, - 0A9E468E225B2922003F6574 /* TestViewController.h */, - 0A9E468F225B2922003F6574 /* TestViewController.m */, - 832F7C8C21B822510076D164 /* Main.storyboard */, - 832F7C8F21B822530076D164 /* Assets.xcassets */, - 832F7C9121B822530076D164 /* LaunchScreen.storyboard */, - 832F7C9421B822530076D164 /* Info.plist */, - 832F7C9521B822530076D164 /* main.m */, - ); - path = "WKJavaScriptBridge-demo"; - sourceTree = ""; - }; - 832F7CB021B8E6460076D164 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 832F7CB121B8E6460076D164 /* WebKit.framework */, - E5973883F04EEF4EBBB3F713 /* libPods-WKJavaScriptBridge-demo.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - EDC6E15DAEDCFEAB3060DBC2 /* Pods */ = { - isa = PBXGroup; - children = ( - 05DB13B25C25AB5F7DA35A90 /* Pods-WKJavaScriptBridge-demo.debug.xcconfig */, - 29E50CB97F5DD0FD75EBAF15 /* Pods-WKJavaScriptBridge-demo.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 832F7C8221B822510076D164 /* WKJavaScriptBridge-demo */ = { - isa = PBXNativeTarget; - buildConfigurationList = 832F7C9921B822530076D164 /* Build configuration list for PBXNativeTarget "WKJavaScriptBridge-demo" */; - buildPhases = ( - 5AB00C0120B7CA52F9DDB898 /* [CP] Check Pods Manifest.lock */, - 832F7C7F21B822510076D164 /* Sources */, - 832F7C8021B822510076D164 /* Frameworks */, - 832F7C8121B822510076D164 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "WKJavaScriptBridge-demo"; - productName = "Hybrid-framework"; - productReference = 832F7C8321B822510076D164 /* WKJavaScriptBridge-demo.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 832F7C7B21B822510076D164 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 1000; - ORGANIZATIONNAME = "王凯"; - TargetAttributes = { - 832F7C8221B822510076D164 = { - CreatedOnToolsVersion = 10.0; - }; - }; - }; - buildConfigurationList = 832F7C7E21B822510076D164 /* Build configuration list for PBXProject "WKJavaScriptBridge-demo" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 832F7C7A21B822510076D164; - productRefGroup = 832F7C8421B822510076D164 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 832F7C8221B822510076D164 /* WKJavaScriptBridge-demo */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 832F7C8121B822510076D164 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0A0EE1D9235F1BBC002232BB /* WKJSBridge.js in Resources */, - 832F7C9321B822530076D164 /* LaunchScreen.storyboard in Resources */, - 832F7CB721B904C60076D164 /* index.html in Resources */, - 832F7C9021B822530076D164 /* Assets.xcassets in Resources */, - 832F7C8E21B822510076D164 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 5AB00C0120B7CA52F9DDB898 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-WKJavaScriptBridge-demo-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 832F7C7F21B822510076D164 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0A9E4690225B2922003F6574 /* TestViewController.m in Sources */, - 832F7C8B21B822510076D164 /* ViewController.m in Sources */, - 0A0EE1C7235F10C4002232BB /* WKPluginResult.m in Sources */, - 0A0EE1B1235F0E77002232BB /* WKJavaScriptBridge.m in Sources */, - 0A0EE1D7235F12A5002232BB /* WKCommonPlugin.m in Sources */, - 0A0EE1BB235F0F87002232BB /* WKMsgCommand.m in Sources */, - 0A10882E2486237A00D7ECEE /* TestSecurityPlugin.m in Sources */, - 832F7C9621B822530076D164 /* main.m in Sources */, - 0A0EE1C2235F103E002232BB /* WKCommandImpl.m in Sources */, - 0A10882824861C0C00D7ECEE /* WKJavaScriptBridgePluginAnnotation.m in Sources */, - 0A9A3965226D940600D0DF43 /* TestWKWebViewController.m in Sources */, - 0A10883124862CA400D7ECEE /* TestPlugin.m in Sources */, - 832F7C8821B822510076D164 /* AppDelegate.m in Sources */, - 0A0EE1BF235F100B002232BB /* WKBasePlugin.m in Sources */, - 0A0EE1CD235F1152002232BB /* NSString+BridgeJSONPrivate.m in Sources */, - 0A0EE1D0235F117F002232BB /* WKWeakScriptMessageHandlerDelegate.m in Sources */, - 0A0EE1B8235F0F36002232BB /* WKJavaScriptMessageDispatcher.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 832F7C8C21B822510076D164 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 832F7C8D21B822510076D164 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 832F7C9121B822530076D164 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 832F7C9221B822530076D164 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 832F7C9721B822530076D164 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 832F7C9821B822530076D164 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 832F7C9A21B822530076D164 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 05DB13B25C25AB5F7DA35A90 /* Pods-WKJavaScriptBridge-demo.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 929467FPP6; - INFOPLIST_FILE = "WKJavaScriptBridge-demo/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.wangkai.responder.WKJavaScriptBridge-demo"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 832F7C9B21B822530076D164 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 29E50CB97F5DD0FD75EBAF15 /* Pods-WKJavaScriptBridge-demo.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 929467FPP6; - INFOPLIST_FILE = "WKJavaScriptBridge-demo/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = "com.wangkai.responder.WKJavaScriptBridge-demo"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 832F7C7E21B822510076D164 /* Build configuration list for PBXProject "WKJavaScriptBridge-demo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 832F7C9721B822530076D164 /* Debug */, - 832F7C9821B822530076D164 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 832F7C9921B822530076D164 /* Build configuration list for PBXNativeTarget "WKJavaScriptBridge-demo" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 832F7C9A21B822530076D164 /* Debug */, - 832F7C9B21B822530076D164 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 832F7C7B21B822510076D164 /* Project object */; -} diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 6d63d7a..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index 0c67376..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/kevin.xcuserdatad/UserInterfaceState.xcuserstate b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/kevin.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index bfcd5eb399caf6c29bb12c37ea5cf4ef7ccc2167..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 115653 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 L|NbM?`T73?^8ht` diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/wangkai.xcuserdatad/UserInterfaceState.xcuserstate b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/wangkai.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 57e39a1835c66e9a3c3c4d89288f834891ed684e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73306 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 Uw!GV6u&rNi@!!1NA+O*5AJqNMNdN!< diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/wangkai.xcuserdatad/WorkspaceSettings.xcsettings b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/wangkai.xcuserdatad/WorkspaceSettings.xcsettings deleted file mode 100644 index f25782d..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/project.xcworkspace/xcuserdata/wangkai.xcuserdatad/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,18 +0,0 @@ - - - - - BuildLocationStyle - UseAppPreferences - CustomBuildLocationType - RelativeToDerivedData - DerivedDataLocationStyle - Default - EnabledFullIndexStoreVisibility - - IssueFilterStyle - ShowActiveSchemeOnly - LiveSourceIssuesEnabled - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/kevin.xcuserdatad/xcschemes/xcschememanagement.plist b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/kevin.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 18770ab..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/kevin.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - SchemeUserState - - Hybrid-framework.xcscheme_^#shared#^_ - - orderHint - 0 - - SHRMJavaScriptBridge-demo.xcscheme_^#shared#^_ - - orderHint - 2 - - WKJavaScriptBridge-demo.xcscheme_^#shared#^_ - - orderHint - 1 - - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b454..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/xcschememanagement.plist b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 276bb6d..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcodeproj/xcuserdata/wangkai.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - SchemeUserState - - Hybrid-framework.xcscheme - - orderHint - 0 - - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcuserdata/kevin.xcuserdatad/UserInterfaceState.xcuserstate b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcuserdata/kevin.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 17b6a513a72563306a34ae5a11507497c638843f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142424 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 z 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 diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcuserdata/kevin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcuserdata/kevin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index 30fd1ff..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo.xcworkspace/xcuserdata/kevin.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/AppDelegate.h b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/AppDelegate.h deleted file mode 100644 index c1d5b66..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/AppDelegate.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// AppDelegate.h -// Hybrid-framework -// -// Created by 王凯 on 2018/12/5. -// Copyright © 2018 王凯. All rights reserved. -// - -#import - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - - -@end - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Assets.xcassets/Contents.json b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Assets.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Base.lproj/Main.storyboard b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Base.lproj/Main.storyboard deleted file mode 100755 index bc18652..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/Base.lproj/Main.storyboard +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestViewController.h b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestViewController.h deleted file mode 100644 index 6ccdcca..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestViewController.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// TestViewController.h -// Hybrid-framework -// -// Created by Kevin on 2019/4/8. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "ViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface TestViewController : UIViewController - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestViewController.m b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestViewController.m deleted file mode 100644 index 338f483..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestViewController.m +++ /dev/null @@ -1,33 +0,0 @@ -// -// TestViewController.m -// Hybrid-framework -// -// Created by Kevin on 2019/4/8. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "TestViewController.h" - -@interface TestViewController () - -@end - -@implementation TestViewController - -- (void)viewDidLoad { - [super viewDidLoad]; - // Do any additional setup after loading the view. - self.view.backgroundColor = [UIColor whiteColor]; -} - -/* -#pragma mark - Navigation - -// In a storyboard-based application, you will often want to do a little preparation before navigation -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { - // Get the new view controller using [segue destinationViewController]. - // Pass the selected object to the new view controller. -} -*/ - -@end diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestWKWebViewController.h b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestWKWebViewController.h deleted file mode 100644 index 89478e5..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/TestWKWebViewController.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// TestWKwebViewController.h -// Hybrid-framework -// -// Created by Kevin on 2019/4/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface TestWKWebViewController : UIViewController - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/ViewController.h b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/ViewController.h deleted file mode 100755 index a7c2884..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/ViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// ViewController.h -// Hybrid-framework -// -// Created by 王凯 on 2018/12/5. -// Copyright © 2018 王凯. All rights reserved. -// - -#import - -@interface ViewController : UIViewController - - -@end - diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/ViewController.m b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/ViewController.m deleted file mode 100755 index 6401b18..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/ViewController.m +++ /dev/null @@ -1,30 +0,0 @@ -// -// ViewController.m -// Hybrid-framework -// -// Created by 王凯 on 2018/12/5. -// Copyright © 2018 王凯. All rights reserved. -// - -#import "ViewController.h" -#import "TestWKWebViewController.h" - -@interface ViewController () - -@end - -@implementation ViewController - -- (void)viewDidLoad { - [super viewDidLoad]; -// NSMutableURLRequest *reqeust = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]; -// [SHRMWebViewCookieMgr syncRequestCookie:reqeust]; -// [self.webView loadRequest:reqeust]; -} - -- (IBAction)goWKWebView:(id)sender { - TestWKWebViewController *wkVC = [[TestWKWebViewController alloc] init]; - [self.navigationController pushViewController:wkVC animated:YES]; -} - -@end diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/main.m b/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/main.m deleted file mode 100644 index 4c67f09..0000000 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/main.m +++ /dev/null @@ -1,16 +0,0 @@ -// -// main.m -// Hybrid-framework -// -// Created by 王凯 on 2018/12/5. -// Copyright © 2018 王凯. All rights reserved. -// - -#import -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/WKJavaScriptBridge.podspec b/WKJavaScriptBridge.podspec index 2f9490f..0317bea 100644 --- a/WKJavaScriptBridge.podspec +++ b/WKJavaScriptBridge.podspec @@ -1,8 +1,4 @@ - - Pod::Spec.new do |spec| - - spec.name = "WKJavaScriptBridge" spec.version = "1.1.0" spec.summary = "基于WKWebView构建的JSBridge,支持iOS8+。" diff --git a/WKJavaScriptBridge/Assets/.gitkeep b/WKJavaScriptBridge/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/WKJavaScriptBridge/Classes/.gitkeep b/WKJavaScriptBridge/Classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.h b/WKJavaScriptBridge/Classes/Dispatcher/WKJavaScriptMessageDispatcher.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.h rename to WKJavaScriptBridge/Classes/Dispatcher/WKJavaScriptMessageDispatcher.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.m b/WKJavaScriptBridge/Classes/Dispatcher/WKJavaScriptMessageDispatcher.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.m rename to WKJavaScriptBridge/Classes/Dispatcher/WKJavaScriptMessageDispatcher.m index 1cf2aad..95bf680 100755 --- a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.m +++ b/WKJavaScriptBridge/Classes/Dispatcher/WKJavaScriptMessageDispatcher.m @@ -37,7 +37,6 @@ - (void)handleMsgCommand:(NSString *)arguments { - (void)handleCommand:(NSString *)commandJson { if (commandJson.length > 0) { [self fetchCommands:commandJson]; - [self executePending]; } } @@ -45,6 +44,7 @@ - (void)fetchCommands:(NSString *)command { if ([command length] < JSON_SIZE_FOR_MAIN_THREAD) { _commandDictionary = [command bridge_JSONObject]; + [self executePending]; } else { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() { self->_commandDictionary = [command bridge_JSONObject]; diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKMsgCommand.h b/WKJavaScriptBridge/Classes/Dispatcher/WKMsgCommand.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKMsgCommand.h rename to WKJavaScriptBridge/Classes/Dispatcher/WKMsgCommand.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKMsgCommand.m b/WKJavaScriptBridge/Classes/Dispatcher/WKMsgCommand.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Dispatcher/WKMsgCommand.m rename to WKJavaScriptBridge/Classes/Dispatcher/WKMsgCommand.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKBasePlugin.h b/WKJavaScriptBridge/Classes/Plugin/WKBasePlugin.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKBasePlugin.h rename to WKJavaScriptBridge/Classes/Plugin/WKBasePlugin.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKBasePlugin.m b/WKJavaScriptBridge/Classes/Plugin/WKBasePlugin.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKBasePlugin.m rename to WKJavaScriptBridge/Classes/Plugin/WKBasePlugin.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKCommandImpl.h b/WKJavaScriptBridge/Classes/Plugin/WKCommandImpl.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKCommandImpl.h rename to WKJavaScriptBridge/Classes/Plugin/WKCommandImpl.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKCommandImpl.m b/WKJavaScriptBridge/Classes/Plugin/WKCommandImpl.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKCommandImpl.m rename to WKJavaScriptBridge/Classes/Plugin/WKCommandImpl.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKCommandProtocol.h b/WKJavaScriptBridge/Classes/Plugin/WKCommandProtocol.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKCommandProtocol.h rename to WKJavaScriptBridge/Classes/Plugin/WKCommandProtocol.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKPluginProtocol.h b/WKJavaScriptBridge/Classes/Plugin/WKPluginProtocol.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKPluginProtocol.h rename to WKJavaScriptBridge/Classes/Plugin/WKPluginProtocol.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKPluginResult.h b/WKJavaScriptBridge/Classes/Plugin/WKPluginResult.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKPluginResult.h rename to WKJavaScriptBridge/Classes/Plugin/WKPluginResult.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKPluginResult.m b/WKJavaScriptBridge/Classes/Plugin/WKPluginResult.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Plugin/WKPluginResult.m rename to WKJavaScriptBridge/Classes/Plugin/WKPluginResult.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h b/WKJavaScriptBridge/Classes/Security/WKJavaScriptBridgePluginAnnotation.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h rename to WKJavaScriptBridge/Classes/Security/WKJavaScriptBridgePluginAnnotation.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m b/WKJavaScriptBridge/Classes/Security/WKJavaScriptBridgePluginAnnotation.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m rename to WKJavaScriptBridge/Classes/Security/WKJavaScriptBridgePluginAnnotation.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h b/WKJavaScriptBridge/Classes/Security/WKPluginSecurityProtocol.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h rename to WKJavaScriptBridge/Classes/Security/WKPluginSecurityProtocol.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.h b/WKJavaScriptBridge/Classes/Util/NSString+BridgeJSONPrivate.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.h rename to WKJavaScriptBridge/Classes/Util/NSString+BridgeJSONPrivate.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.m b/WKJavaScriptBridge/Classes/Util/NSString+BridgeJSONPrivate.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.m rename to WKJavaScriptBridge/Classes/Util/NSString+BridgeJSONPrivate.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.h b/WKJavaScriptBridge/Classes/Util/WKWeakScriptMessageHandlerDelegate.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.h rename to WKJavaScriptBridge/Classes/Util/WKWeakScriptMessageHandlerDelegate.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.m b/WKJavaScriptBridge/Classes/Util/WKWeakScriptMessageHandlerDelegate.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.m rename to WKJavaScriptBridge/Classes/Util/WKWeakScriptMessageHandlerDelegate.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/WKJavaScriptBridge.h b/WKJavaScriptBridge/Classes/WKJavaScriptBridge.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/WKJavaScriptBridge.h rename to WKJavaScriptBridge/Classes/WKJavaScriptBridge.h diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/WKJavaScriptBridge.m b/WKJavaScriptBridge/Classes/WKJavaScriptBridge.m similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/WKJavaScriptBridge.m rename to WKJavaScriptBridge/Classes/WKJavaScriptBridge.m diff --git a/WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h b/WKJavaScriptBridge/Classes/WKJavaScriptBridgeProtocol.h similarity index 100% rename from WKJavaScriptBridge-demo/WKJavaScriptBridge-demo/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h rename to WKJavaScriptBridge/Classes/WKJavaScriptBridgeProtocol.h diff --git a/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.h b/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.h deleted file mode 100755 index 1d06b00..0000000 --- a/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// WKJavaScriptMessageDispatcher.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class WKJavaScriptBridge; - -@interface WKJavaScriptMessageDispatcher : NSObject -- (void)handleMsgCommand:(NSString *)arguments; -- (instancetype)initWithBridge:(WKJavaScriptBridge *)bridge; -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.m b/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.m deleted file mode 100755 index 1cf2aad..0000000 --- a/WKJavaScriptBridge/Dispatcher/WKJavaScriptMessageDispatcher.m +++ /dev/null @@ -1,124 +0,0 @@ -// -// WKJavaScriptMessageDispatcher.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "WKJavaScriptMessageDispatcher.h" -#import "WKMsgCommand.h" -#import "WKJavaScriptBridge.h" -#import "WKBasePlugin.h" -#import "NSString+BridgeJSONPrivate.h" -#import - -static const NSInteger JSON_SIZE_FOR_MAIN_THREAD = 4 * 1024; // Chosen arbitrarily. - -@implementation WKJavaScriptMessageDispatcher { - __weak WKJavaScriptBridge *_bridge; - NSDictionary *_commandDictionary; -} - -- (instancetype)initWithBridge:(WKJavaScriptBridge *)bridge { - if (self = [super init]) { - _bridge = bridge; - _commandDictionary = [NSDictionary dictionary]; - } - return self; -} - -- (void)handleMsgCommand:(NSString *)arguments { - [self handleCommand:arguments]; -} - -#pragma mark - handle - -- (void)handleCommand:(NSString *)commandJson { - if (commandJson.length > 0) { - [self fetchCommands:commandJson]; - [self executePending]; - } -} - -- (void)fetchCommands:(NSString *)command { - - if ([command length] < JSON_SIZE_FOR_MAIN_THREAD) { - _commandDictionary = [command bridge_JSONObject]; - } else { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() { - self->_commandDictionary = [command bridge_JSONObject]; - [self performSelectorOnMainThread:@selector(executePending) withObject:nil waitUntilDone:NO]; - }); - } -} - -- (void)executePending { - if (_commandDictionary.allKeys.count > 0) { - WKMsgCommand *msgCommand = [WKMsgCommand commandFromJson:_commandDictionary]; - [_bridge pluginSecurityVerityWithCommand:msgCommand completionHandler:^(BOOL passed) { - if (!passed) { - NSLog(@"WKJavaScriptBridge Error : 模块: (%@) 方法:(%@) 权限验证未通过,如需使用请申请配置。",msgCommand.className, msgCommand.methodName); - return ; - } -#ifdef DEBUG - NSLog(@"PHJavaScriptBridge(%@): Calling %@.%@", msgCommand.callbackId, msgCommand.className, msgCommand.methodName); -#endif - if (![self execute:msgCommand]) { -#ifdef DEBUG - NSString *commandJson = [NSString stringWithFormat:@"%@",self->_commandDictionary]; - static NSUInteger maxLogLength = 1024; - NSString *commandString = ([commandJson length] > maxLogLength) ? - [NSString stringWithFormat : @"%@[...]", [commandJson substringToIndex:maxLogLength]] : - commandJson; - - NSLog(@"PHJavaScriptBridge Error : FAILED pluginJSON = %@", commandString); -#endif - } - }]; - } -} - -- (BOOL)execute:(WKMsgCommand *)command { - if (command.className == nil || command.methodName == nil) { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 调用的类名或方法名不存在。"); -#endif - return NO; - } - - BOOL retVal = YES; - double started = [[NSDate date] timeIntervalSince1970] * 1000.0; - - WKBasePlugin *instance = [_bridge getCommandInstance:command.className]; - - if (!([instance isKindOfClass:[WKBasePlugin class]])) { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 模块 '%@' 异常, 检查此模块是否继承于(WKBasePlugin)", command.className); -#endif - return NO; - } - - NSString* methodName = [NSString stringWithFormat:@"%@:", command.methodName]; - SEL normalSelector = NSSelectorFromString(methodName); - if ([instance respondsToSelector:normalSelector]) { - ((void (*)(id, SEL, id))objc_msgSend)(instance, normalSelector, command); - } else { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 函数 '%@' 在类 '%@' 中没有找到。", methodName, command.className); -#endif - retVal = NO; - } - double elapsed = [[NSDate date] timeIntervalSince1970] * 1000.0 - started; - if (elapsed > 10) { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge THREAD WARNING: ['%@'] 占用了 '%f' ms。请使用(runInBackground:)将此插件放到后台执行。", command.className, elapsed); -#endif - } - return retVal; -} - -- (void)dealloc { - _bridge = nil; -} -@end diff --git a/WKJavaScriptBridge/Dispatcher/WKMsgCommand.h b/WKJavaScriptBridge/Dispatcher/WKMsgCommand.h deleted file mode 100755 index e536855..0000000 --- a/WKJavaScriptBridge/Dispatcher/WKMsgCommand.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// WKMsgCommand.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import -#import "WKJavaScriptBridgePluginAnnotation.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface WKMsgCommand : NSObject -@property (nonatomic, readonly) NSDictionary *arguments; -@property (nonatomic, readonly) NSString *callbackId; -@property (nonatomic, readonly) NSString *className; -@property (nonatomic, readonly) NSString *methodName; -+ (WKMsgCommand *)commandFromJson:(NSDictionary *)jsonEntry; -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Dispatcher/WKMsgCommand.m b/WKJavaScriptBridge/Dispatcher/WKMsgCommand.m deleted file mode 100755 index 5be98f1..0000000 --- a/WKJavaScriptBridge/Dispatcher/WKMsgCommand.m +++ /dev/null @@ -1,57 +0,0 @@ -// -// WKMsgCommand.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "WKMsgCommand.h" - -static const NSString const * kMessageCallbackId = @"callbackId"; -static const NSString const * kMessageService = @"service"; -static const NSString const * kMessageAction = @"action"; -static const NSString const * kMessageActionArgs = @"actionArgs"; - -@interface WKMsgCommand () -@property (nonatomic, readwrite) NSDictionary* arguments; -@property (nonatomic, readwrite) NSString* callbackId; -@property (nonatomic, readwrite) NSString* className; -@property (nonatomic, readwrite) NSString* methodName; -@end - -@implementation WKMsgCommand - -+ (WKMsgCommand *)commandFromJson:(NSDictionary *)jsonEntry { - return [[WKMsgCommand alloc] initFromJson:jsonEntry]; -} - -- (id)initFromJson:(NSDictionary *)jsonEntry { - - id tmp = [jsonEntry objectForKey:kMessageCallbackId]; - NSString *callbackId = tmp == [NSNull null] ? nil : tmp; - NSString *className = [jsonEntry objectForKey:kMessageService]; - NSString *methodName = [jsonEntry objectForKey:kMessageAction]; - NSDictionary *arguments = [jsonEntry objectForKey:kMessageActionArgs]; - - return [self initWithArguments:arguments - callbackId:callbackId - className:className - methodName:methodName]; -} - -- (id)initWithArguments:(NSDictionary *)arguments - callbackId:(NSString *)callbackId - className:(NSString *)className - methodName:(NSString *)methodName { - self = [super init]; - if (self != nil) { - _arguments = arguments; - _callbackId = callbackId; - _className = className; - _methodName = methodName; - } - return self; -} - -@end diff --git a/WKJavaScriptBridge/Plugin/WKBasePlugin.h b/WKJavaScriptBridge/Plugin/WKBasePlugin.h deleted file mode 100644 index 99d798f..0000000 --- a/WKJavaScriptBridge/Plugin/WKBasePlugin.h +++ /dev/null @@ -1,47 +0,0 @@ -// -// WKBasePlugin.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import -#import -#import "WKCommandProtocol.h" -#import "WKPluginProtocol.h" -#import "WKMsgCommand.h" -#import "WKJavaScriptBridgePluginAnnotation.h" -#import "WKPluginSecurityProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -@class WKJavaScriptBridge; - -@interface WKBasePlugin : NSObject - -@property (nonatomic, weak) id commandDelegate; - -/** - 插件实例化调用 - */ -- (void)pluginInitialize; - -/** - APP 应用终止调用 - */ -- (void)onAppTerminate; - -/** - APP 内存警告调用 - */ -- (void)onMemoryWarning; - -/** - 插件销毁,bridge生命周期结束调用 - */ -- (void)dispose; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Plugin/WKBasePlugin.m b/WKJavaScriptBridge/Plugin/WKBasePlugin.m deleted file mode 100644 index f5c59d4..0000000 --- a/WKJavaScriptBridge/Plugin/WKBasePlugin.m +++ /dev/null @@ -1,51 +0,0 @@ -// -// WKBasePlugin.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "WKBasePlugin.h" - -@implementation WKBasePlugin - -#pragma mark - Override - -- (instancetype)init { - if (self = [super init]) { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onAppTerminate) name:UIApplicationWillTerminateNotification object:nil]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; - } - return self; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - -#pragma mark - Public - -- (void)pluginInitialize { - -} - -- (void)onAppTerminate { - -} - -- (void)onMemoryWarning { - -} - -- (void)dispose { - -} - -#pragma mark - WKPluginProtocol - -+ (BOOL)shouldCache { - return YES; -} - -@end diff --git a/WKJavaScriptBridge/Plugin/WKCommandImpl.h b/WKJavaScriptBridge/Plugin/WKCommandImpl.h deleted file mode 100644 index 2321314..0000000 --- a/WKJavaScriptBridge/Plugin/WKCommandImpl.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// WKCommandImpl.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import -#import "WKCommandProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -@class WKJavaScriptBridge; - -@interface WKCommandImpl : NSObject -- (instancetype)initWithBridge:(WKJavaScriptBridge *)bridge; -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Plugin/WKCommandImpl.m b/WKJavaScriptBridge/Plugin/WKCommandImpl.m deleted file mode 100644 index 80248ae..0000000 --- a/WKJavaScriptBridge/Plugin/WKCommandImpl.m +++ /dev/null @@ -1,103 +0,0 @@ -// -// WKCommandImpl.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "WKCommandImpl.h" -#import "WKJavaScriptBridge.h" -#import "WKPluginResult.h" - -@implementation WKCommandImpl { - __weak WKJavaScriptBridge *_bridge; - NSRegularExpression* _callbackIdPattern; -} - -- (instancetype)initWithBridge:(WKJavaScriptBridge *)bridge { - if (self = [super init]) { - _bridge = bridge; - NSError* err = nil; - - _callbackIdPattern = [NSRegularExpression regularExpressionWithPattern:@"[^A-Za-z0-9._-]" options:0 error:&err]; - if (err != nil) { - // Couldn't initialize Regex -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : Couldn't initialize regex"); -#endif - _callbackIdPattern = nil; - } - } - return self; -} - -- (void)evalJs:(NSString *)js { - [_bridge evaluateJavaScript:js completionHandler:^(id obj, NSError * error) { - if (error) { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 调用JS函数报错 : %@",error.localizedDescription); -#endif - } - }]; -} - -- (id)getCommandInstance:(NSString*)pluginName { - return [_bridge getCommandInstance:pluginName]; -} - -- (BOOL)isValidCallbackId:(NSString*)callbackId { - if ((callbackId == nil) || (_callbackIdPattern == nil)) { - return NO; - } - - // 如果太长或发现任何无效字符,则禁用 - if (([callbackId length] > 100) || [_callbackIdPattern firstMatchInString:callbackId options:0 range:NSMakeRange(0, [callbackId length])]) { - return NO; - } - return YES; -} - -#pragma mark - WKCommandProtocol - -- (void)sendPluginResult:(WKPluginResult *)result callbackId:(NSString*)callbackId { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge (%@): Sending result. Status=%@", callbackId, result.status); -#endif - // 当本次交互JS侧没有回调时 - if ([@"INVALID" isEqualToString:callbackId]) { - return; - } - // 回调id格式不正确 - if (![self isValidCallbackId:callbackId]) { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 通信ID格式不正确,去除无效字符,或检查ID是否过长,限制不得超过100字符。"); -#endif - return; - } - - NSMutableDictionary *messageDict = [NSMutableDictionary dictionary]; - messageDict[@"status"] = result.status; - messageDict[@"callbackId"] = callbackId; - messageDict[@"data"] = result.message; - - NSString* argumentsAsJSON = [WKPluginResult jsSerializeWithJson:messageDict]; - NSString* js = [NSString stringWithFormat:@"window.WKJSBridge._handleMessageFromNative('%@')", argumentsAsJSON]; - - if (![NSThread isMainThread]) { - //不使用GCD是防止js页面死锁产生卡死 - [self performSelectorOnMainThread:@selector(evalJs:) withObject:js waitUntilDone:NO]; - } else { - [self evalJs:js]; - } -} - -- (void)runInBackground:(void (^)(void))block { - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block); -} - -- (WKWebView *)webView { - return _bridge.webView; -} - -@end diff --git a/WKJavaScriptBridge/Plugin/WKCommandProtocol.h b/WKJavaScriptBridge/Plugin/WKCommandProtocol.h deleted file mode 100644 index 131919b..0000000 --- a/WKJavaScriptBridge/Plugin/WKCommandProtocol.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// WKCommandProtocol.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import -#import -#import "WKPluginResult.h" - -NS_ASSUME_NONNULL_BEGIN - -@protocol WKCommandProtocol - -/** - 原生模块回调js - - @param result simulate data - @param callbackId callbackId - */ -- (void)sendPluginResult:(WKPluginResult *)result callbackId:(NSString*)callbackId; - -/** - 原生模块执行耗时操作 - - @param block long running - */ -- (void)runInBackground:(void (^)(void))block; - -/** - 和Bridge绑定的webView - - @return WKWebView - */ -- (WKWebView *)webView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Plugin/WKPluginProtocol.h b/WKJavaScriptBridge/Plugin/WKPluginProtocol.h deleted file mode 100644 index 41396d9..0000000 --- a/WKJavaScriptBridge/Plugin/WKPluginProtocol.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// WKPluginProtocol.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@protocol WKPluginProtocol - -@optional - -/** - 设置插件为多例 - - @return 默认YES - */ -+ (BOOL)singleton; - -/** - 设置插件为单例 - - @return 默认NO - */ -+ (id)shareInstance; - -/** - 设置插件缓存 - - @return 默认YES,为YES时生命周期跟随Bridge - */ -+ (BOOL)shouldCache; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Plugin/WKPluginResult.h b/WKJavaScriptBridge/Plugin/WKPluginResult.h deleted file mode 100644 index ed980c8..0000000 --- a/WKJavaScriptBridge/Plugin/WKPluginResult.h +++ /dev/null @@ -1,32 +0,0 @@ -// -// WKPluginResult.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -typedef NS_ENUM(NSInteger, WKJavaScriptBridgeCommandStatus) { - WKJavaScriptBridgeCommandStatus_NO_RESULT = 0, - WKJavaScriptBridgeCommandStatus_ERROR = 1, - WKJavaScriptBridgeCommandStatus_OK = 2 -}; - -@interface WKPluginResult : NSObject - -@property (nonatomic, strong, readonly) NSNumber* status; -@property (nonatomic, strong, readonly) id message; - -+ (WKPluginResult*)resultWithStatus:(WKJavaScriptBridgeCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary*)theMessage; - -+ (WKPluginResult *)resultWithStatus:(WKJavaScriptBridgeCommandStatus)statusOrdinal messageAsString:(NSString *)theMessage; - -+ (NSString *)jsSerializeWithJson:(NSDictionary * _Nullable)json; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Plugin/WKPluginResult.m b/WKJavaScriptBridge/Plugin/WKPluginResult.m deleted file mode 100644 index 3499aec..0000000 --- a/WKJavaScriptBridge/Plugin/WKPluginResult.m +++ /dev/null @@ -1,64 +0,0 @@ -// -// WKPluginResult.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "WKPluginResult.h" - -@interface WKPluginResult () - -@property (nonatomic, strong, readwrite) NSNumber* status; -@property (nonatomic, strong, readwrite) id message; - -@end - -@implementation WKPluginResult - -+ (WKPluginResult *)resultWithStatus:(WKJavaScriptBridgeCommandStatus)statusOrdinal messageAsDictionary:(NSDictionary *)theMessage { - return [[self alloc] initWithStatus:statusOrdinal message:theMessage]; -} - -+ (WKPluginResult *)resultWithStatus:(WKJavaScriptBridgeCommandStatus)statusOrdinal messageAsString:(NSString *)theMessage { - return [[self alloc] initWithStatus:statusOrdinal message:theMessage]; -} - -- (WKPluginResult*)initWithStatus:(WKJavaScriptBridgeCommandStatus)statusOrdinal message:(id)theMessage { - self = [super init]; - if (self) { - self.status = [NSNumber numberWithInt:statusOrdinal]; - self.message = theMessage; - } - return self; -} - -+ (NSString *)jsSerializeWithJson:(NSDictionary * _Nullable)json { - NSString *messageJSON = [self serializeWithJson:json ? json : @{} pretty:NO]; - messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]; - messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\"" withString:@"\\\""]; - messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\'" withString:@"\\\'"]; - messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\n" withString:@"\\n"]; - messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\r" withString:@"\\r"]; - messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\f" withString:@"\\f"]; - messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\u2028" withString:@"\\u2028"]; - messageJSON = [messageJSON stringByReplacingOccurrencesOfString:@"\u2029" withString:@"\\u2029"]; - - return messageJSON; -} - -+ (NSString *)serializeWithJson:(NSDictionary * _Nullable)json pretty:(BOOL)pretty { - NSError *error = nil; - NSString *str = [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:json ? json : @{} options:(NSJSONWritingOptions)(pretty ? NSJSONWritingPrettyPrinted : 0) error:&error] encoding:NSUTF8StringEncoding]; -#ifdef DEBUG - if (error) { - NSLog(@"WKJSBridge Error: format json error %@", error.localizedDescription); - } -#endif - - return str ? str : @""; -} - -@end - diff --git a/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h b/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h deleted file mode 100644 index f5c06ac..0000000 --- a/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.h +++ /dev/null @@ -1,42 +0,0 @@ -// -// WKJavaScriptBridgePluginAnnotation.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import - -//@class WKJavaScriptBridge; -// -//#define WKWebPlugins "WKWebPlugins" -// -//#define WKWebPluginDATA(sectname) __attribute((used, section("__DATA,"#sectname" "))) -//#define WKRegisterWhiteList(name) \ -//class WKJavaScriptBridge; char * k##name##_mod WKWebPluginDATA(WKWebPlugins) = ""#name""; - - - -@class WKJavaScriptBridge; - -#define SecurityConfig "SecurityConfig" - -#define SecurityPlugin "SecurityPlugin" - -#define WKWebPluginDATA(sectname) __attribute((used, section("__DATA,"#sectname" "))) - -#define WKConfigPluginSafeLevel(service,action,level) \ -class WKJavaScriptBridge;char * k##service##_##action##_plu WKWebPluginDATA(SecurityConfig) = "[\""#service"\",\""#action"\",\""#level"\"]"; - -#define WKConfigSafePlugin(name) \ -class PHJavaScriptBridge;char * k##name##_plu WKWebPluginDATA(SecurityPlugin) = ""#name""; - -NS_ASSUME_NONNULL_BEGIN - -@interface WKJavaScriptBridgePluginAnnotation : NSObject -- (instancetype)initWithBridge:(WKJavaScriptBridge *)bridge; -- (void)getAllRegisterPluginName; -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m b/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m deleted file mode 100644 index 17736f7..0000000 --- a/WKJavaScriptBridge/Security/WKJavaScriptBridgePluginAnnotation.m +++ /dev/null @@ -1,98 +0,0 @@ -// -// WKJavaScriptBridgePluginAnnotation.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "WKJavaScriptBridgePluginAnnotation.h" -#import "WKJavaScriptBridge.h" -#include -#include -#include -#include -#import -#import -#include - -@interface WKJavaScriptBridgePluginAnnotation () - -@property (nonatomic, weak) WKJavaScriptBridge *bridge; - -@end - -@implementation WKJavaScriptBridgePluginAnnotation - -- (instancetype)initWithBridge:(WKJavaScriptBridge *)bridge { - if (self = [super init]) { - self.bridge = bridge; - } - return self; -} - -- (void)getAllRegisterPluginName { - [self registedAnnotationModules]; -} - -- (void)registedAnnotationModules { - NSArray *whiteListPlugin = [WKJavaScriptBridgePluginAnnotation AnnotationWhiteListPlugin]; - if (whiteListPlugin.count > 0) { - NSString *plugin = whiteListPlugin[0]; - if (plugin.length) { - [self.bridge registerSecurityPlugin:plugin]; - } - } - - NSArray *securityInfo = [WKJavaScriptBridgePluginAnnotation AnnotationPlugins]; - [self.bridge registerPluginSecurityInfomation:securityInfo]; -} - -+ (NSArray *)AnnotationPlugins { - static NSArray *securityInfo = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - securityInfo = BHReadConfiguration(SecurityConfig); - }); - return securityInfo; -} - -+ (NSArray *)AnnotationWhiteListPlugin { - static NSArray *plugin = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - plugin = BHReadConfiguration(SecurityPlugin); - }); - return plugin; -} - -static NSArray* BHReadConfiguration(char *section) { - NSMutableArray *configs = [NSMutableArray array]; - - Dl_info info; - dladdr(BHReadConfiguration, &info); - -#ifndef __LP64__ - const struct mach_header *mhp = (struct mach_header*)info.dli_fbase; - unsigned long size = 0; - uint32_t *memory = (uint32_t*)getsectiondata(mhp, "__DATA", section, & size); -#else /* defined(__LP64__) */ - const struct mach_header_64 *mhp = (struct mach_header_64*)info.dli_fbase; - unsigned long size = 0; - uint64_t *memory = (uint64_t*)getsectiondata(mhp, "__DATA", section, & size); -#endif /* defined(__LP64__) */ - for(int idx = 0; idx < size/sizeof(void*); ++idx){ - char *string = (char*)memory[idx]; - - NSString *str = [NSString stringWithUTF8String:string]; - if(!str)continue; -#ifdef DEBUG - NSLog(@"config = %@", str); -#endif - if(str) [configs addObject:str]; - } - - return configs; -} - -@end diff --git a/WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h b/WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h deleted file mode 100644 index 299cc0b..0000000 --- a/WKJavaScriptBridge/Security/WKPluginSecurityProtocol.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// WKPluginSecurityProtocol.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2020/6/2. -// Copyright © 2020 王凯. All rights reserved. -// - -#import - -typedef void(^PHJudgeAuthorityComplete)(BOOL allowed); - -NS_ASSUME_NONNULL_BEGIN - -@protocol WKPluginSecurityProtocol - -@required - -/** - 插件是否符合使用权限 - - @param serviceName 类名 - @param actionName 方法名 - @param completionHandler 校验结果,异步返回 - */ -- (void)applyAuthorityWithService:(NSString *)serviceName action:(NSString *)actionName securityInfomation:(NSArray*)secInfo complete:(PHJudgeAuthorityComplete)completionHandler; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.h b/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.h deleted file mode 100644 index 70a103e..0000000 --- a/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// NSString+BridgeJSONPrivate.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface NSString (BridgeJSONPrivate) -- (id)bridge_JSONObject; -- (id)bridge_JSONFragment; -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.m b/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.m deleted file mode 100644 index 62639b5..0000000 --- a/WKJavaScriptBridge/Util/NSString+BridgeJSONPrivate.m +++ /dev/null @@ -1,41 +0,0 @@ -// -// NSString+BridgeJSONPrivate.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "NSString+BridgeJSONPrivate.h" - -@implementation NSString (BridgeJSONPrivate) - -- (id)bridge_JSONObject { - @autoreleasepool { - NSError* error = nil; - id object = [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding] - options:NSJSONReadingMutableContainers - error:&error]; - - if (error != nil) { - NSLog(@"NSString JSONObject error: %@, Malformed Data: %@", [error localizedDescription], self); - } - return object; - } -} - -- (id)bridge_JSONFragment { - @autoreleasepool { - NSError* error = nil; - id object = [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding] - options:NSJSONReadingAllowFragments - error:&error]; - - if (error != nil) { - NSLog(@"NSString JSONObject error: %@", [error localizedDescription]); - } - return object; - } -} - -@end diff --git a/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.h b/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.h deleted file mode 100644 index 0886f02..0000000 --- a/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.h +++ /dev/null @@ -1,22 +0,0 @@ -// -// WKWeakScriptMessageHandlerDelegate.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface WKWeakScriptMessageHandlerDelegate : NSObject - -@property (nonatomic, weak, readonly) id scriptDelegate; - -- (instancetype)initWithDelegate:(id)scriptDelegate; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.m b/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.m deleted file mode 100644 index f121a05..0000000 --- a/WKJavaScriptBridge/Util/WKWeakScriptMessageHandlerDelegate.m +++ /dev/null @@ -1,31 +0,0 @@ -// -// WKWeakScriptMessageHandlerDelegate.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "WKWeakScriptMessageHandlerDelegate.h" - -@interface WKWeakScriptMessageHandlerDelegate () - -@property (nonatomic, weak, readwrite) id scriptDelegate; - -@end - -@implementation WKWeakScriptMessageHandlerDelegate - -- (instancetype)initWithDelegate:(id)scriptDelegate { - self = [super init]; - if (self) { - _scriptDelegate = scriptDelegate; - } - return self; -} - -- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { - [self.scriptDelegate userContentController:userContentController didReceiveScriptMessage:message]; -} - -@end diff --git a/WKJavaScriptBridge/WKJSBridge.js b/WKJavaScriptBridge/WKJSBridge.js deleted file mode 100755 index e250353..0000000 --- a/WKJavaScriptBridge/WKJSBridge.js +++ /dev/null @@ -1,57 +0,0 @@ -; -(function (window) { - ; - var WKJSBridge = /** @class */ (function () { - function WKJSBridge() { - this.uniqueId = 1; - this.callbackCache = {}; - this.eventCallbackCache = {}; - } - /** - * 调用 Natvie 方法 - * @param service 模块 - * @param action 方法 - * @param actionArgs 数据 - * @param callback 调用回调 - */ - WKJSBridge.prototype.callNative = function (service, action, actionArgs, successCallback, failCallback) { - var message = { - service: service || 'default', - action: action, - actionArgs: actionArgs, - callbackId: null - }; - if (successCallback || failCallback) { - // 拼装 callbackId - var callbackId = 'cb_' + message.service + '_' + action + '_' + (this.uniqueId++) + '_' + new Date().getTime(); // 缓存 callback,用于在 Native 处理完消息后,通知 H5 - this.callbackCache[callbackId] = {success:successCallback, fail:failCallback};; - // 追加 callbackId 属性 - message.callbackId = callbackId; - } - // 发送消息给 Native - window.webkit.messageHandlers.WKJSBridgeMessageName.postMessage(JSON.stringify(message)); - }; - /** - * 用于处理来自 Native 的消息 - * @param callbackMessage 回调消息 - */ - WKJSBridge.prototype._handleMessageFromNative = function (messageString) { - var callbackMessage = JSON.parse(messageString); - var status = callbackMessage.status; - var callback = this.callbackCache[callbackMessage.callbackId]; - if (callback) { // 执行 callback 回调,并删除缓存的 callback - if (status == 1) {//失败回调 - callback.fail(callbackMessage.data); - }else {//成功回调 - callback.success(callbackMessage.data); - } - this.callbackCache[callbackMessage.callbackId] = null; - delete this.callbackCache[callbackMessage.callbackId]; - } - - }; - return WKJSBridge; - }()); - // 初始化 KKJSBridge - window.WKJSBridge = new WKJSBridge(); // 设置新的 JSBridge 作为全局对象 -})(window); diff --git a/WKJavaScriptBridge/WKJavaScriptBridge.h b/WKJavaScriptBridge/WKJavaScriptBridge.h deleted file mode 100644 index d6d6738..0000000 --- a/WKJavaScriptBridge/WKJavaScriptBridge.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// WKJavaScriptBridge.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import -#import -#import "WKJavaScriptBridgeProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface WKJavaScriptBridge : NSObject - -/** 外部提供的webView,只读 */ -@property (nonatomic, readonly, weak) WKWebView *webView; - -/** - 初始化绑定方法 - - @param webView webView - @return bridge - */ -+ (instancetype)bindBridgeWithWebView:(WKWebView *)webView; - -@end - -NS_ASSUME_NONNULL_END diff --git a/WKJavaScriptBridge/WKJavaScriptBridge.m b/WKJavaScriptBridge/WKJavaScriptBridge.m deleted file mode 100644 index f8ad62e..0000000 --- a/WKJavaScriptBridge/WKJavaScriptBridge.m +++ /dev/null @@ -1,230 +0,0 @@ -// -// WKJavaScriptBridge.m -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import "WKJavaScriptBridge.h" -#import "WKCommandImpl.h" -#import "WKWeakScriptMessageHandlerDelegate.h" -#import "WKJavaScriptMessageDispatcher.h" -#import "WKJavaScriptBridgePluginAnnotation.h" -#import "WKBasePlugin.h" -#import "WKCommandProtocol.h" -#import "WKPluginSecurityProtocol.h" - -static NSString * const WKJSBridge = @"WKJSBridgeMessageName"; - -@interface WKJavaScriptBridge () - -@property (nonatomic, strong) WKJavaScriptBridgePluginAnnotation *annotation;//模块注册白名单 -@property (nonatomic, strong) WKJavaScriptMessageDispatcher *dispatcher;//插件模块派发 -@property (nonatomic, strong) WKCommandImpl *commandDelegate;//插件模块可执行函数实现 -@property (nonatomic, strong) NSMutableDictionary *pluginsByName;//插件模块实例对象 -@property (nonatomic, weak, readwrite) WKWebView *webView; -//安全相关 -@property (nonatomic, strong) id securityPlugin;//白名单插件 -@property (nonatomic, strong) NSArray *secInfo;//业务注册的安全信息 - -@end - -@implementation WKJavaScriptBridge - -- (void)dealloc { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge dealloc"); -#endif - WKWebView *webView = (WKWebView *)self.webView; - [webView.configuration.userContentController removeScriptMessageHandlerForName:WKJSBridge]; - [[self.pluginsByName allValues] makeObjectsPerformSelector:@selector(dispose)]; - [self.pluginsByName removeAllObjects]; -} - -#pragma mark - Public - -+ (instancetype)bindBridgeWithWebView:(WKWebView *)webView { - if ([webView isKindOfClass:[WKWebView class]]) { - WKJavaScriptBridge *bridge = [[self alloc] initBridgeWithWebView:webView]; - return bridge; - } - [NSException raise:@"BadWebView" format:@"Unknown web view."]; - return nil; -} - -#pragma mark - Init - -- (instancetype)initBridgeWithWebView:(WKWebView *)webView { - if (self = [super init]) { - self.webView = webView; - [self commonInit]; - [self setup]; - } - return self; -} - -- (void)commonInit { - self.secInfo = [NSArray array]; - self.dispatcher = [[WKJavaScriptMessageDispatcher alloc] initWithBridge:self]; - self.annotation = [[WKJavaScriptBridgePluginAnnotation alloc] initWithBridge:self]; - self.commandDelegate = [[WKCommandImpl alloc] initWithBridge:self]; -} - -#pragma mark - Privite - -- (void)setup { - [self setupJSBridge]; - [self setupPlugin]; -} - -- (void)setupJSBridge { - WKWebViewConfiguration *webViewConfiguration = self.webView.configuration; - if (webViewConfiguration && !webViewConfiguration.userContentController) { - self.webView.configuration.userContentController = [WKUserContentController new]; - } - // 防止内存泄露 - [self.webView.configuration.userContentController addScriptMessageHandler:[[WKWeakScriptMessageHandlerDelegate alloc] initWithDelegate:self] name:WKJSBridge]; -} - -- (void)setupPlugin { - [self.annotation getAllRegisterPluginName]; -} - -- (void)registerPlugin:(WKBasePlugin *)plugin { - if ([plugin respondsToSelector:@selector(setCommandDelegate:)]) { - [plugin setCommandDelegate:_commandDelegate]; - } -} - -- (Class)pluginImplClass:(NSString *)pluginName { - if (pluginName.length > 0) { - return NSClassFromString(pluginName); - } - return nil; -} - -- (BOOL)pluginShouldCache:(Class)implClass { - BOOL shouldCache = NO; - if ([[implClass class] respondsToSelector:@selector(shouldCache)]) { - if ([[implClass class] shouldCache]) { - shouldCache = YES; - } - } - return shouldCache; -} - -- (void)pluginInstall:(WKBasePlugin *)plugin { - [plugin pluginInitialize]; - [self registerPlugin:plugin]; -} - -#pragma mark - WKJavaScriptBridgeProtocol - -- (void)registerSecurityPlugin:(NSString *)name { - idsecurityPlugin = [self getCommandInstance:name]; - if ([securityPlugin isKindOfClass:[WKBasePlugin class]] && - [securityPlugin conformsToProtocol:@protocol(WKPluginSecurityProtocol)]) { - self.securityPlugin = securityPlugin; - } -} - -- (void)registerPluginSecurityInfomation:(NSArray*)secInfo { - self.secInfo = secInfo; -} - -- (void)pluginSecurityVerityWithCommand:(WKMsgCommand *)command completionHandler:(void (^)(BOOL passed))completionHandler { - if (self.securityPlugin && [self.securityPlugin respondsToSelector:@selector(applyAuthorityWithService:action:securityInfomation:complete:)]) { - [self.securityPlugin applyAuthorityWithService:command.className action:command.methodName securityInfomation:self.secInfo complete:^(BOOL allowed) { - completionHandler(allowed); - }]; - }else { - completionHandler(YES); - } -} - -- (id)getCommandInstance:(NSString*)pluginName { - - WKBasePlugin *plugin = nil; - Class implClass = [self pluginImplClass:pluginName]; - - BOOL shouldCache = [self pluginShouldCache:implClass]; - if (shouldCache) { - plugin = [self.pluginsByName objectForKey:pluginName]; - if (plugin) { - return plugin; - } - } - - if ([[implClass class] respondsToSelector:@selector(singleton)]) { - if ([[implClass class] singleton]) { - if ([[implClass class] respondsToSelector:@selector(shareInstance)]) - plugin = [[implClass class] shareInstance]; - else - plugin = [[implClass alloc] init]; - - if (plugin) { - [self pluginInstall:plugin]; - if (shouldCache) { - [self.pluginsByName setObject:plugin forKey:pluginName]; - } - }else { -#ifdef DEBUG - NSLog(@"PHJavaScriptBridge Error : 模块: (%@) 不存在。", pluginName); -#endif - } - return plugin; - } - } - - plugin = [[implClass alloc] init]; - if (plugin) { - [self pluginInstall:plugin]; - if (shouldCache) { - [self.pluginsByName setObject:plugin forKey:pluginName]; - } - }else { -#ifdef DEBUG - NSLog(@"PHJavaScriptBridge Error : 模块: (%@) 不存在。", pluginName); -#endif - } - return plugin; -} - -- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id , NSError *))completionHandler { - WKWebView *webView = (WKWebView *)self.webView; - [webView evaluateJavaScript:javaScriptString completionHandler:^(id obj, NSError * _Nullable error) { - if (completionHandler) { - completionHandler(obj, error); - } - }]; -} - -#pragma mark - WKScriptMessageHandler - -- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message { - if ([message.name isEqualToString:WKJSBridge]) { - if ([message.body isKindOfClass:[NSString class]]) { - [self.dispatcher handleMsgCommand:message.body]; - }else { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 通信参数不合法,请将JS侧参数转为字符串通信。"); -#endif - } - }else { -#ifdef DEBUG - NSLog(@"WKJavaScriptBridge Error : 本次调用所使用的JS函数非(WKJavaScriptBridge)注入。请使用(%@)",WKJSBridge); -#endif - } -} - -#pragma mark - Set or Get - -- (NSMutableDictionary *)pluginsByName { - if (!_pluginsByName) { - _pluginsByName = [[NSMutableDictionary alloc] initWithCapacity:1]; - } - return _pluginsByName; -} - -@end diff --git a/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h b/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h deleted file mode 100644 index 1cf2b57..0000000 --- a/WKJavaScriptBridge/WKJavaScriptBridgeProtocol.h +++ /dev/null @@ -1,57 +0,0 @@ -// -// WKJavaScriptBridgeProtocol.h -// WKJavaScriptBridge-demo -// -// Created by Kevin on 2019/10/22. -// Copyright © 2019 王凯. All rights reserved. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class WKMsgCommand; - -@protocol WKJavaScriptBridgeProtocol - -/** - 注册权限管理插件 - - @param name class name - */ -- (void)registerSecurityPlugin:(NSString *)name; - -/** - 注册插件安全配置信息 - - @param secInfo 配置信息 - */ -- (void)registerPluginSecurityInfomation:(NSArray*)secInfo; - -/** - 插件安全校验 - - @param command 插件信息 - @param completionHandler 结果回调 - */ -- (void)pluginSecurityVerityWithCommand:(WKMsgCommand *)command completionHandler:(void (^)(BOOL passed))completionHandler; - -/** - 获取模块实例 - - @param pluginName 模块名称 - @return 模块实例 - */ -- (id)getCommandInstance:(NSString*)pluginName; - -/** - 执行JavaScript - - @param javaScriptString JS函数 - @param completionHandler 结果回调 - */ -- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler; - -@end - -NS_ASSUME_NONNULL_END diff --git a/_Pods.xcodeproj b/_Pods.xcodeproj new file mode 120000 index 0000000..3c5a8e7 --- /dev/null +++ b/_Pods.xcodeproj @@ -0,0 +1 @@ +Example/Pods/Pods.xcodeproj \ No newline at end of file From 54972b09d7ef602d77e6c3be23253ff81a189461 Mon Sep 17 00:00:00 2001 From: GitWangKai <18500052382@163.com> Date: Mon, 14 Sep 2020 09:48:01 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WKJavaScriptBridge.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WKJavaScriptBridge.podspec b/WKJavaScriptBridge.podspec index 0317bea..5c4d38b 100644 --- a/WKJavaScriptBridge.podspec +++ b/WKJavaScriptBridge.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |spec| spec.name = "WKJavaScriptBridge" - spec.version = "1.1.0" + spec.version = "1.1.1" spec.summary = "基于WKWebView构建的JSBridge,支持iOS8+。" spec.homepage = "https://github.com/GitWangKai/WKJavaScriptBridge" spec.license = { :type => "Apache License 2.0", :file => "LICENSE" }