2015-08-07 11 views
10

Ich habe zwei Sub-Domains wie https://abc.xxxx.com und https://xyz.xxxx.com So registrieren:wie ein Servicemitarbeiter aus verschiedenen Sub-Domain meine Fragen

1). ist es möglich, einen Service-Mitarbeiter für https://xyz.xxxx.com von https://abc.xxxx.com zu registrieren? Wenn ja, wie?

2). wenn http://abc.xxxx.com (http unsicher) dann sowieso einen Servicemitarbeiter für https://xyz.xxxx.com von http://abc.xxxx.com wie in iframe oder etwas ....

Dies ist eine reale Situation zu registrieren, ich bin vor meiner mehr Sub-Domain. Jede Hilfe wird geschätzt. Vielen Dank im Voraus

+0

Jede Beziehung mit jQuery? – ebilgin

+0

nicht direkt, ich dachte, könnte helfen, falls öffnung Witwe wie Ifame oder etwas .... sowieso entfernt es. – Yogendra

+0

können Sie es beheben ?. Ich habe ähnliches Problem. –

Antwort

13

Hier sind einige allgemeine Antworten, die ich denke, sollte die verschiedenen Punkte adressieren Sie in Ihrer Frage stellen:

  • Jeder registrierte Servicemitarbeiter scope ein zugehöriges hat, die den Satz von Web-Seiten schreibt vor, dass die Service-Arbeiter kann kontrollieren. Die scope eines Service-Arbeiters ist eine URL, und diese URL muss denselben Ursprung haben wie die Seite, auf der der Service-Worker registriert ist, und muss entweder eine URL sein, die der Pfadebene der Seite entspricht, oder ein Pfad, der mindestens einer ist Ebenen nach unten. Der Standardwert scope entspricht demselben Pfad wie der Standort des Service-Worker-Skripts. Aufgrund dieser Einschränkung ist es nicht möglich, navigator.serviceWorker.register(...) von einer Seite in einer (Sub-) Domäne aus aufzurufen und mit einem Service-Mitarbeiter zu enden, der Seiten in einer anderen (Sub-) Domäne steuert.

  • Einschränkungen gibt es an seinem Platz zu verhindern, dass Sie einen https: auf einer http: Seite wirft und dass ein Servicemitarbeiter registrieren verwenden.Siehe DOMException when registering service worker inside an https iframe

  • Obwohl ich nicht weiß, dass es direkt auf Ihre Frage in engen Zusammenhang steht, ausdrücklich fetch() für eine http: Ressource in Ihrem Servicemitarbeiter Code Aufruf wird in einem Fehler in aktuellen Versionen von Chrome führen, da mit gemischten Inhalten fetch() s sind in einem Service-Mitarbeiter nicht erlaubt. Ich weiß nicht, ob die Dinge zu 100% an dieser Front angesiedelt sind, und this open bug ist immer noch relevant.

Wenn Sie Seiten haben, die sowohl live auf abc.123.com und xyz.123.com und Sie wollen beide Sätze von Seiten von einem Servicemitarbeiter kontrolliert werden, dann müssen Sie zwei separate Servicearbeiter Registrierungen haben. Jede Registrierung muss für eine Kopie Ihrer Service-Worker-JS-Datei erfolgen, die auf der entsprechenden Domäne der obersten Ebene gehostet wird. Alle Seiten und Service-Worker-Skripts müssen über https: erreicht werden.

aber sagen, dass Sie können einen Servicemitarbeiter Registrierung für eine andere Domain, indem eine Cross-Domain auf einer Seite, aber sowohl die Host-Seite und die Bedarf bedient werden über https: pfiffen. Es gelten die normalen Scopingeinschränkungen des Service-Mitarbeiters. Wenn Sie beispielsweise einen Service-Mitarbeiter für die andere Domäne registrieren möchten, die den gesamten Bereich https://other-domain.com/ abdeckt, müssen Sie sicherstellen, dass der Standort des Service-Worker-Scripts registriert ist die oberste Ebene, z https://other-domain.com/service-worker.js, nicht unter https://other-domain.com/path/to/service-worker.js. Dies ist der Ansatz, der beispielsweise von der AMP project über die <amp-install-serviceworker> element verwendet wird.

+0

Also meinst du zu sagen, in beiden Punkten Antwort ist nein .... – Yogendra

+0

Richtig. Die Antwort auf beide ist nein. –

+0

Okay, lass mich noch mehr suchen, wenn gefunden, dann werde ich deine Antwort als akzeptiert markieren. Danke für die Hilfe – Yogendra

-1

Mein schlecht, ich missverstanden ein bisschen. Nun, hier ist der Code

if('serviceWorker' in navigator){ 
    if(window.location.pathname != '/'){ 
     //register with API 
     if(!navigator.serviceWorker.controller) navigator.serviceWorker.register('/service-worker', { scope: '/' }); 
     //once registration is complete 
     navigator.serviceWorker.ready.then(function(serviceWorkerRegistration){ 
      //get subscription 
      serviceWorkerRegistration.pushManager.getSubscription().then(function(subscription){ 

       //enable the user to alter the subscription 
       //jquery selector for enabling whatever you use to subscribe.removeAttr("disabled"); 
       //set it to allready subscribed if it is so 
       if(subscription){ 
        //code for showing the user that they're allready subscribed 
       } 
      }); 
     }); 
    } 
}else{ 
    console.warn('Service workers aren\'t supported in this browser.'); 
} 

dann ist hier das Ereignis -ish für Ihre abonnieren/abbestellen

// subscribe or unsubscribe to the ServiceWorker 
$(document.body).on('change', /*selector*/, function(){ 
    //new state is checked so we subscribe 
    if($(this).prop('checked')){ 
     navigator.serviceWorker.ready.then(function(serviceWorkerRegistration){ 
      serviceWorkerRegistration.pushManager.subscribe() 
       .then(function(subscription){ 
        // The subscription was successful 
        console.log('subscription successful'); //subscription.subscriptionId 

        //save in DB - this is important because 
        $.post($('#basePath').val() + 'settings/ajax-SW-sub/', {id:subscription.subscriptionId}, function(data){ 
         //console.log(data); 
        }, 'json'); 

        }).catch(function(e) { 
         if (Notification.permission === 'denied') { 
          // The user denied the notification permission which 
          // means we failed to subscribe and the user will need 
          // to manually change the notification permission to 
          // subscribe to push messages 
          console.warn('Permission for Notifications was denied'); 
         } else { 
          // A problem occurred with the subscription; common reasons 
          // include network errors, and lacking gcm_sender_id and/or 
          // gcm_user_visible_only in the manifest. 
          console.error('Unable to subscribe to push.', e); 
         } 
        }); 
     });//*/ 
    //new state us unchecked so we unsubscribe 
    }else{ 
     $('.js-enable-sub-test').parent().removeClass('checked'); 
     //get subscription 
     navigator.serviceWorker.ready.then(function(reg) { 
      reg.pushManager.getSubscription().then(function(subscription) { 
       //unregister in db 
       $.post($('#basePath').val() + 'settings/ajax-SW-unsub/', {id:subscription.subscriptionId}, function(data){ 
        //console.log(data); 
       }, 'json'); 

       //remove subscription from google servers 
       subscription.unsubscribe().then(function(successful) { 
        // You've successfully unsubscribed 
        console.log('unsubscribe successful'); 
       }).catch(function(e) { 
        // Unsubscription failed 
        console.log('unsubscribe failed', e); 
       }) 
      })   
     });//*/ 
    } 
}); 

nach, dass Sie ein Konto auf der Google-Entwickler-Konsole registrieren müssen und ein Projekt für etwas registrieren wie * .xxxx.com. Dann müssen Sie eine ordnungsgemäße Manifest Json mit gcm_sender_id und gcm_user_visible_only

erhalten Sie müssen einen Schlüssel für beide Server-und Browser-Anwendungen erstellen, gibt es mehr Infos dazu auf dieser Seite.

https://developers.google.com/web/updates/2015/03/push-notificatons-on-the-open-web?hl=en

Der eine für Browser-Anwendungen geht in Ihrem Manifest json.

Dann Push-Benachrichtigungen versenden Sie so etwas wie diese verwenden werden:

function addSWmessage($args){ 

    $output = false; 

    if(!isset($args['expiration']) || $args['expiration'] == ''){ 
     $args['expiration'] = date('Y-m-d H:i:s', strtotime('+7 days', time())); 
    } 

    $sql = sprintf("INSERT INTO `serviceworker_messages` SET title = '%s', body = '%s', imageurl = '%s', linkurl = '%s', hash = '%s', expiration = '%s'", 
        parent::escape_string($args['title']), 
        parent::escape_string($args['text']), 
        parent::escape_string($args['imageurl']), 
        parent::escape_string($args['linkurl']), 
        parent::escape_string(md5(uniqid('******************', true))), 
        parent::escape_string($args['expiration'])); 

    if($id = parent::insert($sql)){ 
     $output = $id; 
    } 

    return $output; 

} 
function pushSWmessage($args){ 

    //$args['messageid'] $args['userids'][] 

    foreach($args['userids'] as $val){ 

     $sql = sprintf("SELECT messages_mobile, messages FROM `users_serviceworker_hash` WHERE users_id = '%s'", 
         parent::escape_string($val)); 

     if($row = parent::queryOne($sql)){ 
      $m1 = json_decode($row['messages'], true); 
      $m1[] = $args['messageid']; 
      $m2 = json_decode($row['messages_mobile'], true); 
      $m2[] = $args['messageid']; 

      $sql = sprintf("UPDATE `users_serviceworker_hash` SET messages = '%s', messages_mobile = '%s' WHERE users_id = '%s'", 
          parent::escape_string(json_encode($m1)), 
          parent::escape_string(json_encode($m2)), 
          parent::escape_string($val['users_id'])); 

      parent::insert($sql); 
     } 
    } 

    $sql = sprintf("SELECT subscriptionID, users_id FROM `users_serviceworker_subscriptions`"); 

    if($rows = parent::query($sql)){ 

     foreach($rows as $val){ 
      if(in_array($val['users_id'], $args['userids'])){ 
       $registrationIds[] = $val['subscriptionID']; 
      } 
     } 
     if(isset($registrationIds) && !empty($registrationIds)){ 
      // prep the bundle 
      $msg = array 
      (
       'message'  => '!', 
       'title'   => '!', 
       'subtitle'  => '!', 
       'tickerText' => '!', 
       'vibrate'  => 1, 
       'sound'   => 1, 
       'largeIcon'  => '!', 
       'smallIcon'  => '!' 
      ); 

      $headers = array 
      (
       'Authorization: key='.SW_API_ACCESS_KEY, 
       'Content-Type: application/json' 
      ); 

      $fields = array 
      (
       'registration_ids' => $registrationIds, 
       'data'    => $msg 
      ); 

      $ch = curl_init(); 
      curl_setopt($ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send'); 
      curl_setopt($ch,CURLOPT_POST, true); 
      curl_setopt($ch,CURLOPT_HTTPHEADER, $headers); 
      curl_setopt($ch,CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false); 
      curl_setopt($ch,CURLOPT_POSTFIELDS, json_encode($fields)); 
      curl_exec($ch); 
      curl_close($ch); 
     } 
    } 

} 

Und nein, ich weiß nicht, was Problem, das Sie haben habe aber das funktioniert für mich mit mehreren Sub-Domains . :)

+0

danke für die Antwort, aber ich denke, Sie vermissen meine Frage zu verstehen, sorry für wenn meine Frage falsch geht. Meine Frage bezieht sich auf die Registrierung von Service-Arbeiter, nicht abfangen Anfrage in Versprechen (fetch). – Yogendra

+0

aktualisiert meine Antwort – Alanthir

+0

Danke für Ihre Bemühungen !! Aber meine Frage ist sehr spezifisch für die Registrierung ein Service-Arbeiter, die Code auf anderen Sub-Domain existieren .... – Yogendra

2

Service Worker scripts must be hosted at the same origin (Protocol + Domain name + Port). Jede Subdomain wird als eine andere Herkunft betrachtet. Daher müssen Sie für jede eine Servicemitarbeiterin registrieren. Jeder dieser Arbeiter wird seine eigenen cache und scope haben.