iPhone WebApps, is there a way to detect how it was loaded? Home Screen vs Safari?
Asked Answered
A

8

28

I have an iPhone Web App, and I'm interested in detecting if the app was loaded either from:

  1. iPhone Safari
  2. iPhone installed web app (via the add to my home screen) which loads without the safari bars.

Any ideas?

Agenesis answered 29/4, 2010 at 15:54 Comment(0)
S
70

You can determine whether a webpage is displayed in full-screen mode using the window.navigator.standalone read-only Boolean JavaScript property. https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html

if (window.navigator.standalone) {
    // fullscreen mode

}
Security answered 29/4, 2010 at 17:20 Comment(2)
Freakin' awesome! I had no idea I could do this.Fleeting
I literally just laughed and high-fived myself. This is so much better than UA sniffing. Thank you!Casper
C
11

You can detect the mode via Javascript as described above - or you can use PHP and the user agent.

<?
if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']),"iphone")) {
   if (strpos(strtolower($_SERVER['HTTP_USER_AGENT']),"safari")) {
      echo('Running in browser on iPhone');
   }else{
      echo('Running as stand alone WebApp on iPhone');
   }
}else{
   echo('Running on device other than iPhone.');
}
?>

Enjoy!

Clodhopper answered 3/2, 2011 at 11:56 Comment(0)
W
4

This is what I use, works great:

if (window.navigator.userAgent.indexOf('iPhone') != -1) {
    if (window.navigator.standalone == true) {
        alert("Yes iPhone! Yes Full Screen!");
    } else {
        alert("Not Full Screen!");
    };} else {
        alert("Not iPhone!");
        document.location.href = 'please-open-from-an-iphone.html';
};
Writhen answered 30/11, 2011 at 11:40 Comment(0)
A
2

How to do it with PHP and filter false positives

I think that @strat 's answer is in the right direction, if you want to use PHP. Except that it won't work unless the mobile app capable meta is set. Otherwise the iPhone will place in home a bookmark opening mobile safari. Also, it returned false positives, for example when accessing the page from any other browser on iPhone, like the Facebook browser.

Luckily, the standalone user agent string has a particularity: it only has 3 slashes in it. I tested various other browsers and they all have more than 3. It's hackish, but we can use this at our advantage. Also, it's interesting to note that a standard webview in a app will have 2 slashes.

So this is the minimum working example:

<?php
// We need to add the mobile web app capable meta. Status bar is set to black to avoid our text go under the status bar.
?>

<html>
<head>
  <meta name="apple-mobile-web-app-capable" content="yes">
  <meta name="apple-mobile-web-app-status-bar-style" content="black">
</head>
<body>


<?php

$ua = strtolower($_SERVER['HTTP_USER_AGENT']);

if ( strpos($ua,"iphone") || strpos($ua,"ipad") ) {
   if ( strpos($ua,"safari") ) {
      echo('Running in safari on iPhone/iPad');
   } else if ( substr_count($ua, '/') === 3 ) {
      echo('Running as stand alone WebApp on iPhone/iPad');
   } else if ( substr_count($ua, '/') === 2 ) {
      echo('Running in a WebView on a iPhone/iPad app');
   } else {
      echo('Running in another browser on iPhone/iPad');
   }
} else {
   echo('Running on device other than iPhone/iPad.');
}

?>

</body>
</html>
Apologize answered 24/12, 2013 at 9:9 Comment(0)
O
1

I'm not sure how far back this behavior goes, but iOS will present different UserAgent strings to the server which can be used to detect if the page is being requested by a webapp or safari browser.

Safari Browser

Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B436 Safari/600.1.4

Home Screen Button/Web App

Mozilla/5.0 (iPhone; CPU iPhone OS 8_1_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Mobile/12B436

Notice it does not include 'Safari' in the UserAgent. I've confirmed that this behavior goes back to at least iOS 7, but I'd imagine even further.

So you can test for the presence of iPhone or iPad in the UserAgent string and lack of Safari to detect that it's been opened from the Home screen.

Oxus answered 5/12, 2014 at 6:55 Comment(0)
P
0

I prefer this one-liner to determine whether it's fullscreen/in a web app or not.

var webApp = (typeof window.navigator.standalone != 'undefined' && window.navigator.standalone ? true : false);
Porky answered 19/3, 2014 at 12:27 Comment(0)
K
-1

Check the HTTP-Headers when accessing the site from iPhone Safari and the WebApp to see if they are different.

I don't know if they are, but if they are, I'm sure you'll be able to implement that somewhere in your website.

http://php.net/manual/en/function.headers-list.php

Kinshasa answered 29/4, 2010 at 17:18 Comment(0)
U
-1

Can be simplified to var webApp = window.navigator.standalone || false;

Can be simplified again to var webApp = window.navigator.standalone;

Upbuild answered 15/9, 2015 at 14:42 Comment(1)
your second "simplification" actually breaks it, since .standalone is a property only existing on Apple's iOS SafariCarse

© 2022 - 2024 — McMap. All rights reserved.