diff --git a/Sources/Shared/UserAgentBuilder.swift b/Sources/Shared/UserAgentBuilder.swift index 5246ed7cf50..29a0ce1dd40 100644 --- a/Sources/Shared/UserAgentBuilder.swift +++ b/Sources/Shared/UserAgentBuilder.swift @@ -45,6 +45,14 @@ public struct UserAgentBuilder { // These are not super precise because each iOS version can have slighly different desktop UA. // The only differences are with exact `Version/XX` and `MAC OS X 10_XX` numbers. private var desktopUA: String { + + let iOS17DesktopUA = + """ + Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) \ + AppleWebKit/605.1.15 (KHTML, like Gecko) \ + Version/17.0 \ + Safari/605.1.15 + """ let iOS16DesktopUA = """ @@ -85,7 +93,8 @@ public struct UserAgentBuilder { case 14: return iOS14DesktopUA case 15: return iOS15DesktopUA case 16: return iOS16DesktopUA - default: return iOS16DesktopUA + case 17: return iOS17DesktopUA + default: return iOS17DesktopUA } } @@ -108,6 +117,7 @@ public struct UserAgentBuilder { case 14: return "14_6" case 15: return "15_5" case 16: return "16_6" + case 17: return "17_0_1" default: return "\(os.majorVersion)_0" } @@ -120,6 +130,7 @@ public struct UserAgentBuilder { case 14: return "14.1.1" case 15: return "15.5" case 16: return "16.6" + case 17: return "17.0" default: return "\(os.majorVersion).0" } } diff --git a/Tests/SharedTests/UserAgentBuilderTests.swift b/Tests/SharedTests/UserAgentBuilderTests.swift index 054debbcab4..ecb14e74ac5 100644 --- a/Tests/SharedTests/UserAgentBuilderTests.swift +++ b/Tests/SharedTests/UserAgentBuilderTests.swift @@ -53,6 +53,14 @@ class UserAgentBuilderTests: XCTestCase { Version/16.6 \ Safari/605.1.15 """ + + let iOS17DesktopUA = + """ + Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) \ + AppleWebKit/605.1.15 (KHTML, like Gecko) \ + Version/17.0 \ + Safari/605.1.15 + """ let iOS13 = OperatingSystemVersion(majorVersion: 13, minorVersion: 0, patchVersion: 0) @@ -101,6 +109,18 @@ class UserAgentBuilderTests: XCTestCase { iOS16DesktopUA, UserAgentBuilder(device: iPad, iOSVersion: iOS16).build(desktopMode: true), "iOS 16 desktop User Agent on iPad doesn't match") + + let iOS17 = OperatingSystemVersion(majorVersion: 17, minorVersion: 0, patchVersion: 1) + + XCTAssertEqual( + iOS17DesktopUA, + UserAgentBuilder(device: iPhone, iOSVersion: iOS17).build(desktopMode: true), + "iOS 16 desktop User Agent on iPhone doesn't match") + + XCTAssertEqual( + iOS17DesktopUA, + UserAgentBuilder(device: iPad, iOSVersion: iOS17).build(desktopMode: true), + "iOS 16 desktop User Agent on iPad doesn't match") } func testSpecificMobileUA() { @@ -113,6 +133,34 @@ class UserAgentBuilderTests: XCTestCase { // At the moment each iOS version has one corresponding Safari UA attached // so for example 13.1 and 13.3 have the same UA. + // MARK: - iOS 17 + let iPhone_safari_17_UA = """ + Mozilla/5.0 (iPhone; CPU iPhone OS 17_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) \ + Version/17.0 \ + Mobile/15E148 \ + Safari/604.1 + """ + + let iPad_safari_17_UA = """ + Mozilla/5.0 (iPad; CPU OS 17_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) \ + Version/17.0 \ + Mobile/15E148 \ + Safari/604.1 + """ + + // MARK: 17.0.1 + let ios17_0_1 = OperatingSystemVersion(majorVersion: 17, minorVersion: 0, patchVersion: 1) + + XCTAssertEqual( + iPhone_safari_17_UA, + UserAgentBuilder(device: iPhone, iOSVersion: ios17_0_1).build(desktopMode: false), + "User agent for iOS 17.0.1 iPhone doesn't match.") + + XCTAssertEqual( + iPad_safari_17_UA, + UserAgentBuilder(device: iPad, iOSVersion: ios17_0_1).build(desktopMode: false), + "User agent for iOS 17.0.1 iPad doesn't match.") + // MARK: - iOS 16 let iPhone_safari_16_UA = """ Mozilla/5.0 (iPhone; CPU iPhone OS 16_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) \ @@ -257,25 +305,25 @@ class UserAgentBuilderTests: XCTestCase { } func testFutureProofDesktopUA() { - let iOS16DesktopUA = + let iOS17DesktopUA = """ Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) \ AppleWebKit/605.1.15 (KHTML, like Gecko) \ - Version/16.6 \ + Version/17.0 \ Safari/605.1.15 """ let iOS34 = OperatingSystemVersion(majorVersion: 34, minorVersion: 0, patchVersion: 0) XCTAssertEqual( - iOS16DesktopUA, + iOS17DesktopUA, UserAgentBuilder(device: iPhone, iOSVersion: iOS34).build(desktopMode: true), - "iOS 16 fallback desktop User Agent on iPhone doesn't match") + "iOS 17 fallback desktop User Agent on iPhone doesn't match") XCTAssertEqual( - iOS16DesktopUA, + iOS17DesktopUA, UserAgentBuilder(device: iPad, iOSVersion: iOS34).build(desktopMode: true), - "iOS 16 fallback desktop User Agent on iPad doesn't match") + "iOS 17 fallback desktop User Agent on iPad doesn't match") } func testFutureProofMobileUA() {