使用带有react-native的WebView设置用户代理

时间:2016-04-13 06:23:33

标签: android ios react-native

我想修改WebView中的用户代理字符串,以便在服务器端我可以检测到请求来自我的react-native应用程序。我想使用WebView中的source prop来做到这一点。

我如何为IOS和Android执行此操作?

9 个答案:

答案 0 :(得分:10)

您可以在WebView中将其设置为道具。

我正在做以下事情:

iOS上的

(我在AppDelegate.m中设置了userAgent)

NSString *deviceType = [UIDevice currentDevice].model;
UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero];
NSString *oldAgent = [webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
NSString *newAgent = [oldAgent stringByAppendingString:@" MYAPPNAME - iOS - "];
newAgent = [newAgent stringByAppendingString:deviceType];
NSDictionary *dictionnary = [[NSDictionary alloc] initWithObjectsAndKeys:newAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionnary];
Android上的

(我在WebView中设置了JS中的userAgent):

<WebView
    userAgent={DeviceInfo.getUserAgent() + " - MYAPPNAME - android "}   
    ref={"WEBVIEW"}
    automaticallyAdjustContentInsets={false}
    source={{uri: this.state.url}} />

现在我总是拥有类似于&#34; DeviceInfo - MYAPPNAME - Platform&#34;的userAgent。我们像你一样做同样的事情,它的工作方式也是如此。

答案 1 :(得分:2)

此库现在提供了一种获取ios和android的userAgent的方法:

https://github.com/react-native-community/react-native-device-info#getuseragent

this.state = { 
   userAgent: "",
}

componentDidMount = async () => {
   this.setState({ userAgent: await DeviceInfo.getUserAgent() })
}

<WebView
source={{ uri: "https://stackoverflow.com" }}
userAgent={this.state.userAgent}
>

答案 2 :(得分:1)

用于android和ios的windows phone用户代理

机器人:

mWebView.getSettings().setUserAgentString("Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)");

IOS:

[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObject:@"Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)" forkey:@"UserAgent"]];

答案 3 :(得分:1)

对于Android,您只需设置userAgent属性,例如:

<WebView
source={{ uri: "https://stackoverflow.com" }}
userAgent="Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
 />

对于iOS,您需要在didFinishLaunchingWithOptions实现中的方法return YES;内(行AppDelegate.m之前)下面添加代码:

NSString *userAgent = @"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:userAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

答案 4 :(得分:1)

只需将此添加到用户代理中,您就可以在以后更新版本,我使用的是Google登录给我带来的问题

userAgent =“ Mozilla / 5.0(Linux; Android 10;为x86 Build / LMY48X构建的Android SDK)AppleWebKit / 537.36(KHTML,例如Gecko)版本/4.0 Chrome / 81.0.4044.117移动Safari / 608.2.11”

答案 5 :(得分:0)

这不是一个答案,而是一种解决方法。

我意识到我想要做的是确定我的ruby on rails服务器上的请求是来自移动版Safari还是来自我的react-native应用程序的webView。为了解决这个问题,我刚安装了browser gem,然后做了

browser = Browser.new(request.user_agent)
from_app = browser.platform.ios_webview?

如果有人能够对我原来的问题给出明确答案,我会选择答案而不是我的答案。

答案 6 :(得分:0)

对于iOS,可以使用WKWebView代替支持userAgent设置的WebView。 https://github.com/react-native-community/react-native-webview/blob/master/docs/Reference.md#useragent

答案 7 :(得分:0)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", @"UserAgent", nil];
 [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];

}

答案 8 :(得分:-2)

这是一个糟糕的主意。只需使用自定义标题:

X-MY-CUSTOM-HEADER = MyAppName.