Chrome in Android and Desktop supports "beforeinstallpromp" event which is can show up add to homescreen banner. I'm try to use the same javascript code for my PWA in iOS but it is doesn't work.
/**
* Clear caches
*/
function pwaClearCaches()
{
//Clear caches
caches.keys().then(function(names) {
for (let name of names) {
caches.delete(name);
}
});
}
var pwa_app_installed = false; //PWA is already installed
var deferredPrompt; //Link to show dialog event
$(document).ready(function(){
if (window.location.protocol === 'http:') { //Если это HTTP протокол, а не HTTPS
console.log(lang.t('You need HTTPS for work'));
}
if ('serviceWorker' in navigator) {
/**
* Подвешиваемся на переключение режима правки, чтобы сразу очистить кэш
*/
$('.debug-mode-switcher').on('click', function () {
if (!$('.debug-mode-switcher .toggle-switch').hasClass('on')) {
//Delete service worker
navigator.serviceWorker.getRegistrations().then(function (registrations) {
for (let registration of registrations) {
registration.unregister();
}
});
//Clear caches
pwaClearCaches();
}
});
}
if ($.cookie('update_pwa_cache')){ //Update cache if we have cookie на обновление
pwaClearCaches();
$.cookie('update_pwa_cache', '', {expires: -1});
}
/**
* Close window with prompt
*/
function closePWAInstallWindow()
{
$("#pwaInstall").hide();
$.cookie('not_show_pwa', '1');
}
let body = $('body');
/**
* Add to homescreen event
*/
body.on('click', '#pwaAddToHomeScreen', function(){
deferredPrompt.prompt(); // Show alert to install
deferredPrompt.userChoice.then((choiceResult) => {//Wait for user choose
if (choiceResult.outcome === 'accepted') { //Accept install
closePWAInstallWindow();
} else { //Cansel install
closePWAInstallWindow();
}
deferredPrompt = null;
});
return false;
});
/**
* Close intalll window
*/
body.on('click', '#pwaCloseInstall', function(){
closePWAInstallWindow();
return false;
});
});
console.log('out');
//If we not in webapp and no session that we need to install
if (!(window.matchMedia('(display-mode: standalone)').matches) && !$.cookie('not_show_pwa')) {
/**
* Event that app is installed
*/
$(window).on('appinstalled', (evt) => {
pwa_app_installed = true;
});
console.log('not fired');
/**
* Event beforeinstallprompt from browser
*/
$(window).on('beforeinstallprompt', (e) => {
// Prevent Chrome 67 and earlier from automatically showing the prompt
e.preventDefault();
// Stash the event so it can be triggered later.
deferredPrompt = e.originalEvent;
console.log('fired');
var is_mobile_android = false;
var ua = navigator.userAgent;
if (/Android/i.test(ua) && /Chrome/i.test(ua)){ //If we in Android and it is Chrome prevent native window
is_mobile_android = true;
}
if (!pwa_app_installed && !is_mobile_android){
let body = $('body');
body.append('<div id="pwaInstall" class="pwaInstall" style="background-color: #fff">' +
'<div class="content">Please install our app</div><div class="links">' +
'<a href="#" id="pwaAddToHomeScreen" style="background-color: #fff; color: #000;">Add to homescreen</a>' +
'<a href="#" id="pwaCloseInstall" style="background-color: yellow; color: black;">No Thanks</a>' +
'</div>' +
'</div>');
setTimeout(function () { //Show our banner
$("#pwaInstall").addClass('show');
}, 100);
}
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
And I have manifest.json
{
"short_name": "VaporStore",
"name": "VaporStore & FreeVape",
"description": "Магазин свободного пара",
"icons": [
{
"src": "/storage/system/resized/xy_64x64/0f08cd435767735a778ea63fea5b5efd_e2f1b76.png",
"type": "image/png",
"sizes": "64x64"
},
{
"src": "/storage/system/resized/xy_128x128/0f08cd435767735a778ea63fea5b5efd_b510eb77.png",
"type": "image/png",
"sizes": "128x128"
},
{
"src": "/storage/system/original/0f08cd435767735a778ea63fea5b5efd.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "/storage/system/original/272d68dfbb5e80ef67f6c7abcb2391cb.png",
"type": "image/png",
"sizes": "512x512"
}
],
"background_color": "#ffffff",
"theme_color": "#ff9800",
"display": "standalone",
"orientation": "portrait",
"start_url": "/",
"scope": "/"
}
And I have service worker based on workbox from Google.
Does iOS support the "beforeinstallpromp" event or not? On Android and Desktop chrome works fine.
Update 04.04.2019 The most full answer is given here: https://www.youtube.com/watch?v=s5ASNwnBttQ
from the clip: "iOS 12.2 does not support beforeinstallprompt" (mention is made of add to home screen behavior via 'Share Screen')
The BeforeInstallPromptEvent is the interface of the beforeinstallprompt event fired at the Window object before a user is prompted to "install" a website to a home screen on mobile.
The beforeinstallprompt event fires on devices when a user is about to be prompted to "install" a web application. It may be saved for later and used to prompt the user at a more suitable time.
Check if your PWA is installed #getInstalledRelatedApps() from within the scope of your PWA to check if it is installed. If getInstalledRelatedApps() is called outside the scope of your PWA, it will return false.
beforeinstallprompt is not available in iOS Safari
See list at the bottom of this page
https://developer.mozilla.org/en-US/docs/Web/API/BeforeInstallPromptEvent
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With