- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在开发的 iPhone 应用程序使用 WKWebView,但是(我的客户要求……)它必须有一个自定义用户代理。
我们希望用户代理字符串模仿 Safari 的,看起来像这样:
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A452 Safari/601.1
我知道如何设置用户代理字符串。最简单的方法就是将 UserAgent 设置为标准用户默认值。
[[NSUserDefaults standardUserDefaults] registerDefaults:@{@"UserAgent": userAgent}];
我遇到的问题实际上是想出 Apple 在 Safari 的用户代理中使用的版本号。具体来说,AppleWebKit 版本,紧接在 Mobile (13A452) 之后的代码,以及 Safari 版本号。
我想出的唯一解决办法是
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A452 (like Safari/601.1) TheAppName/1.12
(这两个 iPhone 版本是通过提供的系统调用找到的,这不是问题。)
有没有更好的方法? (显然,步骤 3-4 可以替换为通过 javascript 提取版本号,但这只是改变了情况。)
简而言之,除了通过向 webview 实例询问它自己的用户代理字符串之外,还有什么方法可以获取这些 AppleWebKit/Mobile/Safari 版本号吗?
如果您不能按照上述步骤操作,我可以提供一些示例代码甚至示例项目,但我的意图应该很明确。
最佳答案
我认为你最好的选择是坚持你正在做的事情:这是派生一个与系统默认字符串非常相似的用户代理字符串的最安全的方法。尽管创建 Web View 、加载字符串和查询用户代理会产生开销,但在大计划中它必须是微不足道的。
另一方面,您感兴趣的数据应该都可以立即从系统自己的框架中“抓取”。请记住,虽然 iOS 进程是沙箱化的,但这主要是为了防止它们访问其他应用程序的数据。 iOS 和 Mac 上的沙盒设计使应用程序进程能够从系统文件中自由读取,这是有道理的,因为这些文件支持代表应用程序将动态库和资源数据预期加载到内存中。
因此,例如,在您的 applicationDidFinishLaunching 方法中添加这样一行:
NSLog(@"System frameworks: %@", [[NSFileManager defaultManager] directoryContentsAtPath:@"/System/Library/Frameworks/" excludingDirectories:NO]);
您会在期望的位置看到一长串所有可用的系统框架。要正确获取 WebKit 框架的 CFBundleVersion,例如:
NSLog(@"%@", [[NSDictionary dictionaryWithContentsOfFile:@"/System/Library/Frameworks/WebKit.framework/Info.plist"] objectForKey:@"CFBundleVersion"]);
但是当然 NSBundle 抽象了这个文件读取并让你直接得到可能已经在内存中的字典:
NSLog(@"%@", [[[NSBundle bundleForClass:[[WKWebView class] infoDictionary] objectForKey:@"CFBundleVersion"]);
您可以使用类似的技巧通过 NSBundle 的 infoDictionaruy 访问属性,或者直接从客户手机上的“磁盘”读取数据。
关于ios - 获取 User-Agent 字符串的 AppleWebKit/Mobile/Safari 版本号的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33115412/
用户代理可以检测到 AppleWebKit .这是一个主要用于 Apple 设备的浏览器引擎,但也用于 BlackBerry 浏览器、PlayStation 控制台和 Tizen 移动操作系统。此外,
我们看到一些 Safari 浏览器在我们从 .NET 3.5 升级到 .NET 4.0 后无法交叉验证我们的网站。 经过大量调查,结果证明是 ASP.NET 无法正确识别 Safari 浏览器的问题。
我正在开发的 iPhone 应用程序使用 WKWebView,但是(我的客户要求……)它必须有一个自定义用户代理。 我们希望用户代理字符串模仿 Safari 的,看起来像这样: Mozilla/5.0
我是一名优秀的程序员,十分优秀!