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.
strano, non funziona per me me – peetonn
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
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