英文:
Prevent PWA service worker to be downloaded, from a different javascript file in wordpress
问题
我猜很多人会认为提出对PWA进行下载限制可能不是一个好的战略思路,但在这个具体项目中,我需要确保用户在下载PWA之前已经注册。
我认为正确的方法是在检测到用户已注册后,自动阻止 'service worker' 的下载,并允许其下载。
我需要从处理它的不同文件中阻止 service worker 注册过程。虽然我在使用WordPress和SuperPWA插件,但我不想改变插件内部的代码。
我想我的目标是以某种方式阻止这个函数:
navigator.serviceWorker.register(superpwa_sw.url)
由于WordPress的规范,似乎PWA插件的 .js 文件在我希望编写阻止函数的文件之前加载。
任何能指引我正确方向的线索都将不胜感激,谢谢!
英文:
I guess that many people will consider that proposing restrictions for a PWA to be downloaded could not be a good strategic idea but in this concrete project I would need to been able to accomplish exactly that.
I would like to be sure that the user has registered before downloading the PWA and I think the way to go would be to automatically prevent 'service worker' to be downloaded and, when detecting user has been registered, allow it to be downloaded.
I would need to block the service worker registering process form a different file that the one that handles it. While I'm using wordpress and SuperPWA plugin I don't want to change code inside the plugin
I supose my goal would be to block somehow this function
navigator.serviceWorker.register(superpwa_sw.url)
Due to the wordpress specifications it seems that the .js files of the PWA plugin is loaded before the file from where I would like to write the blocking function.
Any clue that could point me in the right direction would be very welcome, thanks!
答案1
得分: 1
使用[wp_dequeue_script()][1]函数,您可以在php中阻止PWA的发送。
```php
function no_pwa_unless_logged_in() {
if ( ! is_user_logged_in() ) {
wp_dequeue_script( 'superpwa-register-sw' );
}
}
add_action( 'wp_print_scripts', 'no_pwa_unless_logged_in' );
wp_print_scripts action在将入队的脚本发送到浏览器页面之前触发。此代码从队列中移除了PWA脚本。
这是一个不错的方法:它不会允许PWA脚本传送到未登录的访问者,因此这些访问者将无法访问它。
<details>
<summary>英文:</summary>
You can probably prevent the sendout of the PWA in php, in a little bit of code, with [wp_dequeue_script()][1].
```php
function no_pwa_unless_logged_in() {
if ( ! is_user_logged_in() ) {
wp_dequeue_script( 'superpwa-register-sw' );
}
}
add_action( 'wp_print_scripts', 'no_pwa_unless_logged_in' );
The wp_print_scripts action fires just before sending enqueued scripts to the browser page. This code removes the PWA script from the queue.
This is a good approach: it won't allow your PWA script to go to any not-logged-in visitor, so those visitors won't have any access to it.
答案2
得分: 0
我找到了一个似乎有效的解决方案。
从另一个.js文件取消注册服务工作者是可能的,一旦重新注册它,你就可以获取注册函数的结果,并在之后用于取消注册。
然后,当我检查用户是否已注册并且PWA可以根据它下载时,我可以再次注册它。
function unregServiceWorker(){
if(navigator.serviceWorker){
if ("serviceWorker" in navigator) {
navigator.serviceWorker
.register(superpwa_sw.url)
.then((registration) => {
// registration worked
console.log("Registration succeeded.");
registration.unregister().then((boolean) => {
});
})
.catch((error) => {
console.error(`Registration failed with ${error}`);
});
}
}
}
英文:
I found a solution that seems to work.
Unregistering the service worker from another .js file is possible once you re-register it. This way you can get the result of the registering function and use it onwards for unregistering it.
Then I can register it again when I check the user is registered and the pwa turns downloable according to it.
function unregServiceWorker(){
if(navigator.serviceWorker){
if ("serviceWorker" in navigator) {
navigator.serviceWorker
.register(superpwa_sw.url)
.then((registration) => {
// registration worked
console.log("Registration succeeded.");
registration.unregister().then((boolean) => {
});
})
.catch((error) => {
console.error(`Registration failed with ${error}`);
});
}
}
}
答案3
得分: 0
I also tried the solution of @O.jones and it works perfectly. As he says in his comment, this solution seems to be more secure. I changed the function a bit, now it doesn't only de-register it, but it also registers the script when needed, so I call the function in the header.php and again once detected the user is logged in.
function no_pwa_unless_logged_in($user_logged) {
if ( ! $user_logged ) { //este bool debe ser llamado o cuando de se logea o cuando se da de alta
wp_dequeue_script( 'superpwa-register-sw' );
} else {
wp_enqueue_script( 'superpwa-register-sw' );
}
}
add_action( 'wp_print_scripts', 'no_pwa_unless_logged_in' );
英文:
I also tried the solution of @O.jones and it works perfectly. As he says in his comment, this solution seems to be more secure. I changed the function a bit, now it doesn't only de-register it, but it also registers the script when needed, so I call the function in the header.php and again once detected the user is logged in.
function no_pwa_unless_logged_in($user_logged) {
if ( ! $user_logged ) { //este bool debe ser llamado o cuando de se logea o cuando se da de alta
wp_dequeue_script( 'superpwa-register-sw' );
}else{
wp_enqueue_script( 'superpwa-register-sw' );
}
}
add_action( 'wp_print_scripts', 'no_pwa_unless_logged_in' );
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论