2012-04-18 11 views
6

Ostatnio staram się integrować Facebook Social Plugins z niestandardowym UIWebView w iOS do komentowania strony internetowej. Dodałem przycisk Like, a także Comment. Oto kod HTML załadować do widoku internetowej:iOS: Facebook Comments Plugin mobile wciąż przeładowuje

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

Pierwsze wdrożenie w poniedziałek był sucessfull w 4 platform, zarówno symulatory (iOS 4 i iOS 5), iPhone 3G i iPhone 4 iOS4 iOS 5. We wtorek ciągle to rozwijałem, a skończyłem z moim niestandardowym interfejsem UIWebView, który działał bez żadnych problemów w pierwszych trzech. Ale na iPhone 4 (iOS 5) widok internetowy ciągle przeładowywał tę samą stronę, co spowodowało, że pole komentarza nigdy się nie pojawiło. Że adres URL jest taki:

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

nie wiem co robie nie tak naprawdę, mam czyścić metody delegata UIWebView, muszę sprawdzić z punktów przerwania wszystkich metod mogłoby zastąpić. Nic ... Strona zostanie załadowana na początku, a następnie pętle próbujące załadować powyższy URL ...

Odpowiedz

1

Ok ... rozwiązany. Z jakiegoś dziwnego i dziwnego powodu, czasami podczas ładowania strony internetowej z komentarzami TYLKO w iPhone 4 (nie symulator, iPhone 3G lub iPad 2) próbuje ponownie załadować raz i jeszcze raz (nagłówek Cache-Control jest ustawiony na max-age = 0, więc wymusza ponowne ładowanie)

Rozwiązaniem było sprawdzenie UIWebViewNavigationType, jeśli jest równe UIWebViewNavigationTypeReload, shouldStartLoadWithRequest: zwraca NIE.

To było naprawdę trudne ¬¬

+0

dziwne, nie działa dla mnie – peetonn

+0

mnie też nie. Po prostu otrzymuję pustą stronę z 3 niebieskimi pulsującymi paskami. początkowe wywołanie wtyczki komentarzy wydaje się nie być skuteczne. – ilyashev

+0

Zastanawiam się, czy href musi być w jakiś sposób legitymizowany z punktu widzenia fb, tj. Kiedy ładuje się wtyczkę komentarzy do telefonu, dostarczony przez ciebie href ma do zaoferowania jakiś dowód, że "należy" do ciebie – ilyashev

0

mam ten sam problem pod safari/iOS komórkowego, na aplikacji internetowej opracowanej na dotyk Sencha 1 działać pod innymi przeglądarkami i SO, ale na tym, że utrzymanie ładowanie i ładowanie. Nie mogę znaleźć wskazówki.

5

W dodatku do Facebooka jest błąd, który powoduje nieskończoną pętlę ładującą, gdy wtyczka komentarzy jest ładowana na urządzenia z włączoną funkcją Retina.

Jest to linia w jednym FB skryptów js, który idzie w następujący sposób:

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

więc jeśli masz dostęp do strony na urządzeniu z ekranem o wysokiej gęstości jesteś skazany.

Zgłosiłem problem here

wymyśliłem brudnej siekać go naprawić, ale dwa razy pomyśleć, zanim go używać, to może przestać działać w każdej chwili.

Należy zauważyć, że to podejście działa tylko po osadzeniu wtyczki w UIWebView, jeśli masz problem z dostępem do strony na safari, nie ma innej opcji niż czekać na poprawkę z Facebooka.

Mój pomysł polegał na "naprawieniu" kodu js w locie podczas ładowania przez UIWebView.

do przetwarzania żądań w locie tworzę własną implementację 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 

I wtedy go zarejestrowanej w didFinishLaunchingWithOptions aplikacja Delegat:

[NSURLProtocol registerClass:[FBCommentsFixingURLProtocol class]]; 

Zdaję sobie sprawę, że jest to brudny hack, ale nadal działa.

+0

WOW !! NIESAMOWITE ZNAJDŹ MOJEGO PRZYJACIELA O_O !! – Lupi

0

poniższy kod działa dobrze dla mnie

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]; 
Powiązane problemy