2017-06-13 60 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));