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.
dziwne, nie działa dla mnie – peetonn
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
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