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
seltsam, für mich nicht – peetonn
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
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