2015-05-15 10 views
8

मुझे समस्या है कि सेवा पंजीकृत करने के बाद Navigator.serviceWorker.controller हमेशा शून्य है। मैं कभी भी ताज़ा ताज़ा नहीं करता हूं और पेज को रीफ्रेश करता हूं। मैं इसे Google क्रोम 42.0.2311.152 मीटर (32-बिट) के साथ परीक्षण करता हूं।navigator.serviceWorker.controller हमेशा शून्य है

var currentServiceWorker = null; 
navigator.serviceWorker.register(SERVICE_WORKER_URL).then(function(serviceWorkerRegistration { 
    if (navigator.serviceWorker.controller) { 
    currentServiceWorker = navigator.serviceWorker.controller; 
    } else { 
    currentServiceWorker = serviceWorkerRegistration.active; 
    } 
}); 

इस के अनुसार:

नियंत्रक केवल पढ़ने के लिए ServiceWorkerContainer इंटरफ़ेस में प्रॉपर्टी एक ServiceWorker वस्तु अगर अपने राज्य सक्रिय होता है (एक ही वस्तु ServiceWorkerRegistration.active द्वारा दिया) देता है। यह अनुरोध शून्य हो जाता है अगर अनुरोध एक ताज़ा ताज़ा करें (Shift + refresh) या यदि कोई सक्रिय कार्यकर्ता नहीं है। (स्रोत: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller)

navigator.serviceWorker.controllerserviceWorkerRegistration.active रूप में एक ही ऑब्जेक्ट प्रदान। लेकिन .active के साथ मुझे सक्रिय कार्यकर्ता मिल गया है, .controller नहीं।

क्या आपके पास उस स्थिति के लिए कोई विचार है?

धन्यवाद, Andi

उत्तर

8

कि क्या आप सेवा कार्यकर्ता के दायरे में गिरता पर हैं वर्तमान पृष्ठ पहली बात मैं जब यह डिबगिंग को देखो चाहते हैं। यदि आपका वर्तमान पृष्ठ दायरे में नहीं है, तो इसे नियंत्रित नहीं किया जाएगा (लेकिन आपके द्वारा पंजीकृत सेवा कार्यकर्ता को अभी भी सक्रिय माना जा सकता है)।

आप register(SERVICE_WORKER_URL) पर कॉल कर रहे हैं जो डिफ़ॉल्ट रूप से, उस निर्देशिका का उपयोग करेगा जिसमें आपकी सेवा कार्यकर्ता स्क्रिप्ट को दायरे के रूप में शामिल किया जाएगा। यह सामान्य रूप से आप चाहते हैं कि आप चाहते हैं, लेकिन आपको यह सुनिश्चित करने की ज़रूरत है कि SERVICE_WORKER_URL आपकी वेबसाइट के रूट पर स्थित एक स्क्रिप्ट को संदर्भित करता है। इस तरह, यह एक ही रूट स्तर पर पृष्ठों या आपके वेब रूट के नीचे निर्देशिकाओं के पृष्ठों को नियंत्रित करने में सक्षम होगा। इसलिए यदि आपकी सेवा कार्यकर्ता जावास्क्रिप्ट फ़ाइल वर्तमान में /scripts/ उपनिर्देशिका या उसके जैसा कुछ है, तो इसे रूट पर ले जाएं।

आप chrome://serviceworker-internals/ पर जाकर और अपने पंजीकरण से जुड़े दायरे को देखकर अपने सेवा कार्यकर्ता का वर्तमान दायरा देख सकते हैं।

+0

यह एक महाकाव्य pitfall है, मुझे विश्वास है कि यह बेहतर दस्तावेज होना चाहिए - कम से कम कुछ स्पष्ट त्रुटि संदेश अच्छा होगा। धन्यवाद! – shabunc

+0

@shabunc ने समस्या हल की, मुझे नियंत्रक में शून्य मिल गया। –

1

navigator.serviceWorker.register केवल सेवा कार्यकर्ता पंजीकृत करें और इसे सक्रिय करें। लेकिन सेवा कार्यकर्ता पर नियंत्रक प्राप्त करने के लिए आपको अपने सर्विसवर्कर को सार्वजनिक रूट फ़ोल्डर में रखना होगा ताकि सभी पृष्ठ दायरे में हों और सेवा कार्यकर्ता उससे जुड़ा होगा।

संबंधित मुद्दे