提问人:Angled 提问时间:11/3/2023 更新时间:11/3/2023 访问量:20
share_target似乎被忽略或未执行
share_target seems to be ignored or not executed
问:
我尝试使用 share_target 创建一个 PWA,我可以在其中共享链接和文本。但出于某种原因,share_target似乎不起作用。PWA 安装正常。没有错误。在 Windows PC 上使用 Edge 安装后,我尝试从浏览器共享链接或 URL,我还获取了已安装的 PWA 作为共享目标的建议。如果我选择此选项,PWA 将启动。但是,不使用操作的 URL,而是仅调用start_url。不会向start_url追加任何参数。
manifest.json:
{
"short_name": "TestPWA",
"name": "TestPWA",",
"id": "TestPWA",
"display": "standalone",
"orientation": "portrait-primary",
"start_url": "./",
"share_target": {
"action": "testaction",
"method": "POST",
"enctype": "application/x-www-form-urlencoded",
"params": {
"title": "title",
"text": "text",
"url": "url"
}
}
}
SW.js:
const CACHE_NAME = 'TestPWA-v1';
const urlsToCache = [
'sw.js',
'images/test.ico',
'images/test.png',
'css/test.css',
];
self.addEventListener('install', event => {
skipWaiting();
event.waitUntil(
caches.open(CACHE_NAME).then(function(cache) {
console.log('Opened cache');
return cache.addAll(urlsToCache);
})
);
console.log('worker installed');
});
self.addEventListener('activate', event => {
var cacheWhitelist = ['TestPWA'];
clients.claim();
event.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (cacheWhitelist.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
);
})
);
console.log('worker activated');
});
self.addEventListener('fetch', event => {
console.log(event.request.method);
console.log(event.request.url);
event.respondWith(
caches.match(event.request).then(function(response) {
if (response) {
return response;
}
return fetch(event.request);
})
);
});
self.addEventListener('push', event => {
let notification = event.data.json();
event.waitUntil(
self.registration.showNotification(notification.title, {
body: notification.url,
icon: './images/test.png',
requireInteraction: true
}),
);
});
self.addEventListener('notificationclick', (event) => {
event.notification.close();
event.waitUntil(clients.matchAll({
type: "window",
}).then((clientList) => {
for (const client of clientList) {
if (client.url === event.notification.body && "focus" in client) return client.focus();
}
if (clients.openWindow) return clients.openWindow(event.notification.body);
}))
});
用于加载 Service Worker 的 JavaScript:
window.addEventListener("DOMContentLoaded", function() {
const parsedUrl = new URL(window.location);
console.log('Title shared: ' + parsedUrl.searchParams.get('title'));
console.log('Text shared: ' + parsedUrl.searchParams.get('text'));
console.log('URL shared: ' + parsedUrl.searchParams.get('url'));
if ("serviceWorker" in navigator) {
navigator.serviceWorker.register("smsw.js").then(
registration => {
console.log("worker registered", registration);
},
error => {
console.error(`worker registration failed: ${error}`);
},
);
} else {
console.error("workers are not supported");
}
}
有关注册和激活的控制台输出很好。Dev Console 上没有错误。在 fetch 函数中,我尝试查找,如果请求来自 share_target,但没有,我只看到“GET”作为开发控制台上的输出,没有“POST”,也没有“testaction”。
我需要一些帮助来找到问题所在。
答: 暂无答案
评论