iOS 8 web apps
Apple released the iPhone 6 and 6 Plus a few months ago. They also released iOS 8 along with it. Unfortunately they didn’t update their web app documentation at the same time. That leaves the official docs woefully out of date.
Apple has done this in the past. I filled in the gaps for configuring web apps with iOS 7, iOS 6, and iOS 5. This post will do the same for iOS 8. But instead of making you flip between four guides, I’ve put everything here.
This information works for all versions of iOS on all iPhones, iPads, and iPod Touches. Check out my example web app on an iOS device to see the finished product.
Configuration
apple-mobile-web-app-capable
<meta name="apple-mobile-web-app-capable"
content="yes">
This tag allows the page to be run full screen. Note that this only works when it has been added to the home screen.
apple-mobile-web-app-title
<meta name="apple-mobile-web-app-title"
content="iOS Web App">
This tag sets a custom title. If it’s missing, iOS will use the
<title>
tag. If that is missing too, it will default to “Favorites”.
This is limited to about 8 to 12 characters.
apple-mobile-web-app-status-bar-style
<meta name="apple-mobile-web-app-status-bar-style"
content="black">
This tag changes the color of the status bar. There are three
options: default
, black
, and black-translucent
. The best bet
for maximum compatibility is black
; default
and black-translucent
behave differently between iOS 6 and 7. (Sometimes on iOS 7+, the
status bar starts as white-on-white or black-on-black. Restarting
the web app fixes this problem.)
viewport
<meta name="viewport"
content="initial-scale=1">
This tag sets the size of the browser’s viewport. That means it
determines how wide the virtual window is. By setting initial-scale
to 1, the virtual window will be the same size as the physical
device. That makes it the only setting you need here. Other settings,
like device-width
just cause trouble. (In particular, device-width=320
will cause letterboxing on iOS 7+.)
<!-- Only for web apps pretending to be native. -->
<meta name="viewport"
content="initial-scale=1,minimum-scale=1,maximum-scale=1">
If you want to pretend like you’re a native app, set minimum-scale=1
and maximum-scale=1
. Be warned that this means users can’t scale
your app at all.
format-detection
<meta name="format-detection"
content="telephone=no">
This tag prevents Safari from automatically linking phone numbers.
Icons
<!-- iPad retina icon -->
<link href="apple-touch-icon-precomposed-152.png"
sizes="152x152"
rel="apple-touch-icon-precomposed">
<!-- iPad retina icon (iOS < 7) -->
<link href="apple-touch-icon-precomposed-144.png"
sizes="144x144"
rel="apple-touch-icon-precomposed">
<!-- iPad non-retina icon -->
<link href="apple-touch-icon-precomposed-76.png"
sizes="76x76"
rel="apple-touch-icon-precomposed">
<!-- iPad non-retina icon (iOS < 7) -->
<link href="apple-touch-icon-precomposed-72.png"
sizes="72x72"
rel="apple-touch-icon-precomposed">
<!-- iPhone 6 Plus icon -->
<link href="apple-touch-icon-precomposed-180.png"
sizes="120x120"
rel="apple-touch-icon-precomposed">
<!-- iPhone retina icon (iOS < 7) -->
<link href="apple-touch-icon-precomposed-114.png"
sizes="114x114"
rel="apple-touch-icon-precomposed">
<!-- iPhone non-retina icon (iOS < 7) -->
<link href="apple-touch-icon-precomposed-57.png"
sizes="57x57"
rel="apple-touch-icon-precomposed">
You’ll need seven icon sizes:
- 152x152 (76@2x) for iPad retina on iOS 7+
- 144x144 (72@2x) for iPad retina on iOS 6
- 76x76 for iPad on iOS 7+
- 72x72 for iPad on iOS 6
- 180x180 (60@3x) for iPhone 6 Plus
- 144x144 (57@2x) for iPhone retina on iOS 6
- 57x57 for iPhone on iOS 6
There are two icon sizes you might think you need but actually don’t:
- 120x120 (60@x) for iPhone retina on iOS 7+: There’s no way to tell this apart from the 60@3x icon for the iPhone 6 Plus.
- 60x60 for iPhone on iOS 7+: There are no devices that support this combination.
If you set the rel
to apple-touch-icon
instead of
apple-touch-icon-precomposed
, iOS 6 will apply a glossy icon
finish. For consistency with iOS 7+, use precomposed icons.
By default, the icon is a screenshot of the page. If there are no icon tags, Safari will try the following URLs:
/apple-touch-icon-180x180-precomposed.png
/apple-touch-icon-180x180.png
/apple-touch-icon-precomposed.png
/apple-touch-icon.png
The exact dimensions will depend on the device.
Startup images
<!-- iPad retina portrait startup image -->
<link href="apple-touch-startup-image-1536x2008.png"
media="(device-width: 768px) and (device-height: 1024px)
and (-webkit-device-pixel-ratio: 2)
and (orientation: portrait)"
rel="apple-touch-startup-image">
<!-- iPad retina landscape startup image -->
<link href="apple-touch-startup-image-1496x2048.png"
media="(device-width: 768px) and (device-height: 1024px)
and (-webkit-device-pixel-ratio: 2)
and (orientation: landscape)"
rel="apple-touch-startup-image">
<!-- iPad non-retina portrait startup image -->
<link href="apple-touch-startup-image-768x1004.png"
media="(device-width: 768px) and (device-height: 1024px)
and (-webkit-device-pixel-ratio: 1)
and (orientation: portrait)"
rel="apple-touch-startup-image">
<!-- iPad non-retina landscape startup image -->
<link href="apple-touch-startup-image-748x1024.png"
media="(device-width: 768px) and (device-height: 1024px)
and (-webkit-device-pixel-ratio: 1)
and (orientation: landscape)"
rel="apple-touch-startup-image">
<!-- iPhone 6 Plus portrait startup image -->
<link href="apple-touch-startup-image-1242x2148.png"
media="(device-width: 414px) and (device-height: 736px)
and (-webkit-device-pixel-ratio: 3)
and (orientation: portrait)"
rel="apple-touch-startup-image">
<!-- iPhone 6 Plus landscape startup image -->
<link href="apple-touch-startup-image-1182x2208.png"
media="(device-width: 414px) and (device-height: 736px)
and (-webkit-device-pixel-ratio: 3)
and (orientation: landscape)"
rel="apple-touch-startup-image">
<!-- iPhone 6 startup image -->
<link href="apple-touch-startup-image-750x1294.png"
media="(device-width: 375px) and (device-height: 667px)
and (-webkit-device-pixel-ratio: 2)"
rel="apple-touch-startup-image">
<!-- iPhone 5 startup image -->
<link href="apple-touch-startup-image-640x1096.png"
media="(device-width: 320px) and (device-height: 568px)
and (-webkit-device-pixel-ratio: 2)"
rel="apple-touch-startup-image">
<!-- iPhone < 5 retina startup image -->
<link href="apple-touch-startup-image-640x920.png"
media="(device-width: 320px) and (device-height: 480px)
and (-webkit-device-pixel-ratio: 2)"
rel="apple-touch-startup-image">
<!-- iPhone < 5 non-retina startup image -->
<link href="apple-touch-startup-image-320x460.png"
media="(device-width: 320px) and (device-height: 480px)
and (-webkit-device-pixel-ratio: 1)"
rel="apple-touch-startup-image">
You’ll need ten startup image sizes:
- 1536x2008 (768x1004@2x) for iPad retina portrait
- 1496x2048 (748x1024@2x) for iPad retina landscape
- 768x1004 for iPad portrait
- 748x1024 for iPad landscape
- 1242x2148 (414x716@3x) for iPhone 6 Plus portrait
- 1182x2208 (394x736@3x) for iPhone 6 Plus landscape
- 750x1294 (375x647@2x) for iPhone 6
- 640x1096 (320x548@2x) for iPhone 5
- 640x920 (320x460@2x) for iPhone retina
- 320x460 for iPhone
Note that you only need portrait and landscape images for iPads and the iPhone 6 Plus. All other iPhones only start web apps in portrait.
In order for these to work, your web app must be
apple-mobile-web-app-capable
. They will only show up when launching
your web app from the home screen.
Unlike icons, startup images don’t have a default. If you don’t provide one, the screen will be plain white. And Safari doesn’t try anything automatically. You have to add the meta tags.
Landscape images aren’t actually in landscape; they’re taller than they are wide. They should be rotated 90 degrees clockwise from their correct orientation.
On iOS 7+, startup images are stretched when the app launches. On iOS 7, the image pops under the status bar once the app loads. Unfortunately there’s no way to provide a startup image with the correct dimensions. It will always be stretched on iOS 7+.
That being said, startup images must be the exact resolution listed here. Safari will not perform any scaling.
Hacks
<style>
html {
-webkit-text-size-adjust: 100%;
}
</style>
This style prevents fonts from getting bigger when rotating to landscape.