返回

iOS 17.2 用户代理更改:备受瞩目还是苦不堪言?

Android

iOS 17.2 的用户代理变更:影响、后果和解决方法

随着 iOS 17.2 的发布,用户代理设置发生了重大变化,引起了广泛关注。让我们深入了解这一问题及其潜在影响。

什么是用户代理?

用户代理是一个字符串,当浏览器或应用程序向服务器发送请求时,它会标识自己。它包含有关浏览器的类型、版本、操作系统和其他相关信息。

iOS 17.2 的影响

在 iOS 17.2 之前,可以通过 NSUserDefaults 设置用户代理。这为开发人员提供了灵活性,让他们可以根据需要轻松更改用户代理字符串。然而,在 iOS 17.2 中,这一设置已被废弃,开发人员无法再使用 NSUserDefaults 设置用户代理。

这一更改对依赖用户代理设置的 App 内网页造成了严重影响。由于无法设置自定义的用户代理,许多 App 内网页无法正常工作或无法获取准确的数据。此外,在 iOS 17.2 中,App Transport Security (ATS) 的要求也变得更加严格,这意味着网站必须使用 TLS 加密才能与 App 内网页通信。

安全性和隐私影响

用户代理的更改也对安全性产生了重大影响。由于无法设置自定义的用户代理,攻击者可以更轻松地伪装成合法的用户,从而发起网络钓鱼攻击或其他恶意活动。此外,ATS 要求的加强给某些网站带来了挑战,这些网站可能无法满足安全要求,导致 App 内网页无法加载。

开发人员的困境

这一更改对开发人员来说无疑是挑战重重。开发人员需要找到新的方法来解决用户代理设置问题,并确保其 App 内网页能够在 iOS 17.2 上正常工作。

解决方法

  1. 使用 WKWebView

WKWebView 是一个相对较新的 Web 视图,它支持自定义的用户代理设置。开发人员可以改用 WKWebView 来实现自定义的用户代理设置。

let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 320, height: 480))
webView.customUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1"
  1. 使用 ATS 例外

开发人员可以为受影响的网站添加 ATS 例外,以允许它们使用不安全的连接。但是,这是一种权宜之计,应谨慎使用。

func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any]) -> Bool {
  if let scheme = url.scheme {
    if scheme == "http" {
      // 添加 ATS 例外
      AppTransportSecurity.default.allowArbitraryLoads = true
    }
  }

  return true
}
  1. 重新设计 App 内网页

开发人员可以重新设计 App 内网页,使其不再依赖于用户代理设置。这是一种较为彻底的解决方案,但可能需要大量的工作。

常见问题解答

  1. 为什么 iOS 17.2 中不再支持 NSUserDefaults 用户代理设置?

为了提高安全性,Apple 弃用了 NSUserDefaults 用户代理设置。

  1. 有哪些可以使用 WKWebView 来设置自定义的用户代理的替代方案?

可以使用 stringByEvaluatingJavaScriptFromString() 方法。

webView.evaluateJavaScript("navigator.userAgent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1'", completionHandler: nil)
  1. 为什么 ATS 要求在 iOS 17.2 中变得更加严格?

为了提高安全性,Apple 强制实施了 ATS,要求网站使用 TLS 加密。

  1. 如何为 ATS 添加例外?

可以在 Info.plist 文件中添加 "NSAppTransportSecurity" 键,并将其设置为 "NSAllowsArbitraryLoads" 为 "YES" 的字典。

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>
  1. 有哪些最佳做法可以遵循以解决 iOS 17.2 中的用户代理设置问题?
  • 尽量使用 WKWebView 来设置自定义的用户代理。
  • 谨慎使用 ATS 例外。
  • 重新设计 App 内网页,使其不再依赖于用户代理设置。