我一直在创建新项目PWA。 当我开发不使用节点js(socket.io运行)只是在线下运行时,就像我期望和需要的那样。
但与nodejs服务器集成时。当上网时,运行良好的应用程序没有任何问题。但是当我更改为离线模式时,我的服务工作没有运行,而是显示离线浏览器。
这是我的代码节点js server:
HashMap<String, String> postDataParams=new HashMap<>();
postDataParams.put("u_phone",CN);
postDataParams.put("u_code",st);
postDataParams.put("device_flag",mob_device);
postDataParams.put("app_type","PRO");
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
HostnameVerifier hv =
HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify("companyname.com", session);
}
};
try{
URL url = new URL("https://www.appname.com/sync/validatecheck.php");
HttpsURLConnection urlConnection =
(HttpsURLConnection)url.openConnection();
//urlConnection.setHostnameVerifier(hostnameVerifier);
urlConnection.setReadTimeout(10000);
urlConnection.setConnectTimeout(15000);
urlConnection.setRequestMethod("POST");
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
OutputStream os = urlConnection.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
int responseCode=urlConnection.getResponseCode();
if (responseCode == HttpsURLConnection.HTTP_OK) {
String line;
BufferedReader br=new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
while ((line=br.readLine()) != null) {
result+=line;
}
}
else {
result="";
}
} catch (Exception e) {
Log.e("log_tag", "Error in http connection "+e.toString());
}
这是我在索引js
中的服务注册
var express = require('express');
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var cors = require('cors');
app.use(cors());
app.use(express.static(__dirname + '/'));
app.use(function(req, res, next){
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
res.header('Access-Control-Allow-Headers', 'Content-Type');
next();
});
io.on('connection', function(socket) {
console.log('new connection');
socket.on('afterBid', function(data) {
io.emit('bcCurrentBid', {
current_bidding: data.auction_current_bidding,
user_id_dominated: data.user_id_dominated
});
});
});
server.listen(9991, function() {
console.log('server up and running at 2205 port');
});
这是我的service-worker.js文件:
if ('serviceWorker' in navigator && 'PushManager' in window) {
console.log('Service Worker and Push is supported');
window.addEventListener('load', function() {
navigator.serviceWorker
.register('./service-worker.js')
.then(function() { console.log('Service Worker Registered'); });
});
}
谢谢也许有人可以给我解决方案
答案 0 :(得分:2)
我在这里发布了一个类似的问题并得到了答案: Service Worker not working in Offline mode with node js server
要做到简短,请记住服务工作者的范围是它自己的目录和下面的文件夹......并且它无法访问您的lib或app目录...
更详细地说,这意味着如果您的内容从https://example.com/
开始,则您的服务工作人员必须住在https://example.com/service-worker.js
。如果你把它设为https://example.com/js/service-worker.js
,它就不会起作用。
答案 1 :(得分:1)
服务工作者只是从您的网络服务器提供的javascript文件。它是不是node.js并不重要。
您是否检查了chrome调试工具中的“应用程序”选项卡,以查看是否已加载服务工作者?如果是,请分享您的'service-worker.js'文件的代码。 您还可以在注册服务工作者时添加“catch”部分。如果无法加载服务工作者,这可能会显示正在发生的事情。
window.addEventListener('load', function() {
navigator.serviceWorker
.register('./service-worker.js')
.then(function() { console.log('Service Worker Registered'); })
.catch(function (err) {
console.log('ServiceWorker registration failed: ', err);
});
});