iroid / laravelpwa
看起来像应用,感觉像应用,但并非应用。
dev-main
2024-02-21 06:09 UTC
This package is auto-updated.
Last update: 2024-09-21 07:26:50 UTC
README
这个Laravel包将您的项目转换为渐进式Web应用。在安卓手机上访问您的网站时,会提示您将应用添加到主屏幕。
从主屏幕启动应用会显示您的应用。因此,确保您的应用在HTML中提供所有导航(不依赖浏览器的前进或后退按钮)至关重要。
要求
渐进式Web应用需要HTTPS(除非从localhost提供服务)。如果您尚未在网站上使用HTTPS,请查看Let's Encrypt和ZeroSSL。
安装
将以下内容添加到您的composer.json
文件中
"require": { "iroid/laravelpwa": "*", },
或执行
composer require iroid/laravelpwa --prefer-dist
发布
$ php artisan vendor:publish --provider="LaravelPWA\Providers\LaravelPWAServiceProvider"
配置
在config/laravelpwa.php
中配置您的应用名称、描述、图标和启动画面。
'manifest' => [ 'name' => env('APP_NAME', 'My PWA App'), 'short_name' => 'PWA', 'start_url' => '/', 'background_color' => '#ffffff', 'theme_color' => '#000000', 'display' => 'standalone', 'orientation' => 'any', 'status_bar' => 'black', 'icons' => [ '72x72' => [ 'path' => '/images/icons/icon-72x72.png', 'purpose' => 'any' ], '96x96' => [ 'path' => '/images/icons/icon-96x96.png', 'purpose' => 'any' ], '128x128' => [ 'path' => '/images/icons/icon-128x128.png', 'purpose' => 'any' ], '144x144' => [ 'path' => '/images/icons/icon-144x144.png', 'purpose' => 'any' ], '152x152' => [ 'path' => '/images/icons/icon-152x152.png', 'purpose' => 'any' ], '192x192' => [ 'path' => '/images/icons/icon-192x192.png', 'purpose' => 'any' ], '384x384' => [ 'path' => '/images/icons/icon-384x384.png', 'purpose' => 'any' ], '512x512' => [ 'path' => '/images/icons/icon-512x512.png', 'purpose' => 'any' ], ], 'splash' => [ '640x1136' => '/images/icons/splash-640x1136.png', '750x1334' => '/images/icons/splash-750x1334.png', '828x1792' => '/images/icons/splash-828x1792.png', '1125x2436' => '/images/icons/splash-1125x2436.png', '1242x2208' => '/images/icons/splash-1242x2208.png', '1242x2688' => '/images/icons/splash-1242x2688.png', '1536x2048' => '/images/icons/splash-1536x2048.png', '1668x2224' => '/images/icons/splash-1668x2224.png', '1668x2388' => '/images/icons/splash-1668x2388.png', '2048x2732' => '/images/icons/splash-2048x2732.png', ], 'shortcuts' => [ [ 'name' => 'Shortcut Link 1', 'description' => 'Shortcut Link 1 Description', 'url' => '/shortcutlink1', 'icons' => [ "src" => "/images/icons/icon-72x72.png", "purpose" => "any" ] ], [ 'name' => 'Shortcut Link 2', 'description' => 'Shortcut Link 2 Description', 'url' => '/shortcutlink2' ] ], 'custom' => [] ]
您可以通过数组的键指定每个图标的尺寸,或指定其尺寸
[
'path' => '/images/icons/icon-512x512.png',
'sizes' => '512x512',
'purpose' => 'any'
],
注意:在custom
标签中,您可以在manifest.json
中插入个性化标签,例如:
... 'custom' => [ 'tag_name' => 'tag_value', 'tag_name2' => 'tag_value2', ... ] ...
在您的<head>
中包含blade指令@laravelPWA
。
<html> <head> <title>My Title</title> ... @laravelPWA </head> <body> ... My content ... </body> </html>
这应包括适当的meta标签、指向manifest.json
的链接和service worker脚本。
如本例所示
<!-- Web Application Manifest --> <link rel="manifest" href="/manifest.json"> <!-- Chrome for Android theme color --> <meta name="theme-color" content="#000000"> <!-- Add to homescreen for Chrome on Android --> <meta name="mobile-web-app-capable" content="yes"> <meta name="application-name" content="PWA"> <link rel="icon" sizes="512x512" href="/images/icons/icon-512x512.png"> <!-- Add to homescreen for Safari on iOS --> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-title" content="PWA"> <link rel="apple-touch-icon" href="/images/icons/icon-512x512.png"> <link href="/images/icons/splash-640x1136.png" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-750x1334.png" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-1242x2208.png" media="(device-width: 621px) and (device-height: 1104px) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-1125x2436.png" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-828x1792.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-1242x2688.png" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-1536x2048.png" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-1668x2224.png" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-1668x2388.png" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" /> <link href="/images/icons/splash-2048x2732.png" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image" /> <!-- Tile for Win8 --> <meta name="msapplication-TileColor" content="#ffffff"> <meta name="msapplication-TileImage" content="/images/icons/icon-512x512.png"> <script type="text/javascript"> // Initialize the service worker if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/serviceworker.js', { scope: '.' }).then(function (registration) { // Registration was successful console.log('Laravel PWA: ServiceWorker registration successful with scope: ', registration.scope); }, function (err) { // registration failed :( console.log('Laravel PWA: ServiceWorker registration failed: ', err); }); } </script>
故障排除
在运行Laravel测试服务器时
- 验证
/manifest.json
是否正在提供 - 验证
/serviceworker.js
是否正在提供 - 使用Chrome开发者工具中的“应用”选项卡验证渐进式Web应用是否配置正确。
- 使用“添加到主屏幕”链接在“应用”选项卡中验证您是否可以成功添加应用。
服务工作者
默认情况下,该应用实现的服务工作者如下
var staticCacheName = "pwa-v" + new Date().getTime(); var filesToCache = [ '/offline', '/css/app.css', '/js/app.js', '/images/icons/icon-72x72.png', '/images/icons/icon-96x96.png', '/images/icons/icon-128x128.png', '/images/icons/icon-144x144.png', '/images/icons/icon-152x152.png', '/images/icons/icon-192x192.png', '/images/icons/icon-384x384.png', '/images/icons/icon-512x512.png', '/images/icons/splash-640x1136.png', '/images/icons/splash-750x1334.png', '/images/icons/splash-1242x2208.png', '/images/icons/splash-1125x2436.png', '/images/icons/splash-828x1792.png', '/images/icons/splash-1242x2688.png', '/images/icons/splash-1536x2048.png', '/images/icons/splash-1668x2224.png', '/images/icons/splash-1668x2388.png', '/images/icons/splash-2048x2732.png' ]; // Cache on install self.addEventListener("install", event => { this.skipWaiting(); event.waitUntil( caches.open(staticCacheName) .then(cache => { return cache.addAll(filesToCache); }) ) }); // Clear cache on activate self.addEventListener('activate', event => { event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames .filter(cacheName => (cacheName.startsWith("pwa-"))) .filter(cacheName => (cacheName !== staticCacheName)) .map(cacheName => caches.delete(cacheName)) ); }) ); }); // Serve from Cache self.addEventListener("fetch", event => { event.respondWith( caches.match(event.request) .then(response => { return response || fetch(event.request); }) .catch(() => { return caches.match('offline'); }) ) });
要自定义服务工作者功能,更新public_path/serviceworker.js
。
离线视图
默认情况下,离线视图在resources/views/vendor/laravelpwa/offline.blade.php
中实现
@extends('layouts.app') @section('content') <h1>You are currently not connected to any networks.</h1> @endsection
要自定义,请更新此文件。
贡献
有兴趣贡献或修改请联系我们邮箱。