2012-05-16 11 views
9

Meine Phonegap-Anwendung darf zu einigen externen Sites navigieren, die auch die Phonegap-API verwenden. Momentan schließe ich das Phonegap-Javascript bedingt ein, basierend auf welcher Plattform du bist (Android, iOS, etc.). Allerdings kann ich den Unterschied zwischen Phonegap-Anwendungen und dem normalen Browser auf einem mobilen Gerät nicht unterscheiden. Gibt es eine Möglichkeit, den User-Agent in meiner Phonegap-App zu ändern, um meinem Server einen Hinweis darauf zu geben?Change Phonegap User Agent

Am meisten interessiert an der iOS-Lösung für diese.

Antwort

6

This answer auf eine ähnliche Frage erwähnt auch eine Präferenz in aktuelle Cordova Versionen:

<preference name="OverrideUserAgent" value="MyCordovaApp/1.2.3" /> 

Es ist documented for Android und iOS.

18

Wenn Sie immer noch für eine schnelle Lösung für diese eine sucht, ist hier, wie ich es erreicht:

// Modify the user-agent 
NSString* suffixUA = @" my nice user-agent suffix"; 
UIWebView* webView = [[UIWebView alloc] initWithFrame:CGRectZero]; 
NSString* defaultUA = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"]; 
NSString* finalUA = [defaultUA stringByAppendingString:suffixUA]; 
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:finalUA, @"UserAgent", nil]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary]; 

Im Phonegap (Cordova) Beispielanwendung, müssen Sie diese Zeilen in der hinzufügen didFinishLaunchingWithOptions Methode von AppDelegate.m

ich einen ganzen Tag damit verbracht, diese ein, um herauszufinden! Ich bin mir sicher, dass es für andere Menschen nützlich sein könnte.

+2

Wäre nett, die android Lösung auch einzuschließen. –

+0

Ich fand die Android-Lösung unter http://stackoverflow.com/questions/14406393/change-phonegap-cordova-user-agent-for-ajax – Krishna

+4

Um @alanou Lösung arbeiten zu bekommen, sollten Sie den Code hinzufügen, den er am Ende des geschrieben hat die didFinishLaunchingWithOptions-Methode unmittelbar vor der return-Anweisung. Es scheint, dass [self.window makeKeyAndVisible]; muss ausgeführt werden, bevor Sie die UA ändern können. Test OK auf iPhone 4 mit iOS 6.1.3 – redochka

0

ich das nicht in iOS Cordova 3.3, vermutlich wegen CB-2520 aber als Hack zu arbeiten, konnte ich CDVViewController .h modifiziert, um die userAgent Eigenschaft Lese-Schreib zu machen, und dann einfach self.userAgent im viewDidLoad aktualisiert meines Controllers, der von CDVViewController erbt.

Wenn Timing ein Problem ist, können Sie zwangsweise die userAgent Lazy-Loaded-Eigenschaft in CDVViewController.m manipulieren.

Beide sind sehr schmutzig. :)

+0

[CB-2520] (https://issues.apache.org/jira/browse/CB-2520) wurde behoben; CDVViewController hat jetzt eine BaseUserAgent-Eigenschaft, die geändert werden kann –

6

CB-2520 wurde aufgelöst, was die Änderung der User-Agent-Zeichenfolge vorschlägt. Dies erreichen Sie jetzt, indem Sie die Eigenschaft baseUserAgent des MainViewControllers setzen. Für einen einfachen Test können Sie die folgenden auf die didFinishLaunchingWithOptions Methode des AppDelegate.m, fügen Sie nach dem Mainviewcontroller initialisiert wird:

self.viewController.baseUserAgent = @"My Custom User Agent";

+0

Dies hat keine Auswirkungen, wenn ich es einstelle ... was fehlt mir? –

3

Wenn Sie nach einem leistungsfähigeren HTTP-Client für cordova suchen, der es ermöglicht, den Benutzeragenten oder irgendeinen Header in dieser Angelegenheit zu ändern, probieren Sie https://github.com/aporat/cordova-plugin-fetch aus. Es umschließt gut getestete native Netzwerkbibliotheken (AFNetworking 2 auf iOS und OKHttp auf Android).

es folgt auch der window.fetch, so können Sie cordovaFetch auf den Simulatoren und Geräten verwenden, während Sie im Browser mit fetch.js testen.

Installieren Sie einfach das Plugin mit

cordova plugin add https://github.com/aporat/cordova-plugin-fetch.git

und umfassen den Header User-Agent in jede Anfrage Sie gemacht.

cordovaFetch('/users.json', { 
    method : 'GET', 
    headers: { 
    'User-Agent': 'your user agent' 
}, 
})