iOS:Facebook评论插件手机一直在重新加载

iOS:Facebook评论插件手机一直在重新加载,ios,facebook,ios5,ios4,ios-simulator,Ios,Facebook,Ios5,Ios4,Ios Simulator,最近,我一直在尝试将Facebook社交插件集成到iOS中的自定义UIWebView中,以便对网页进行评论。我添加了Like按钮和Comments插件。以下是我加载到web视图中的HTML代码: <html> <body> <div id="fb-root"></div> <script>(function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if

最近,我一直在尝试将Facebook社交插件集成到iOS中的自定义UIWebView中,以便对网页进行评论。我添加了Like按钮和Comments插件。以下是我加载到web视图中的HTML代码:

  <html>
    <body>
<div id="fb-root"></div>
<script>(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en_US/all.js#xfbml=1";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>
<div class="fb-like" data-href="http://www.heretheweb.com" data-send="false" data-layout="button_count" data-width="240" data-show-faces="false"></div>
<div class="fb-comments" data-href="http://www.heretheweb.com" data-num-posts="5" data-width="470"></div>
<body>
</html>

(功能(d、s、id){
var js,fjs=d.getElementsByTagName[0];
if(d.getElementById(id))返回;
js=d.createElement;js.id=id;
js.src=“//connect.facebook.net/en_US/all.js#xfbml=1”;
fjs.parentNode.insertBefore(js,fjs);
}(文档“脚本”、“facebook jssdk”);
周一的第一次实现在4个平台上成功,包括模拟器(iOS 4和iOS 5)、iPhone3G iOS 4和iPhone4 iOS 5。 周二,我继续开发这个,在前三个阶段,我的自定义UIWebView没有出现任何问题。但在iPhone4(iOS5)上,web视图不断地反复加载同一网页,导致评论框从未出现。该URL如下所示:

我真的不知道我做错了什么,我已经清理了uiWebView委托方法,我已经用断点检查了所有我可以重写的方法。没有什么。。。网页在开始时被加载,然后它尝试加载上面的URL…

确定。。。解决了的。 出于一些奇怪的原因,有时当只在iPhone 4(不是模拟器、iPhone 3G或iPad 2)中加载评论web部件时,它会尝试一次又一次地重新加载(缓存控制头设置为max age=0,因此它会不断强制重新加载)

解决方案是检查UIWebViewNavigationType,如果它等于UIWebViewNavigationTypeReload,shouldStartLoadWithRequest:返回否


这真的很棘手&

我在safari/ios mobile上遇到了同样的问题,在sencha touch 1上开发的一个web应用程序上, 它可以在其他浏览器下工作,但在这个浏览器上,它会不断加载。
我找不到线索。

facebook评论插件中有一个bug,当评论插件加载到支持视网膜功能的设备上时,会导致无限加载循环

fb js脚本中有一行代码如下:

if(window.devicePixelRatio>1)document.location.reload()

因此,如果你在高密度屏幕设备上访问页面,你就注定要失败

我报告了这个问题

我想出了一个肮脏的黑客来修复它,但在使用它之前三思而后行,它可能随时停止工作

请注意,这种方法仅在您将插件嵌入UIWebView时有效,如果您在safari中访问页面时遇到问题,除了等待facebook的修复外,别无选择

我的想法是在UIWebView加载js代码时,动态地“修复”js代码

为了动态处理请求,我创建了自己的NSURLProtocol实现:

<FBCommentsFixingURLProtocol.h>

#import <Foundation/Foundation.h>

@interface FBCommentsFixingURLProtocol : NSURLProtocol

@end

<FBCommentsFixingURLProtocol.m>
#import "FBCommentsFixingURLProtocol.h"


static NSString *FBCommentsFixingHeader = @"X-FBFix";

@interface FBCommentsFixingURLProtocol () 
@property (nonatomic, readwrite, strong) NSURLRequest *request;
@property (nonatomic, readwrite, strong) NSURLConnection *connection;
@property (nonatomic, readwrite, strong) NSURLResponse *response;

@end

@implementation FBCommentsFixingURLProtocol
@synthesize request = request_;
@synthesize connection = connection_;
@synthesize response = response_;


+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
    if (([request.URL.scheme isEqualToString:@"https"] || [request.URL.scheme     isEqualToString:@"http"]) && [request.URL.absoluteString rangeOfString:@"facebook.com/plugins/comments.php"].location != NSNotFound &&
    [request valueForHTTPHeaderField:FBCommentsFixingHeader] == nil)
{
    return YES;
}
return NO;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request
{
    return request;
}

- (id)initWithRequest:(NSURLRequest *)request
       cachedResponse:(NSCachedURLResponse *)cachedResponse
           client:(id <NSURLProtocolClient>)client
{
    // Modify request so we don't loop
    NSMutableURLRequest *myRequest = [request mutableCopy];
    [myRequest setValue:@"" forHTTPHeaderField:FBCommentsFixingHeader];
    self = [super initWithRequest:myRequest
               cachedResponse:cachedResponse
                       client:client];
    if (self)
    {
       [self setRequest:myRequest];
    }
    return self;
}


- (void)startLoading
{
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:[self request]
                                                            delegate:self];
    [self setConnection:connection];

}

- (void)stopLoading
{
    [[self connection] cancel];
}


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSString *dataAsString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
     //Just modify the script to prevent it from execution on Retina devices.
    //window.devicePixelRatio = 2 for the Retina Display
    NSString* modified =  [dataAsString stringByReplacingOccurrencesOfString:@"if(window.devicePixelRatio>1)document.location.reload();" withString:@""];
    NSData* dataMod=[modified dataUsingEncoding:NSUTF8StringEncoding];
    [[self client] URLProtocol:self didLoadData:dataMod];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [[self client] URLProtocol:self didFailWithError:error];
    [self setConnection:nil];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [self setResponse:response];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [[self client] URLProtocolDidFinishLoading:self];
    [self setConnection:nil];
}


@end

我知道这是一个肮脏的黑客,但它仍然有效。

下面的代码对我来说很好

UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];
NSString *html = @"<div id=\"fb-root\"></div><script>(function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) return;js = d.createElement(s); js.id = id;js.src = \"https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v2.5\";fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));</script><div class=\"fb-comments\" data-href=\"URL_OF_YOUR_PAGE\" data-numposts=\"5\"></div>";
    [webView loadHTMLString:html baseURL:[NSURL URLWithString:@"https://facebook.com"]];
    [self.view addSubview:webView];
UIWebView*webView=[[UIWebView alloc]initWithFrame:CGRectMake(0,0300400)];
NSString*html=@“(函数(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(d.getElementById(id))返回;js=d.createElement(s);js.id=id;js.src=\”https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v2.5\“fjs.parentNode.insertBefore(js,fjs);}(文档,'script','facebook jssdk');”;
[webView loadHTMLString:html baseURL:[NSURL URLWithString:@]https://facebook.com"]];
[self.view addSubview:webView];

我也是。我只是得到一个空白页,有3个蓝色的脉动条。最初的评论插件调用似乎没有成功。我想知道从fb的角度来看,href是否需要以某种方式合法化,即当您在手机上加载评论插件时,您提供的href必须提供一些证据证明它“属于”对您来说,如果我记得正确,href必须与您试图评论的网页相同我的href当前与正在加载的网页相同,但问题仍然存在;此外,在我将fb管理行添加到网页的标题后,该页面在模拟器中停止工作,声称用户不知道我所做的是创建web视图,然后加载带有baseURL=我将要评论的web的HTML代码(loadHTMLString:baseURL:)哇!!找到我的朋友真是太棒了!!
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];
NSString *html = @"<div id=\"fb-root\"></div><script>(function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) return;js = d.createElement(s); js.id = id;js.src = \"https://connect.facebook.net/en_GB/sdk.js#xfbml=1&version=v2.5\";fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));</script><div class=\"fb-comments\" data-href=\"URL_OF_YOUR_PAGE\" data-numposts=\"5\"></div>";
    [webView loadHTMLString:html baseURL:[NSURL URLWithString:@"https://facebook.com"]];
    [self.view addSubview:webView];