我想修改WebView中的用户代理字符串,以便在服务器端我可以检测到请求来自我的react-native应用程序。我想使用WebView中的source prop来做到这一点。
我如何为IOS和Android执行此操作?
答案 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)
机器人:
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.