简短总结: edge.create在UIWebView内部的嵌入式HTML中停止触发(我在代码中没有改变任何东西) - 任何想法我怎样才能找回它?
我有iOS应用程序,它有UIWebView和Facebook Like按钮。
用户登录Facebook之前出现此对话框,因此没有登录逻辑发生。
我可以点击喜欢/不同 - 并且它工作正常 - 但它曾用于关闭对话框,几天前它就破了。通过订阅edge.create / edge.remove事件来实现关闭对话框。
这是我的HTML页面:
<html>
<head>
<style type='text/css'>
* { -webkit-touch-callout: none; -webkit-user-select: none; }
body { margin:0px; }
.fb_edge_comment_widget { display: none !important; }
</style>
</head>
<body>
<div id='fb-root'></div>
<script src='http://connect.facebook.net/en_US/all.js#xfbml=1'></script>
<script>
function forwardEvent(name) {
var iframe = document.createElement('iframe');
iframe.setAttribute('src', 'event:' + name);
document.documentElement.appendChild(iframe);
iframe.parentNode.removeChild(iframe);
};
function beginForwardingEvent(name) {
FB.Event.subscribe(name, function(r) { forwardEvent(name); });
};
function beginForwardingEvents(names) {
for (var i = 0; i < names.length; i++) {
beginForwardingEvent(names[i]);
}
};
beginForwardingEvents(['edge.create', 'edge.remove', 'xfbml.render']);
</script>
<fb:like href='%@'
send='false'
layout='%@'
width='%.0f'
show_faces='%@'
action='%@'
colorscheme='%@'
font='%@'
></fb:like>
</body>
</html>
以下是我如何在Objective-C代码中捕获事件:
- (void)didObserveFacebookEvent:(NSString *)fbEvent {
if ([fbEvent isEqualToString:@"edge.create"] && [_delegate respondsToSelector:@selector(facebookLikeViewDidLike:)])
[_delegate facebookLikeViewDidLike:self];
else if ([fbEvent isEqualToString:@"edge.remove"] && [_delegate respondsToSelector:@selector(facebookLikeViewDidUnlike:)])
[_delegate facebookLikeViewDidUnlike:self];
else if ([fbEvent isEqualToString:@"xfbml.render"] && [_delegate respondsToSelector:@selector(facebookLikeViewDidRender:)])
[_delegate facebookLikeViewDidRender:self];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
// Allow loading Like button XFBML from file
if ([request.URL.scheme isEqualToString:@"file"])
return YES;
// Allow loading about:blank, etc.
if ([request.URL.scheme isEqualToString:@"about"])
return YES;
// Block loading of 'event:*', our scheme for forwarding Facebook JS SDK events to native code
else if ([request.URL.scheme isEqualToString:@"event"]) {
[self didObserveFacebookEvent:request.URL.resourceSpecifier];
return NO;
}
....
}
所以再一次 - edge.create停止射击(我在代码中没有改变任何东西一段时间) - 任何想法我怎样才能得到它?
谢谢。
更新 虽然有一个FB bug reported,我仍然想了解为什么它在FBRELL网站上有效,但在iOS UIWebView中无效。可能是iOS对话需要调整吗?这有解决方法吗?开始赏金希望得到答案。
答案 0 :(得分:1)
似乎edge.create事件不会在本地HTML文件中触发。无论这是偶然的还是设计的,我都不确定,但我做了一些事情并让它发挥作用:
在我自己的服务器上托管'FacebookLikeView.html'文件,用格式说明符替换我想要的实际值,例如: action='%@'
现已明确action='like'
。
从FacebookLikeView.m中的load
方法中删除了所有内容,并将其替换为以下行:
[_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.yourhost.com/FacebookLikeView.html"]]];
更改了webView:shouldStartLoadWithRequest:navigationType
方法中的行:
if ([request.URL.scheme isEqualToString:@"file"])
return YES;
到
if ([request.URL.host hasSuffix:@"yourhost.com"])
return YES;
这不是你所希望的答案,但我希望这会给你一些线索,至少有助于让它在此期间起作用。