My Phonegap application is allowed to browse to some external sites that also use the Phonegap API. Currently I am conditionally including the Phonegap javascript based on
This answer to a similar question also mentions a preference available in current Cordova versions:
<preference name="OverrideUserAgent" value="MyCordovaApp/1.2.3" />
It is documented for Android and iOS.
If you're still looking for a quick solution for that one, this is how I achieved it:
// 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];
In the Phonegap (Cordova) sample app, you need to add these lines in the didFinishLaunchingWithOptions method of AppDelegate.m
I spent an entire day trying to figure this one out! I'm sure it could be useful to other people.
If you're looking for a more powerful http client for cordova that allows changing the user agent, or any header in that matter, try out https://github.com/aporat/cordova-plugin-fetch. it wraps around well tested native networking libraries (AFNetworking 2
on ios, and OKHttp
on android).
it also follows the window.fetch, so you could use cordovaFetch
on the simulators and devices, while testing on the browser with fetch.js
.
Just install the plugin with
cordova plugin add https://github.com/aporat/cordova-plugin-fetch.git
and include the user agent header in any request you made.
cordovaFetch('/users.json', {
method : 'GET',
headers: {
'User-Agent': 'your user agent'
},
})
I couldn't get this to work in iOS using Cordova 3.3, presumably because of CB-2520 but, as a hack, I modified CDVViewController
.h to make the userAgent
property readwrite, and then simply updated self.userAgent in the viewDidLoad
of my controller that inherits from CDVViewController
.
If timing is an issue, you could forcibly manipulate the userAgent
lazy-loaded property in CDVViewController.m
.
Both of these are very dirty. :)
CB-2520 was resolved, which proposed allowing the user-agent string to be modified. You can achieve this now by setting the baseUserAgent property of the MainViewController. For a simple test, you can add the following to the didFinishLaunchingWithOptions method of the AppDelegate.m, after the MainViewController is initialized:
self.viewController.baseUserAgent = @"My Custom User Agent";
See this question: Detect between a mobile browser or a PhoneGap application
I made a contribution but there are plenty of answers which may be suitable for you.