Из проведенного мною исследования причина, по которой вы не можете установить User-Agent, заключается в том, что UIWebView устанавливает значение User-Agent непосредственно перед отправкой запроса, то есть после того, как вы сделали запрос.из вашего кода.
Хитрость, чтобы обойти эту проблему, состоит в том, чтобы использовать нечто, называемое «перебор методов», продвинутую и потенциально опасную концепцию Objective-C, которая заменяет стандартный метод на тот, который вы предоставляете.Конечный результат состоит в том, что когда ваш запрос отсылается, а код платформы добавляет User-Agent, он будет обманут, используя предоставленный вами метод.
Ниже объясняется, что я сделал для реализации этого, но яЭксперт Objective-C и предложил бы вам сделать некоторые исследования, чтобы ознакомиться с техникой.В частности, там была ссылка, объясняющая лучше меня, что здесь происходит, но в данный момент я не могу ее найти.
1) Добавьте категорию на NSObject, чтобы разрешить свистлинг.
@interface NSObject (Swizzle)
+ (BOOL) swizzleMethod:(SEL)origSelector withMethod:(SEL)newSelector;
@end
@implementation NSObject (Swizzle)
+ (BOOL) swizzleMethod:(SEL) origSelector withMethod:(SEL)newSelector
{
Method origMethod= class_getInstanceMethod(self, origSelector);
Method newMethod= class_getInstanceMethod(self, newSelector);
if (origMethod && newMethod)
{
if (class_addMethod(self, origSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
{
class_replaceMethod(self, newSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
}
else {
method_exchangeImplementations(origMethod, newMethod);
}
return YES;
}
return NO;
}
@end
2) Подкласс NSMutableURLRequest, чтобы разрешить swizzle:
@interface NSMutableURLRequest (MyMutableURLRequest)
+ (void) setupUserAgentOverwrite;
@end
@implementation NSMutableURLRequest (MyMutableURLRequest)
- (void) newSetValue:(NSString*)value forHTTPHeaderField:(NSString*)field
{
if ([field isEqualToString:@"User-Agent"])
{
value = USER_AGENT; // ie, the value I want to use.
}
[self newSetValue:value forHTTPHeaderField:field];
}
+ (void) setupUserAgentOverwrite
{
[self swizzleMethod:@selector(setValue:forHTTPHeaderField:)
withMethod:@selector(newSetValue:forHTTPHeaderField:)];
}
@end
3) Вызвать статический метод, чтобы поменять метод.Я сделал этот вызов в didFinishLaunchingWithOptions:
// Need to call this method so that User-Agent get updated correctly:
[NSMutableURLRequest setupUserAgentOverwrite];
4) А затем использовал его следующим образом.(Делегат соединения сохраняет данные в изменяемом массиве, а затем вручную устанавливает UIWebView, используя метод loadData, когда завершает загрузку).
- (void)loadWithURLString:(NSString*)urlString
{
NSURL *url = [NSURL URLWithString:urlString];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
_connection = [NSURLConnection connectionWithRequest:request delegate:self];
[_connection start];
}