2012-04-18 10 views
6

Kürzlich habe ich versucht, Facebook Social Plugins in ein benutzerdefiniertes UIWebView in iOS für das Kommentieren einer Webseite zu integrieren. Ich habe den Like Button und das Comments Plugin hinzugefügt. Hier ist der HTML-Code, den ich in die Web-Ansicht laden:iOS: Facebook Comments Plugin Handy lädt neu

<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> 

Die erste Implementierung am Montag in vier Plattformen sucessfull war, beide Simulatoren (iOS 4 und iOS 5), iPhone 3G iOS4 und iPhone 4 iOS 5. Am Dienstag habe ich das weiter entwickelt und am Ende lief mein benutzerdefiniertes UIWebView ohne Probleme in den ersten drei. Aber auf dem iPhone 4 (iOS 5) hat die Webansicht die gleiche Webseite immer wieder neu geladen, so dass das Kommentarfeld nie angezeigt wurde. Diese URL ist dies:

https://m.facebook.com/plugins/comments.php?channel_url=http%3A%2F%2Fstatic.ak.facebook.com%2Fconnect%2Fxd_arbiter.php%3Fversion%3D4%23cb%3Df28c738848%26origin%3Dhttp%253A%252F%252Fwww.heretheweb.com%252Ff3fdf142e8%26domain%3Dwww.heretheweb.com%26relation%3Dparent.parent&href=http%3A%2F%2Fwww.heretheweb.com&locale=en_US&mobile=true&numposts=5&sdk=joey&width=470

Ich weiß nicht, was ich falsch wirklich tue, habe ich die UIWebview Delegatmethoden gereinigt, habe ich mit Haltepunkten alle Methoden überprüfen I außer Kraft setzen könnte. Nichts ... Die Webseite wird am Anfang geladen, und dann versucht sie, die obige URL zu laden ...

Antwort

1

Ok ... gelöst. Aus irgendeinem seltsamen und seltsamen Grund, manchmal beim Laden der Kommentare Webpart nur in iPhone 4 (nicht Simulator, iPhone 3G oder iPad 2) versucht es einmal und noch einmal zu laden (die Cache-Control-Header ist auf max-Age = gesetzt

Die Lösung war, den UIWebViewNavigationType zu überprüfen, wenn es gleich UIWebViewNavigationTypeReload ist, sollte sustainStartLoadWithRequest: NO zurückgeben.

Es war wirklich schwierig ¬¬

+0

seltsam, für mich nicht – peetonn

+0

mich arbeiten. Ich bekomme einfach eine leere Seite mit den 3 blauen pulsierenden Balken. Der erste Kommentar Plugin-Aufruf scheint nicht erfolgreich zu sein. – ilyashev

+0

Ich frage mich, ob die href in irgendeiner Weise von fb Standpunkt legitimiert werden muss, dh dass, wenn Sie das Kommentar-Plugin auf dem Telefon laden, die href Sie bieten einen Beweis, dass es "gehört" zu Ihnen – ilyashev

0

Ich habe das gleiche Problem unter Safari/ios Handy, auf einem Web-App auf Sencha Touch-1, entwickelte es unter anderen Browsern funktioniert und so, aber auf das, es zu halten Laden und Laden. Ich kann den Hinweis nicht finden.

5

Es gibt einen Fehler im Facebookkommentar-Plugin, der eine unendliche Ladeschleife verursacht, wenn das Kommentar-Plugin auf Retina-fähigen Geräten geladen wird.

Es gibt eine Zeile in einem der fb js Skripte, die geht wie folgt:

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

so, wenn Sie die Seite auf einem Gerät mit einer hohen Dichte Bildschirm zugreifst Sie sind zum Scheitern verurteilt.

berichten ich das Problem here

ich mit einem schmutzigen Hack kam es zu beheben, aber zweimal überlegen, vor dem Einsatz, es jederzeit aufhören zu arbeiten könnte.

Beachten Sie, dass dieser Ansatz nur funktioniert, wenn Sie das Plugin in UIWebView einbetten. Wenn Sie beim Zugriff auf eine Seite in Safari ein Problem haben, gibt es keine andere Möglichkeit, als auf eine Korrektur von Facebook zu warten.

Meine Idee war es, den js-Code im laufenden Betrieb zu "reparieren", da er von einem UIWebView geladen wird.

Anfragen in on the fly verarbeite ich meine eigene Implementierung von NSURLProtocol erstellt:

<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 

Und ich registrierte es dann in dem AppDelegate didFinishLaunchingWithOptions:

[NSURLProtocol registerClass:[FBCommentsFixingURLProtocol class]]; 

Ich bin mir bewusst, dass dies ein dreckiger Hack, aber es funktioniert trotzdem. weder

+0

WOW !! FANTASTISCH MEINEN FREUND FINDEN O_O !! – Lupi

0

Below Code funktioniert gut für mich

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];