获取User-Agent字符串中的AppleWebKit/Mobile/Safari版本号的更好方法是什么?

4
我正在开发的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}];然而,我遇到的问题是使用苹果在Safari的用户代理中使用的版本号,特别是在Mobile(13A452)之后的那个代码和Safari版本号。我想到的唯一解决办法涉及以下步骤:
1.实例化一个WKWebView 2.从字符串加载一个虚拟页面 3.在didFinishNavigation委托调用中,评估一个javascript来返回当前的用户代理 4.拆分UA以提取这些版本号 5.构建一个类似于Safari的新字符串,但在应用程序的自己的名称/版本末尾,并将Safari版本放在带有“like”的括号中,结果如下: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
除了请求Web视图实例的用户代理字符串之外,是否有其他方法可以获取那些AppleWebKit/Mobile/Safari版本号?显然,步骤3-4可以用通过javascript提取版本号来替换,但这只是在不同环节上进行了转移。
简而言之,除了使用WebView实例请求其自身的用户代理字符串外,还有其他方法可以获取AppleWebKit/Mobile/Safari版本号吗?如果您无法跟随上述步骤,我可以提供一些示例代码或甚至一个示例项目,但我的意图应该是清楚的。
1个回答

3
我认为你最好坚持你正在做的事情:这是推导出一个强烈类似于系统默认值的用户代理字符串的最安全方法。即使创建一个 web 视图、加载一个字符串并查询用户代理存在开销,但在大局中应该是微不足道的。
另一方面,你感兴趣的数据都可以从系统的框架中轻松地“抓取”。请记住,尽管 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中的属性,或直接从客户手机上的“磁盘”读取数据。

所以我很好奇,如果信息实际上可以在信息字典中找到,为什么你建议坚持我的当前方法(感觉像一个愚蠢的黑客)。无论如何,这是一个很棒的答案,谢谢。 - Seth
我猜我没有从你的问题中获取足够的信息,了解你需要紧密模仿“官方”用户代理的真正原因。如果您满意将各种版本号组合成自己的用户代理字符串,则可以尝试这种更简洁的方法。如果您确实需要出于某种原因紧密模仿WebKit的用户代理,我建议坚持使用WKWebView JavaScript方法。 - danielpunkass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接