2017-06-13 61 views
0

我使用OneSignal爲網絡推送消息的客戶網站訪問控制允許來源。我遵循HTTPS setup。我幾次仔細檢查過,確保一切都順利完成。沒有使用OneSignal設置

  • 所有文件上傳到域的根
  • 我設置的清單,並把所需的初始化代碼在頁面

的頭當我加載頁面我得到:

Fetch API cannot load https://onesignal.com/api/v1players. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'https://example.com' is therefore not allowed access. 
The response had HTTP status code 404. If an opaque response serves your needs, 
set the request's mode to 'no-cors' to fetch the resource with CORS disabled. 

我直接聯繫了團隊,但他們只是複製粘貼的文檔部分。沒有進一步的援助。

使用Chrome瀏覽器版本58/10的Windows

我在做什麼錯?

+0

你請求的模式設置爲「無CORS」取得與CORS資源禁用? –

+0

你可以給我們你的頁面URL從哪裏你嘗試集成onesignal? –

+0

@JoshBeam我只是像使用任何用戶一樣使用他們的基本實現,這是否有必要,如果有的話,任何鏈接到哪裏啓用? –

回答

2

https://onesignal.com/api/v1players響應顯然不包括Access-Control-Allow-Origin響應標頭,並且因爲它們沒有,您的瀏覽器會阻止您的前端JavaScript代碼訪問響應。

有沒有變化,你可以做你自己的前端JavaScript代碼,也不後端配置設置,將讓您的前端JavaScript代碼來發出請求你直接試圖https://onesignal.com/api/v1players的方式,並得到答覆回成功。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS更詳細地解釋,但其要點是,對於CORS,請求發送到的服務器必須配置爲發送Access-Control-Allow-Origin響應標頭。

反正https://documentation.onesignal.com/docs/web-push-sdk-setup-https有解釋他們的支持SDK,這顯然需要你做更多的東西像這樣的官方文檔:

<head> 
    <link rel="manifest" href="/manifest.json"> 
    <script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async></script> 
    <script> 
    var OneSignal = window.OneSignal || []; 
    OneSignal.push(["init", { 
     appId: "YOUR_APP_ID", 
     autoRegister: false, 
     notifyButton: { 
     enable: true /* Set to false to hide */ 
     } 
    }]); 
    </script> 
</head> 
+0

我只是使用他們的代碼。我在網站上有相同的代碼(只是修改),應該使其工作。我只是以最基本的方式使用他們的服務。它應該工作。 –

0

接受的答案是好的,您可以通過使用標籤解決大部分的要求:

OneSignal.push(function() { 
    /* These examples are all valid */ 
    OneSignal.sendTag("key", "value"); 

    OneSignal.sendTag("key", "value", function(tagsSent) { 
    // Callback called when tags have finished sending 
    }); 

    OneSignal.sendTag("key", "value").then(function(tagsSent) { 
    // Callback called when tags have finished sending 
    }); 
}); 

但你要編輯的設備信息的情況下,沒有辦法(今天的)來編輯與WebPush SDK的設備元數據。我需要定期更新位置,而且我不想使用標籤。所以,我把PUT請求https://onesignal.com/api/v1players這樣的:

function createCORSRequest(method, url) { 
    var xhr = new XMLHttpRequest(); 
    if ("withCredentials" in xhr) { 
    xhr.open(method, url, true); 
    } else if (typeof XDomainRequest != "undefined") { //ie8 ie9 
    xhr = new XDomainRequest(); 
    xhr.open(method, url); 
    } else { 
    xhr = null; 
    } 
    return xhr; 
}; 

//then every time I needed to update the device 
var url = 'https://onesignal.com/api/v1/players/' + playerId; 
var xhr = createCORSRequest('PUT', url); 
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8"); 

xhr.onload = function() {}; //success 
xhr.onerror = function() {}; //error 

var deviceInfo = { 
    "app_id": oneSignalAppId, 
    "timezone": (currentDateTime.getTimezoneOffset()) * -60, //offset from utc 
    //whatever fields you need to update 
}; 

xhr.send(JSON.stringify(deviceInfo));