从JavaScript在UIWebView中发送通知ObjectiveC

我需要知道应该做什么在HTML坐在使用JavaScript UIWebView来通知的Objective-C的东西发生了什么?

更确切的说,我打在HTML一些JavaScript动画,我需要提醒动画已经结束了Objective-C代码。

--------------解决方案-------------

似乎有这样做的没有正式的方法。 然而,标准的解决方法包括读取和解析传入的URL请求,基本上滚动自己的序列化的消息传递协议。 消息处理应在做webView:shouldStartLoadWithRequest:navigationType您的视图控制器的方法。

注:有几个免费的图书馆(PhoneGap的,快速连接,JS对可可桥)用于包装此功能(加做了一大堆更多)。 要推倒重来(或不知道为什么它是圆的,可以这么说),请继续阅读。

从JavaScript中,你将试图导航到一个新的URL调用回调:

// In JavaScript
window.location = 'myapp:myaction:param1:param2'; // etc...

在Objective-C,实施UIWebViewDelegate在协议.h文件中:

// In your header file
@interface MyAppViewController : UIViewController <UIWebViewDelegate> {
...
}
@end

接下来,实现在该方法.m文件:

// In your implementation file
-(BOOL)webView:(UIWebView *)webView2
shouldStartLoadWithRequest:(NSURLRequest *)request
navigationType:(UIWebViewNavigationType)navigationType
{
// Break apart request URL
NSString *requestString = [[request URL] absoluteString];
NSArray *components = [requestString componentsSeparatedByString:@":"];

// Check for your protocol
if ([components count] > 1 &&
[(NSString *)[components objectAtIndex:0] isEqualToString:@"myapp"])
{
// Look for specific actions
if ([(NSString *)[components objectAtIndex:1] isEqualToString:@"myaction"])
{
// Your parameters can be found at
// [components objectAtIndex:n]
// where 'n' is the ordinal position of the colon-delimited parameter
}

// Return 'NO' to prevent navigation
return NO;
}

// Return 'YES', navigate to requested URL as normal
return YES;
}

两个重要的注意事项:

  1. 语境 :导航到myapp:whatever会(当然)在任何其他情况下失败。 记住这一点,如果你加载跨平台页面。
  2. 时机 :如果第二个window.location =呼叫在第一批返回之前提出的,它会变得“失去”。 所以,要么一概而论您的通话在一起,手动延迟执行,或者实现它结合了以上JS查询到的Objective-C对象的队列。

其实在iOS的时间(也许不是OSX?),如果第二个window.location调用之前的前作出window.location调用将执行,那么第一个window.location调用丢失。 我觉得window.location调用与JavaScript的执行asynchronisely它被称为后,如果另一个电话时,使其执行它之前,它取消了第一位。

例如,捕捉触摸事件时,我看到ontouchstart不经由被发送window.location ,如果一个ontouchmove发生快速之后(如在一个快速指滑动)事件。 因此,你的Objective-C没有得到ontouchstart事件。 这是更原始的iPad比iPad2的一个问题,我假定由于处理速度。

zourtney的答案是正确的,但忘了提一件事。通过登记委托的WebView需要

- (void)viewDidLoad {
[super viewDidLoad]; --- instantiate _webview next .. then

_webview.delegate = self; //important .. needed to register webview to delegate
}

希望这可以帮助 .....

分类:JavaScript的 时间:2015-03-15 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.491 (s). 10 q(s)