设置 windowScriptObject 时从不调用 isSelectorExcludedFromWebScript
isSelectorExcludedFromWebScript is never called when setting windowScriptObject
我尝试按照 Apple 文章 Calling Objective-C Methods From JavaScript 来让 WebView 中的 JS 访问一些 objective-c 函数。
最终得到一个如下所示的中间层对象:
// FILE: RTFInterop.h
#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>
@protocol RTFInteropDelegate <NSObject>
@end
@interface RTFInterop : NSObject
- (id)initWithWebView:(WebView*)webView andDelegate:(id<RTFInteropDelegate>)delegate;
- (void)onHeightUpdated:(int)height;
- (void)onAnswerBlocksUpdated:(NSString*)answerBlockJSON;
+ (NSString *)webScriptNameForSelector:(SEL)sel;
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;
+ (BOOL)isKeyExcludedFromWebScript:(const char *)name;
@end
// FILE: RTFInterop.m
#import "RTFInterop.h"
@implementation RTFInterop {
WebView *webView;
id<RTFInteropDelegate> delegate;
}
- (id)initWithWebView:(WebView*)aWebView andDelegate:(id<RTFInteropDelegate>)aDelegate {
self = [self init];
if (self) {
webView = aWebView;
delegate = aDelegate;
[webView.windowScriptObject setValue:self forKey:@"RTFInterop"];
}
return self;
}
+ (NSString *)webScriptNameForSelector:(SEL)sel {
NSString *name;
if (sel == @selector(onHeightUpdated:)) {
name = @"onHeightUpdated";
} else if (sel == @selector(onHeightUpdated:)) {
name = @"onAnswerBlocksUpdated";
}
return name;
}
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {
if (sel == @selector(onHeightUpdated:)) {
return NO;
} else if (sel == @selector(onHeightUpdated:)) {
return NO;
}
return YES;
}
+ (BOOL)isKeyExcludedFromWebScript:(const char *)name {
return YES;
}
// Called from JS
- (void)onHeightUpdated:(int)height {
}
// Called from JS
- (void)onAnswerBlocksUpdated:(NSString*)answerBlockJSON {
}
@end
示例用法如下:
self.webView = [[WebView alloc] init];
self.interop = [[DXRichTextInterop alloc] initWithWebView:self.webView andDelegate:nil];
NSURL *url = [NSURL URLWithString:@"file:///Users/example/dev/testembedd.html"];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[self.webView.mainFrame loadRequest:urlRequest];
[self.webView setFrame:CGRectMake(0, 0, 100, 100)];
webView 显示正确,但问题是它似乎没有注入 JavaScript,isSelectorExcludedFromWebScript:
中的断点从未命中。
问题:嵌入JS时是否有一些要求没有包含在我错过的文章中?比如在WebView生命周期的时候可以注入JS。或者只是其他错误?
弄明白了,当 JS 试图调用注入函数或访问注入键时,webScriptNameForSelector
、isSelectorExcludedFromWebScript
和 isKeyExcludedFromWebScript
被调用。
我尝试按照 Apple 文章 Calling Objective-C Methods From JavaScript 来让 WebView 中的 JS 访问一些 objective-c 函数。
最终得到一个如下所示的中间层对象:
// FILE: RTFInterop.h
#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>
@protocol RTFInteropDelegate <NSObject>
@end
@interface RTFInterop : NSObject
- (id)initWithWebView:(WebView*)webView andDelegate:(id<RTFInteropDelegate>)delegate;
- (void)onHeightUpdated:(int)height;
- (void)onAnswerBlocksUpdated:(NSString*)answerBlockJSON;
+ (NSString *)webScriptNameForSelector:(SEL)sel;
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector;
+ (BOOL)isKeyExcludedFromWebScript:(const char *)name;
@end
// FILE: RTFInterop.m
#import "RTFInterop.h"
@implementation RTFInterop {
WebView *webView;
id<RTFInteropDelegate> delegate;
}
- (id)initWithWebView:(WebView*)aWebView andDelegate:(id<RTFInteropDelegate>)aDelegate {
self = [self init];
if (self) {
webView = aWebView;
delegate = aDelegate;
[webView.windowScriptObject setValue:self forKey:@"RTFInterop"];
}
return self;
}
+ (NSString *)webScriptNameForSelector:(SEL)sel {
NSString *name;
if (sel == @selector(onHeightUpdated:)) {
name = @"onHeightUpdated";
} else if (sel == @selector(onHeightUpdated:)) {
name = @"onAnswerBlocksUpdated";
}
return name;
}
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel {
if (sel == @selector(onHeightUpdated:)) {
return NO;
} else if (sel == @selector(onHeightUpdated:)) {
return NO;
}
return YES;
}
+ (BOOL)isKeyExcludedFromWebScript:(const char *)name {
return YES;
}
// Called from JS
- (void)onHeightUpdated:(int)height {
}
// Called from JS
- (void)onAnswerBlocksUpdated:(NSString*)answerBlockJSON {
}
@end
示例用法如下:
self.webView = [[WebView alloc] init];
self.interop = [[DXRichTextInterop alloc] initWithWebView:self.webView andDelegate:nil];
NSURL *url = [NSURL URLWithString:@"file:///Users/example/dev/testembedd.html"];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
[self.webView.mainFrame loadRequest:urlRequest];
[self.webView setFrame:CGRectMake(0, 0, 100, 100)];
webView 显示正确,但问题是它似乎没有注入 JavaScript,isSelectorExcludedFromWebScript:
中的断点从未命中。
问题:嵌入JS时是否有一些要求没有包含在我错过的文章中?比如在WebView生命周期的时候可以注入JS。或者只是其他错误?
弄明白了,当 JS 试图调用注入函数或访问注入键时,webScriptNameForSelector
、isSelectorExcludedFromWebScript
和 isKeyExcludedFromWebScript
被调用。