Я использую OneSignal для веб-push-сообщений для веб-сайта клиента. Я следил за настройкой HTTPS. Я несколько раз проверял, что все сделано правильно.
Когда я загружаю страницу, я получаю:
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 mode to 'no-cors' to fetch the resource with CORS disabled.
Я напрямую связался с командой, но они просто скопировали часть документации. Никакой дополнительной помощи не было.
Использование Chrome версии 58/Windows 10
Что я делаю неправильно?
Ответы https://onesignal.com/api/v1players
видимому, не включают заголовок ответа Access-Control-Allow-Origin
, а поскольку они этого не делают, ваш браузер блокирует ваш внешний код JavaScript от доступа к ответам.
Нет никаких изменений, которые вы можете внести в свой собственный JavaScript-код frontend, а также настройки конфигурации бэкэнд, которые позволяют вашему внутреннему 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>
Принятый ответ в порядке, вы можете решить большинство требований, используя теги:
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
});
});
Но если вы хотите отредактировать информацию об устройстве, на сегодняшний день нет способа редактировать метаданные устройства с помощью SDK WebPush. Мне нужно было периодически обновлять местоположение, и я не хотел использовать теги. Итак, я отправил запрос 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));