当前位置: 首页 > 面试题库 >

在Android和iOS上以独立模式运行的node.js中部署的PWA

洪伟彦
2023-03-14
问题内容

我正在尝试在Android和iOS上以独立模式实现PWA。我有一个安全的node.js服务器(HTTPS),一切似乎都正常运行(index.html,manifest.json,serviceWorker.js等)。

该应用程序可以从Chrome正常运行,并且可以添加到主屏幕并在PC上以独立模式运行。它也可以在iOS(Safari)上以独立模式运行,但在Android(Chrome)上则无法运行。

因此,我测试了三种不同的PWA:使用ionicPWA的基本示例,angularPWA的另一个示例,然后使用自己的PWA。行为是相同的,如果我在Firebase之类的服务器上部署应用程序,则这些应用程序可以在iOS和Android上以独立模式运行。但是,如果我在node.js服务器部署应用程序,则该应用程序只能在iOS上以独立模式运行,而不能在Android上运行。

我已经在Android 8.1.0、7.0.0和6.0.0的Chrome
v67.0.3396.87的不同Android设备上进行了测试。PWA仅在浏览器模式下打开。

这可能是Chrome-v67的错误吗?还是服务器的某些配置会影响Android上的Chrome行为?

有任何想法吗?

UPDATE1: index.html,manifest.json,seviceWorker(sw.js)和使用Chrome
devTools进行审核

index.html(头)

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">

        <!--title-->
        <title>PWA Test</title>

        <!--icon-->
        <link rel="shortcut icon" type="image/png" href="img/favicon.png"></link>

        <!--color-->
        <meta name="theme-color" content="#FB314E">

        <!--for mobile-->
        <meta name="MobileOptimized" content="width">
        <meta name="HandheldFriendly" content="true">

        <!--for Apple devices-->
        <meta name="apple-mobile-web-app-capable" content="yes">
        <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
        <link rel="apple-touch-icon" href="img/favicon.png"></link>
        <link rel="apple-touch-startup-image" href="img/favicon.png"></link>

        <!-- pwa configuration-->
        <link rel="manifest" href="manifest.json"></link>


        <!--style-->
        <link rel="stylesheet" href="css/styles.css"></link>

        <!--jQuery-->
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>


        <!--Scripts-->
        <script src="main.js"></script>

</head>

manifest.json

{   
        "name": "PWA 3002 Test",
        "short_name": "PWA 3002",
        "description": "PWA aplication",
        "background_color": "#FFF",
        "theme_color": "#FB314E",
        "orientation": "portrait",
        "display": "standalone",
        "start_url": "./index.html?utm_source=web_app_manifest",
        "scope": "./",
        "lang": "es-ES",
        "icons": [
            {
                "src": "./img/favicon-1024.png",
                "sizes": "1024x1024",
                "type": "image/png"
            },
            {
                "src": "./img/favicon-512.png",
                "sizes": "512x512",
                "type": "image/png"
            },
            {
                "src": "./img/favicon-384.png",
                "sizes": "384x384",
                "type": "image/png"
            },
            {
                "src": "./img/favicon-256.png",
                "sizes": "256x256",
                "type": "image/png"
            },
            {
                "src": "./img/favicon-192.png",
                "sizes": "192x192",
                "type": "image/png"
            },
            {
                "src": "./img/favicon-128.png",
                "sizes": "128x128",
                "type": "image/png"
            },
            {
                "src": "./img/favicon-96.png",
                "sizes": "96x96",
                "type": "image/png"
            },
            {
                "src": "./img/favicon-32.png",
                "sizes": "32x32",
                "type": "image/png"
            },
            {
                "src": "./img/favicon-16.png",
                "sizes": "16x16",
                "type": "image/png"
            }
        ] 
}

sw.js(服务人员)

    // name and version of cache
    const CACHE_NAME = 'v1_cache_pwa';

    // for cache

    var urlsToCache = [
        './',
        './css/styles.css',
        './img/favicon.png',
        './img/1.png',
        './img/2.png',
        './img/3.png',
        './img/4.png',
        './img/5.png',
        './img/6.png',
        './img/favicon-1024.png',
        './img/favicon-512.png',
        './img/favicon-384.png',
        './img/favicon-256.png',
        './img/favicon-192.png',
        './img/favicon-128.png',
        './img/favicon-96.png',
        './img/favicon-64.png',
        './img/favicon-32.png',
        './img/favicon-16.png'
    ];

    // install event

    self.addEventListener('install', e => {
        e.waitUntil(
            caches.open(CACHE_NAME)
                    .then(cache => {
                        return cache.addAll(urlsToCache)
                                    .then(() =>{
                                        self.skipWaiting();
                                    });

                    })
                    .catch(err => {
                        console.log('No se ha registrado el cache', err);
                    })
        );
    });

    // activate event

    self.addEventListener('activate', e => {
        const cacheWhiteList = [CACHE_NAME];

        e.waitUntil(
            caches.keys()
                    .then(cacheNames => {
                        return Promise.all(
                            cacheNames.map(cacheName => {

                                if(cacheWhiteList.indexOf(cacheName) === -1){
                                    // Borrar elementos que no se necesitan
                                    return caches.delete(cacheName);

                                }
                            })

                        );
                    })
                    .then(() => {
                        //Activar cache
                        self.clients.claim();
                    })

        );
    });


    // fetch event

    self.addEventListener('fetch', function(event) {
        event.respondWith(
          caches.match(event.request).then(function(response) {
            return response || fetch(event.request);
          })
        );
      });

Chrome DevTools审核(在PC上)

测试三个应用程序(ionicPWA示例,angularPWA示例,我自己的PWA):

  • 使用ionicPWA,控制台中会出现两个warngins:

  • vendor.js:1:本机:尝试调用StatusBar.styleDefault,但Cordova不可用。确保包含cordova.js或在设备/模拟器E中运行

  • DevTools无法解析SourceMap:https ://xxx.xxx.xxx/build/sw-toolbox.js.map (index):28已安装服务工作者

  • 使用AngularPWA时,不会出现任何消​​息/错误/警告…

  • 与我自己的PWA应用程序相同的行为.. PC上的Chrome devTools控制台中未显示任何消息/错误/警告


问题答案:

我已经解决了问题。一位同事告诉我,问题可能出在服务器上配置的端口。我已经配置了服务器node.js在特定端口(https://
mydomain:xxxx
)上侦听,而不是在默认端口(443)上侦听,由于某种原因,这导致PWA应用程序无法在Android上以独立模式运行。我将服务器设置为默认端口“
443”,并且PWA应用程序已在Android和iOS的独立模式下正常运行。谢谢大家。



 类似资料:
  • 我已经在我的本地安装了mesos,并按照mesos设置中提到的进行了配置。现在我想在本地机器上安装的mesos上运行spark。我已经根据官方文档配置了spark,并在我的本地机器上运行了单节点hadoop集群。Spark二进制包被复制到hdfs根目录,我已经在spark-env.sh中设置了以下属性: 是Spark-Defaults.conf:

  • 我实现了一个Scalatra servlet,现在想要创建一个可执行的jar,就像本教程中所描述的那样:http://www.scalatra.org/2.2/guides/deployment/standalone.html 我使用IntelliJ IDEA和Scala插件进行开发,并使用sbt来构建和运行我的servlet(我使用sbt-想法来生成项目文件)。我的问题是,当我尝试编译我的项目时

  • 独立部署即为在后端运行程序,让程序跑在后台。 linux 在 linux 下面部署,我们可以利用 nohup 命令,把应用部署在后端,如下所示: nohup ./beepkg & 这样你的应用就跑在了 Linux 系统的守护进程 Windows 在 Windows 系统中,设置开机自动,后台运行,有如下几种方式: 制作 bat 文件,放在“启动”里面 制作成服务

  • 我试图在liferay tomcat版本中部署一个简单的独立war文件。它既不是portlet,也不是主题。如何在liferay tomcat中将war文件配置为独立的war。 我有以下错误 16:45:51,175错误[localhost-1][HotDeployImpl: 211]com.liferay.portal.kernel.deploy.hot.HotDeployExc0019:错误注

  • 我正在尝试使用Spring mvc创建一个java web应用程序。此应用程序的目的是为企业中不同业务部门的不同用户组提供服务。举个例子,如果你认为它是一种购物体验类的应用程序,那么这个应用程序在功能上是关于 挑选你想要的 然后,我需要列出管道部门的管道项目,电气部门的电气项目等等。 所以,我决定使用两个具有相同表结构的不同模式。所以模式“PLUMB”将存储可以使用应用程序的管道部门用户,以及与管

  • 问题内容: 提出的每个选项都有一个问题: 我想在普通设备上运行它,所以我希望避免在设备上安装其他操作系统 上个月停止了对JXCore的工作,并且(可能是结果)我无法对其进行编译 自2014年以来就没有开发过NodeJs Anode的Android Port,而且当时并没有真正维护它 我链接到的第二个线程中的第二个答案现在提到了Android的官方节点发行版,但是除了指向最新dist的Browse-