it-swarm.dev

UIWebView'da Kullanıcı Aracısını Değiştirme

Gömülü bir UIWebView için UserAgent'ı özelleştirebilmem gereken bir işim var. (Örneğin, bir kullanıcı uygulamanın bir sürümünü diğerine karşı kullanıyorsa, sunucunun farklı yanıt vermesini isterim.)

UserAgent'ı mevcut UIWebView denetiminde, Windows uygulamasına katıştırılmış IE tarayıcı için söylendiği şekilde özelleştirmek mümkün müdür?

66
Steve Murch

Modern Swift

İşte StackOverflow kullanıcıları PassKit ve Kheldar'dan Swift 3+ projeleri için bir öneri:

UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])

Kaynak: https://stackoverflow.com/a/27330998/128579

Önceki Amaç-C Cevabı

İOS 5 değişikliklerinde, asıl olarak bu StackOverflow sorusundan kaynaklanan aşağıdaki yaklaşımı öneriyorum: UIWebView iOS5 değişen kullanıcı aracısı aşağıdaki cevapta belirtildiği gibi. Bu sayfadaki yorumlarda, 4.3 ve daha önce de çalıştığı görülmektedir.

"UserAgent" varsayılan değerini bu kodu bir kez çalıştırarak değiştirin. uygulamanız başlıyor:

NSDictionary *dictionary = @{@"UserAgent": @"Your user agent"};
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
[[NSUserDefaults standardUserDefaults] synchronize];

4.3/5.0'dan önce iOS sürümlerinde çalışan yöntemlere ihtiyacınız varsa, bu yazıdaki önceki düzenlemelere bakın. Kapsamlı düzenlemeler nedeniyle, bu sayfadaki aşağıdaki yorumların/diğer cevapların bir anlamı olmayabileceğini unutmayın. Ne de olsa bu dört yıllık bir soru. ;-)

90
Louis St-Amour

Ben de bu sorunu yaşadım ve tüm yöntemleri denedim. Yalnızca bu yöntemin işe yaradığını buldum (iOS 5.x): UIWebView iOS5 kullanıcı ajanı değiştiriyor

İlke, kullanıcı aracısını kalıcı olarak kullanıcı ayarlarında ayarlamaktır. Bu çalışıyor; Webview verilen başlığı gönderir. Sadece iki kod satırı:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/Whatever version 913.6.beta", @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

Değiştirilebilir istekte User-Agent veya User_Agent'ı ayarlama veya NSHttpRequest'deki setValue değerini swizzling ile geçersiz kılma, - Bunları denedim ve sonuçları wireshark ile kontrol ettim ve hiçbiri işe yaramış gibi görünmedi, çünkü Webview hala user agent değerini kullanıyor NSHttpRequest'te ne ayarlamaya çalışırsanız yapın, kullanıcı varsayılanlarından.

19
winitzki

Kuso'nun yazdığı gibi bir NSMutableURLRequest ile çalışmalı.

NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: @"http://www.google.com/"]];
[urlRequest setValue: @"iPhone" forHTTPHeaderField: @"User-Agent"]; // Or any other User-Agent value.

ResponseData öğesini almak için NSURLConnection kullanmanız gerekir. ResponseData öğesini UIWebView cihazınıza ayarlayın ve webView işleyecektir:

[webView loadData:(NSData *)data MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)encodingName baseURL:(NSURL *)baseURL];
18
Dshutsi

Swift'de çok basit. Aşağıdakileri Uygulama Temsilcinize yerleştirin.

UserDefaults.standard.register(defaults: ["UserAgent" : "Custom Agent"])

Mevcut ajan dizesine eklemek istiyorsanız o zaman:

let userAgent = UIWebView().stringByEvaluatingJavaScript(from: "navigator.userAgent")! + " Custom Agent"
UserDefaults.standard.register(defaults: ["UserAgent" : userAgent])

Not: Mevcut ajan dizesine eklenmesini önlemek için Uygulamayı kaldırmanız ve yeniden kurmanız gerekebilir.

10
PassKit

@ "User_Agent" kullanmak, özel bir başlığın GET isteğinde görünmesine neden olur.

User_agent: Foobar/1.0\r\n
Kullanıcı Aracısı: Mozilla/5.0 (iPhone; U; CPU İPhone OS 3_1_2, Mac OS X; en-us gibi) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7D11\r\n

Yukarıdakiler disseke olmuş HTTP paketinde görünen ve esasen Sfjava'nın bu forumdan alıntı yaptığını onaylayan şeydir. "User-Agent" öğesinin "User_agent" e döndüğünü not etmek ilginçtir.

6
dodeskjeggen

Her şeyi alarak, benim için nasıl çözüldüğü:

- (void)viewDidLoad {
    NSURL *url = [NSURL URLWithString: @"http://www.Amazon.com"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setValue:@"Foobar/1.0" forHTTPHeaderField:@"User-Agent"];
    [webView loadRequest:request];
}

Herkese teşekkürler.

6

Gerçekte herhangi bir başlık alanını NSTLRequest argümanına shouldStartLoadWithRequest looks work çalışmasına ekleyerek, istek setValue: ForHTTPHeaderField - - ancak/ yok aslında işe - yanıt vermeden yanıt veriyor. 

Bu yüzden bu geçici çözümü, verilen isteği yeni değiştirilebilir bir talebe kopyalayan ve yeniden yükleyen shouldStartLoadWithRequest içinde kullandım. Bu aslında gönderilen başlığı değiştirir.

if ( [request valueForHTTPHeaderField:@"MyUserAgent"] == nil )
{
    NSMutableURLRequest *modRequest = [request mutableCopyWithZone:NULL];
    [modRequest setValue:@"myagent" forHTTPHeaderField:@"MyUserAgent"];
    [webViewArgument loadRequest:modRequest];
    return NO;
}

Ne yazık ki, bu hala görünüşte Apple tarafından yazılmış olan kullanıcı aracısı http başlığının geçersiz kılınmasına izin vermiyor. Sanırım geçersiz kıldığın için NSURLConnection'ı kendi başına yönetmen gerekirdi.

6
Danra

Cevabı Louis St-Amour ve NSUserDefaults+UnRegisterDefaults kategorisini bu sorudan/cevabını birleştirerek, uygulamanız çalışırken kullanıcı ajanı sahtekarlığını başlatmak ve durdurmak için aşağıdaki yöntemleri kullanabilirsiniz:

#define kUserAgentKey @"UserAgent"

- (void)startSpoofingUserAgent:(NSString *)userAgent {
    [[NSUserDefaults standardUserDefaults] registerDefaults:@{ kUserAgentKey : userAgent }];
}

- (void)stopSpoofingUserAgent {
    [[NSUserDefaults standardUserDefaults] unregisterDefaultForKey:kUserAgentKey];
}
5
EthanB

Bu çözüm, bunu yapmak için oldukça zeki bir yol olarak görülüyor

başlıkları değiştiren-for-uiwebkit-http-istekleri

Method Swizzling kullanıyor ve bu konuda daha fazla bilgi edinebilirsiniz - CocoaDev sayfasında

Bir göz at!

4
Open SEO

Aynı soruyla karşılaştım. Kullanıcı aracısına biraz bilgi eklemek istiyorum, ayrıca web görünümünün orijinal kullanıcı aracısını da tutmam gerekiyor. Aşağıdaki kodu kullanarak çözdüm:

    //get the original user-agent of webview
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSLog(@"old agent :%@", oldAgent);

//add my info to the new agent
NSString *newAgent = [oldAgent stringByAppendingString:@" Jiecao/2.4.7 ch_appstore"];
NSLog(@"new agent :%@", newAgent);

//regist the new agent
NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

Web görünümüne başlamadan önce kullanın.

2
Shannon Chou

Bulduğum tek sorun sadece kullanıcı aracısını değiştirmekti

- (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSDictionary *dictionary = [NSDictionary 
        dictionaryWithObjectsAndKeys:
        @"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", 
        @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
1
Sanjeev sharma

Bunu AppDelegate.m'de deneyin

+ (void)initialize 

{

    // Set user agent (the only problem is that we can’t modify the User-Agent later in the program)

    // iOS 5.1

    NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:@”Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3”, @”UserAgent”, nil];


    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];

}
1
Aitul

Geçerli UserAgent değerine yalnızca özel bir içerik eklemek için aşağıdakileri yapın:

1 - YENİ WEBVIEW'dan kullanıcı aracısı değerini alın

2 - Özel içeriği ona ekle

3 - Yeni değeri UserAgent tuşuyla bir sözlüğe kaydedin.

4 - Sözlüğü standardUserDefaults içine kaydedin. 

Aşağıdaki örneğe bakın:

NSString *userAgentP1 = [[[UIWebView alloc] init] stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *userAgentP2 = @"My_custom_value";
NSString *userAgent = [NSString stringWithFormat:@"%@ %@", userAgentP1, userAgentP2];
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:userAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
0
Doug