Ich habe zwei Subdomains: https://abc.xxxx.com und https://xyz.xxxx.com. Also meine Fragen:

1). Ist es möglich, einen Servicemitarbeiter für zu registrieren? https://xyz.xxxx.com von https://abc.xxxx.com? wenn ja dann wie?

2). Wenn http://abc.xxxx.com ( http unsicher), müssen Sie sich trotzdem registrieren ein Servicemitarbeiter für https://xyz.xxxx.com von http://abc.xxxx.com wie in iframe oder so ....

Dies ist eine reale Situation, mit der ich für meine multiple Subdomain konfrontiert bin. Jede Hilfe geschätzt. Danke im Voraus.

20
Yogendra 7 Aug. 2015 im 10:19

4 Antworten

Beste Antwort

Hier sind einige allgemeine Antworten, die meiner Meinung nach die verschiedenen Punkte ansprechen sollten, die Sie in Ihrer Frage ansprechen:

Wenn Sie Seiten haben, die sowohl auf abc.123.com als auch auf xyz.123.com leben, und Sie möchten, dass beide Seitengruppen von einem Servicemitarbeiter gesteuert werden, müssen Sie zwei separate Servicemitarbeiterregistrierungen haben. Jede Registrierung muss für eine Kopie Ihrer Service Worker-JS-Datei erfolgen, die in der jeweiligen Domäne gehostet wird, die der Seite der obersten Ebene entspricht, und auf alle Seiten und Service Worker-Skripte muss über https: zugegriffen werden.

Davon abgesehen können Sie eine Servicemitarbeiterregistrierung für eine andere Domain starten, indem Sie eine domänenübergreifende <iframe> auf einer Seite einfügen, aber sowohl die Hostseite als auch die <iframe> müssen über https: bedient werden. Es gelten die normalen Einschränkungen für den Service Worker-Bereich. Wenn Sie beispielsweise einen Service Worker für die andere Domäne registrieren möchten, die den gesamten https://other-domain.com/ Bereich abdeckt, müssen Sie sicherstellen, dass der Speicherort des Service Worker-Skripts angegeben ist Die Registrierung erfolgt auf höchster Ebene, z https://other-domain.com/service-worker.js, nicht bei https://other-domain.com/path/to/service-worker.js. Dies ist der Ansatz, der beispielsweise vom AMP-Projekt über das <amp-install-serviceworker> Element.

20
Community 23 Mai 2017 im 12:26

Mein schlechtes, ich habe ein bisschen falsch verstanden. 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 Ihr 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);
                })
            })        
        });//*/
    }
});

Danach müssen Sie ein Konto in der Google Developer Console registrieren und ein Projekt für etwas wie * .xxxx.com registrieren. Dann müssen Sie ein richtiges Manifest json mit gcm_sender_id und gcm_user_visible_only erhalten

Sie müssen einen Schlüssel für Server- und Browseranwendungen erstellen. Weitere Informationen hierzu finden Sie auf dieser Seite.

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

Die für Browseranwendungen befindet sich in Ihrem Manifest json.

Um dann Push-Benachrichtigungen zu versenden, verwenden Sie Folgendes:

  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, welches Problem Sie hatten, aber das funktioniert bei mir mit mehreren Subdomains. :) :)

-1
Alanthir 14 Aug. 2015 im 15:34

Service Worker scripts must be hosted at the same origin (Protocol + Domain name + Port). Jede Subdomain wird als ein anderer Ursprung betrachtet. Daher müssen Sie für jede Subdomain einen Servicemitarbeiter registrieren. Jeder dieser Arbeiter hat seine eigenen cache und scope.

5
Vivek Pratap Singh 7 Okt. 2016 im 05:17

Versuchen Sie, Nginx proxy_pass zu verwenden. Diese Arbeit für mich.

0
Rick 29 Dez. 2018 im 10:06