2012-04-18 6 views
6

Recentemente ho cercato di integrare i social plugin di Facebook in un UIWebView personalizzato in iOS per commentare una pagina web. Ho aggiunto il pulsante Mi piace così come il plugin Commenti. Ecco il codice HTML che carico in vista web:iOS: Facebook Comments Plugin mobile continua a ricaricare

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

La prima implementazione il Lunedi era sucessfull in 4 piattaforme, entrambi i simulatori (iOS 4 e iOS 5), iPhone 3G e iPhone iOS4 4 iOS 5. Martedì, ho continuato a sviluppare questo e ho finito con il mio UIWebView personalizzato lavorando senza problemi nei primi tre. Ma su iPhone 4 (iOS 5) la visualizzazione web continuava a ricaricare la stessa pagina Web ancora e ancora, con il risultato che la finestra di commento non veniva mai visualizzata. Questo URL è questo:

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

Non so che cosa sto facendo male davvero, ho pulito i metodi delegato UIWebView, devo verificare con punti di arresto tutti i metodi ho potuto ignorare. Nulla ... La pagina web viene caricata all'inizio, e quindi cerca di caricare l'URL sopra ...

risposta

1

Ok ... risolto. Per qualche strana e strana ragione, a volte quando si carica SOLO la parte web commenti in iPhone 4 (non simulatore, iPhone 3G o iPad 2) si tenta di ricaricare una volta ancora e ancora (l'intestazione Cache-Control è impostata su max-age = 0, quindi continua a forzare la ricarica)

La soluzione era controllare UIWebViewNavigationType, se è uguale a UIWebViewNavigationTypeReload, shouldStartLoadWithRequest: restituisce NO.

E 'stato davvero difficile ¬¬

+0

strano, non funziona per me me – peetonn

+0

nessuno dei due. ottengo semplicemente una pagina bianca, con le 3 barre blu pulsanti. la chiamata del plug-in di commenti iniziali non sembra riuscire. – ilyashev

+0

mi chiedo se l'href debba essere legittimato in qualche modo dal punto di vista di fb, cioè che quando si carica il plug-in dei commenti sul telefono, l'href fornito deve offrire qualche prova che "appartiene" a te – ilyashev

0

Ho questo stesso problema sotto safari/ios cellulare, su una web app sviluppata su sencha tocco 1, funziona sotto gli altri browser e SO, ma su questo, tenere caricamento e caricamento. Non riesco a trovare l'indizio.

5

C'è un bug nel plug-in dei commenti di Facebook che causa un ciclo di caricamento infinito quando il plug-in dei commenti viene caricato sui dispositivi abilitati Retina.

C'è una linea in uno degli script js FB che va come segue:

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

quindi se si sta accedendo alla pagina su un dispositivo con uno schermo ad alta densità si sono condannati.

Ho segnalato il problema here

mi si avvicinò con un trucco sporco per risolvere il problema, ma pensare due volte prima di usarlo, potrebbe smettere di funzionare in qualsiasi momento.

Si noti che questo approccio funziona solo quando si incorpora il plugin in UIWebView, se si ha un problema quando si accede a una pagina in Safari non c'è altra opzione se non quella di attendere una correzione da Facebook.

La mia idea era di "sistemare" il codice js al volo mentre veniva caricato da un UIWebView.

per elaborare le richieste al volo ho creato la mia propria implementazione di 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 

E poi ho registrato nelle didFinishLaunchingWithOptions app delegato:

[NSURLProtocol registerClass:[FBCommentsFixingURLProtocol class]]; 

Sono consapevole che si tratta di un hack sporco ma funziona ancora.

+0

WOW !! INCREDIBILE TROVA IL MIO AMICO O_O !! – Lupi

0

Di seguito il codice sta lavorando bene per me

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