WKWebView を使用するアプリを作成しており、ページ上の任意の HTML 要素の URL を取得できる必要があります。たとえば、ユーザーが Google 画像にアクセスして画像を長押しすると、その画像への完全な URL を見つけることができる必要があります。
誰もこれを行う方法を知っていますか?
ありがとう!
この動作は、次の 4 つの手順で実現できます。
1) インスタンスに追加UILongPressGestureRecognizer
し、レコグナイザーが独自のジェスチャ レコグナイザーWKWebView
と同時に認識できるようにすることを忘れないでください。WKWebView
SEL selector = @selector(handleLongPressGestureRecognizer:);
UILongPressGestureRecognizer* gestuRecognizer =
[[UILongPressGestureRecognizer alloc] initWithTarget:self
action:selector];
gestuRecognizer.delegate = self;
[webView addGestureRecognizer:gestuRecognizer];
<...>
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer*)otherGestureRecognizer {
return YES;
}
2) JavaScript ファイル (tools.js) を大まかに次のように作成します。
function imageSourceFromPoint(x, y) {
var element = document.elementFromPoint(x, y);
if (element.tagName == 'IMG' && element.src) {
return element.src;
}
return null;
}
3) その tools.js を Web ページにロードします。handleLongPressGestureRecognizer
これは、たとえば次のようにメソッドで直接行うことができます。
- (void)handleLongPressGestureRecognizer:
(UILongPressGestureRecognizer*)recognizer {
if (recognizer.state == UIGestureRecognizerStateBegan) {
[self loadJavaScriptFileIfNeededWithCompletion:^{
<...>
}];
}
}
- (void)loadJavaScriptFileIfNeededWithCompletion:(void(^)())completion {
<...>
[self.webView evaluateJavaScript:[self toolsJavaScriptFile]
completionHandler:^(id result, NSError* error) {
completion();
}];
<...>
}
- (NSString*)toolsJavaScriptFile {
NSString* path = [[NSBundle mainBundle] pathForResource:@"tools"
ofType:@"js"];
return [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding
error:nil];
}
4)imageSourceFromPoint
長押しジェスチャの場所を指定して、Objective-C (または Swift) から JavaScript 関数を実行します。
- (void)handleLongPressGestureRecognizer:
(UILongPressGestureRecognizer*)recognizer {
<...>
[self loadJavaScriptFileIfNeededWithCompletion:^{
CGPoint touchPoint = [recognizer locationInView:self.webView];
[self imageSourceFromPoint:touchPoint completion:^(NSString* source) {
<...>
}];
}];
<...>
}
- (void)imageSourceFromPoint:(CGPoint)point
completion:(void(^)(NSString*))completion {
NSString* jsCode = [NSString stringWithFormat:
@"imageSourceFromPoint(%g, %g)", point.x, point.y];
[self.webView evaluateJavaScript:jsCode
completionHandler:^(id result, NSError* error) {
<...>
NSString* resultString = (NSString*)result;
completion(resultString);
}];
}
一連のエラー チェックが省略されていることに注意してください。完全なプロジェクト サンプルはこちらにあります https://dl.dropboxusercontent.com/u/930742/so/GetHTMLElement.zip
次のようになります。
これがお役に立てば幸いです。