silviolleite / laravelpwa
看起来像应用,感觉像应用,但**不是**应用。
2.0.3
2020-08-20 12:19 UTC
README
这个Laravel包可以将您的项目转换为一个渐进式Web应用。在Android手机上访问您的网站会提示您将应用添加到主屏幕。
从主屏幕启动应用会显示您的应用。因此,您的应用程序必须在HTML中提供所有导航(不依赖浏览器的后退或前进按钮)。
也请查看Laravel PWA演示
要求
渐进式Web应用需要HTTPS(除非从localhost提供服务)。如果您还没有在您的网站上使用HTTPS,请查看Let's Encrypt和ZeroSSL。
安装
将以下内容添加到您的 composer.json
文件
"require": { "silviolleite/laravelpwa": "~2.0.3", },
或执行
composer require silviolleite/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应用是否正确配置。
- 使用“添加到主屏幕”链接在应用选项卡上验证您是否可以成功添加应用。
Service Worker
默认情况下,此应用实现的service worker是
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'); }) ) });
要自定义service worker功能,更新 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
要自定义,更新此文件。
贡献
贡献很简单!只需复制仓库,进行更改,然后在GitHub上发送pull request。如果您的PR在队列中停滞不前,似乎没有动静,那么请给Silvio发送电子邮件。