- 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/
功能介绍 agent.exe程序文件是一个类似Windows更新服务(wuauclt.exe,即Windows Update)的程序,它不是Windows系统的一部分。而是第三方软件公司发布的程序
我正在尝试查找 android 应用程序的用户代理。 该应用程序允许应用程序内浏览,所以我认为它必须有一个用于浏览的用户代理。 我怎么知道那是什么?我正在尝试使用该信息来运行该网站的桌面版本,使其看起
考虑以下代码: (let [slave-agent (agent 0) run-slave (fn [_] (println "running slave agent")) run-m
我最近遇到了“多代理计算”这个术语,但我不太明白它是什么。我读过一本关于它的书,但这并没有回答代理是什么的基本问题。 是否有人有指向一些引用的指针,该引用清晰简洁,并且在没有大量废话/营销言论的情况下
我有一个 java 代理,我可以从它调用另一个代理,通过它传递包含 NoteId 的参数,并使用该 NoteId,我能够成功地完成该文档的工作。直到这里一切都清楚了. 关于此的主要问题是,是否可以从当
SQL Server 2012 SP2 CU6 v-5592 我启动 SQL 服务和 SQL 代理服务;都开始OK。然后我在 Windows 2012 Ent(不是 R2)服务器上登录 SSMS,SQ
有一个应用程序我曾经在 Mozilla 中运行,但我决定使用 Chrome。我选择了BlahBlahBlahSafari.gwt.xml (包含 )在 Google/GWT Compile 的帮助下
这与我的第一个问题有关。我更新了所有代码。在我的 bot.js是: require('dotenv').config(); let ver = process.env.DISCORD_BOT; cli
在 OPA 中,很清楚如何查询 condition AND condition : values := { "value1": { "a": "one" }, "value2":
通过 User-Agent header 检测设备是否为 SmartTV 设备的任何常用方法/模式?可能正在搜索 TV 或其他内容? 请告知还有其他值得检测的电视相关平台吗? UPD:根据这个http
这就是我跑步时它返回给我的东西。我试图更新包,但仍然不起作用。我也试过重新安装Julia,这个包在重新安装后只会运行一次。然后我第二次跑步的时候。它将再次失败。我试着修复它已经很长时间了。。有人能帮我
我是 OPA(开放策略代理)的新手,正在尝试使用 REST API/v1/policies/{id} 创建新策略。有用!但是,OPA 服务器将其保存到内存中,并且在重新启动后我的所有策略都被删除了。我
我想在 K8sPSPCapabilities 约束模板中将一个容器列入白名单,但我在使用 rego 语言时遇到了一些困难。我想禁止除特定容器之外的所有容器的 NET_RAW 功能。如果有人能指出我正确
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
导入命令: “从rasa_core.agent导入代理” 给我以下错误 ----------------------------------------------------------------
我正在为 Eclipse Kepler 开发一个插件。将 @RunWith(JMockit.class) 添加到我的测试类会导致以下错误: JMockit: Reinitializing un
如何使用TD-AGENT-BIT将日志文件作为消息输出,可以是逐行输出,也可以是以“hh:mm:ss”开头的行输出,然后向下游发送,而不是每次一起输出多行日志?日志:。。。我想要下面这样的消息:。。。
我在 SQL Server 上有一个非常奇怪的情况,我无法理解。 环境:SQL Server 2012 SP3 CU3 在 2 节点 Windows 2008 R2 集群上运行 在 SQL Serve
有关该主题的所有其他问题都没有解决我的问题。 注入(inject)器: VirtualMachine vm = VirtualMachine.attach(pid); vm.loadAgent(new
[SSH]“无法打开与您的身份验证代理的连接”。错误 我正在尝试将 ssh key 添加到我的 ssh 代理中。我首先确保 ssh-agent 正在运行。 exec ssh-agent bash 我确
我是一名优秀的程序员,十分优秀!