我正在用HTML5前端和C++后端编写一个应用程序。我想使用自定义方案("klaes://")在前端和后端之间进行通信。我已经尝试过结合使用ElectronJS和navtive c++加载项来解决这些需求,工作得很好,非常好。
现在,我正在尝试使用(CEF)来解决相同的需求。除了我无法在我的自定义方案上使用Fetch-API之外,一切都很好。
电子I中的做了以下工作:
注册自订计划
protocol.registerSchemesAsPrivileged ([{
scheme: "klaes",
privileges: {
supportFetchAPI: true,
"corsEnabled": true
}
}])处理请求:
protocol.registerBufferProtocol ("klaes", (request, callback) => {
// ...
}这里一切都很好。
在CEF中我尝试了以下几个方面:
注册自订计划:
class ClientSchemeHandler : public CefResourceHandler {
// handle request
bool ProcessRequest(CefRefPtr<CefRequest> request,
CefRefPtr<CefCallback> callback) OVERRIDE {
// ...
}
// add CORS header
void GetResponseHeaders(CefRefPtr<CefResponse> response,
int64& response_length,
CefString& redirectUrl) OVERRIDE {
// ...
response->GetHeaderMap(hdrMap);
hdrMap.insert(std::make_pair ("Access-Control-Allow-Origin", "*"));
response->SetHeaderMap(hdrMap);
// ...
}
};
class ClientSchemeHandlerFactory : public CefSchemeHandlerFactory {
// ...
};在我的应用程序中,我做到了:
void SimpleApp::OnContextInitialized() {
// ...
CefRegisterSchemeHandlerFactory("klaes", "openmodule", new ClientSchemeHandlerFactory ());
// ...
// Browsersettings
CefBrowserSettings browser_settings;
browser_settings.web_security = STATE_DISABLED;
}设置给定方案的fetch_enabled -标志
void SimpleApp::OnRegisterCustomSchemes(CefRawPtr<CefSchemeRegistrar> registrar) {
registrar->AddCustomScheme("klaes", CEF_SCHEME_OPTION_FETCH_ENABLED);
}没有fetch-API的请求(如imgs、script、href等)效果很好。但是当我尝试获取请求时,我得到了以下前端错误:Fetch API cannot load klaes://openmodule/5. URL scheme must be "http" or "https" for CORS request.", source: klaes://openmodule/www/build/p-elph9ath.entry.js (1)
当我取消对ElectronJS的"corsEnabled": true选项进行注释时,registerSchemesAsPrivileged中也会出现相同的错误
我是否有任何错误,或者这根本不可能与CEF,但可能与电子?
顺便说一下,我使用了07/25/2019-CEF75.1.8+g84Fed5d+Cr-75.0.3770.100/Chromium75.0.3770.100 build for Windows。
发布于 2019-07-25 17:10:55
下面的代码应该可以解决问题:
void SimpleApp::OnRegisterCustomSchemes(CefRawPtr<CefSchemeRegistrar> registrar) {
registrar->AddCustomScheme("klaes", CEF_SCHEME_OPTION_FETCH_ENABLED|CEF_SCHEME_OPTION_CORS_ENABLED);
}此外,您还可以使用enum cef_scheme_options_t 这里中可用的选项。
https://stackoverflow.com/questions/57202299
复制相似问题