Skip to content
Free tool · Follows every iOS browser release

iPhone user agent strings

The User-Agent strings Safari, Chrome and Firefox send on an iPhone today, why they all look like Safari, and the one part that still tells them apart. No iPhone browser sends Client Hints.

Safari
27.0
Chrome (CriOS)
156.0.8078.33
Firefox (FxiOS)
158.1
Edge (EdgiOS)
155.4283.61

Safari from Apple's release notes, the others from the App Store, checked every six hours.

Current iPhone user agents

BrowserUser-AgentCopy
SafariSafari 27.0Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Mobile/15E148 Safari/604.1
ChromeChrome 156.0.8078.33, on iOS 27.0Mozilla/5.0 (iPhone; CPU iPhone OS 27_0_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/156.0.8078.33 Mobile/15E148 Safari/604.1
FirefoxFirefox 158.1Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) FxiOS/158.1 Mobile/15E148 Safari/604.1
Safari on iPadDefault: desktop websitesMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Safari/605.1.15
Chrome on iPadDesktop websitesMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/156 Version/11.1.1 Safari/605.1.15

Built from each browser's source: WebKit for Safari's frozen parts (Quirks.cpp), Chromium's ios/web/common/user_agent.mm for Chrome, and Firefox for iOS's UserAgent.swift. Chrome writes the device's own iOS version, so on iOS 27.0.1 its string says 27_0_1.

Edge marks its string with EdgiOS/155.4283.61; its source is not public and we have not verified the rest of the current string on a device, so it is not in the table.

One engine, four names

Every browser in the table runs on WebKit, so they share Safari's skeleton and differ in one or two tokens:

PartSafari · Chrome · Firefox
iPhone; CPU iPhone OS …18_7 (frozen) · real version, e.g. 27_0_0 · 18_7 (frozen, copied from Safari)
AppleWebKit/605.1.15 (KHTML, like Gecko)Identical in all three: fixed values.
Browser tokenVersion/27.0 · CriOS/156.0.8078.33 · FxiOS/158.1
Mobile/15E148 Safari/604.1Identical in all three.

Because the engine is the same, a feature test cannot tell these browsers apart: what one supports, all support. Only the token, and in Chrome's case the unfrozen iOS version, differ. Apps with a built-in browser (a WKWebView) usually send the WebKit part with neither Version/ nor Safari/, often followed by the app's own name.

The frozen iOS version

Up to iOS 18, Safari wrote the real version: iPhone OS 18_5 on iOS 18.5. From iOS 26 on, WebKit writes a fixed value (frozenVersion in Quirks.cpp): 18_6 in early iOS 26 builds, 18_7 since (whatwg/compat#283). Two consequences for anyone reading the string:

  • The iOS version must come from Version/: Safari 27 means iOS 27. There is no Client Hint to ask instead.
  • iPhone OS 18_7 in a Safari string may mean iOS 18.7 or any newer iOS; only Version/ separates them.

How to tell iPhone browsers apart

  • CriOS/ is Chrome, FxiOS/ Firefox, EdgiOS/ Edge; no browser token and Version/ … Safari/ is Safari.
  • An iPhone string from something that is not an iPhone usually contradicts itself elsewhere: Client Hints that WebKit never sends, a screen size no iPhone has, or a Chromium or Gecko engine underneath. The browser fingerprint test checks those pairs.

FAQ

What is the latest iPhone user agent?

Safari on an iPhone with iOS 27 sends Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Mobile/15E148 Safari/604.1. Every iPhone with that Safari version sends exactly this, whatever the model.

Why does my iPhone say iPhone OS 18_7 when it runs iOS 27?

Since iOS 26, Safari writes a frozen iOS version, 18_7, instead of the real one. The real major version is in Version/ (Safari 27 comes with iOS 27). Firefox for iOS copies the frozen value; Chrome for iOS does not and still writes the real one.

What is CriOS in a user agent?

It is Chrome on iOS. Chrome on iPhone sends Mozilla/5.0 (iPhone; CPU iPhone OS 27_0_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/156.0.8078.33 Mobile/15E148 Safari/604.1: the full Chrome version after CriOS/ and the device's real iOS version, on Apple's WebKit engine rather than Chrome's own.

Why do all iPhone browsers say AppleWebKit and Safari?

Because they all run on WebKit, the engine Apple requires browsers on iOS to use (the EU has allowed other engines since iOS 17.4; the strings on this page are those of the WebKit-based apps). Chrome, Firefox and Edge add their own token to Safari's string; the engine underneath, and what it can do, is Safari's.

Does any iPhone browser send Client Hints?

No. WebKit ships without User-Agent Client Hints, so Safari, Chrome, Firefox and Edge on iOS send no Sec-CH-UA headers and have no navigator.userAgentData. A request that claims to be an iPhone and carries Sec-CH-UA came from a Chromium browser on another system.

What does Mobile/15E148 mean?

It is a fixed iOS build number, the same on every iPhone and every iOS version. It no longer says which build you run.

What is the iPad user agent?

By default Safari on iPad asks for desktop websites and sends the Mac string, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Safari/605.1.15. Chrome on iPad, when it asks for desktop sites, sends the Mac string with CriOS/ and its major version, and Firefox on iPad sends a Safari-like Mac string with no FxiOS at all. In a script, navigator.maxTouchPoints above 1 separates an iPad from a Mac.

Clearcote puts this into practice

An open-source Chromium with fingerprint control compiled into the engine. A drop-in for Playwright & Puppeteer.

Free for one browser with GitHub. No card.