Расширения Safari App: загрузка HTML-файла на странице HTTPS
Я разрабатываю расширение приложения Safari (потому что расширения Safari официально объявлены устаревшими) и хочу добавить HTML-код на страницу через JS. Но когда я делаю запрос на мой safari-extension://
URL запрос выполняется без SSL, и в настоящее время Safari блокирует смешанный контент и не позволяет каким-либо образом изменять эту политику. Итак, у меня есть два вопроса.
Как я могу обойти эту проблему для моей среды разработки?
В комментариях я прочитал, что производственное упакованное расширение (старое расширение Safari) будет загружать ресурсы с помощью SSL. Это правда для расширений приложения Safari?
РЕДАКТИРОВАТЬ
Я получил учетную запись Apple Developer, подписал свое расширение и все еще не повезло.
0 ответов
Я использую протокол обмена сообщениями, который safari предоставляет расширению приложения Safari, чтобы отправлять HTML-код в виде строки в ответ.
Скрипт содержимого запрашивает HTML-шаблон (JS)
let sendMessage = (msgObj, callback) => {
msgObj.callbackIndex = (safariCallbackCount++).toString();
let callbackKey = msgObj['type']+'_'+msgObj.callbackIndex;
if (typeof callback === 'function')
messageCallbacks[callbackKey] = callback;
safari.extension.dispatchMessage(msgObj['type'], msgObj);
}
sendMessage({type: 'loadTemplate', path: path}, callback );
Обратите внимание на хэш messageCallbacks, в котором хранится функция обратного вызова, а также счетчик, используемый для уникальности индекса. Вы передаете сообщение процессу Swift, и ответы могут возвращаться не по порядку при отправке нескольких сообщений.
SFSafariExtensionHandler прослушивает сообщения и дескрипторы (быстро)
func loadTemplate (withPage page: SFSafariPage, withUrl url: URL, withCallbackIndex callbackIndex: String) {
let pathExtention = url.pathExtension
let pathPrefix = url.path.replacingOccurrences(of: "." + pathExtention, with: "", options: .literal, range: nil)
if let filepath = Bundle.main.path(forResource: pathPrefix, ofType: pathExtention) {
do {
let contents = try String(contentsOfFile: filepath, encoding: .utf8)
page.dispatchMessageToScript(withName: "loadTemplate", userInfo: ["htmlData": contents, "callbackIndex": callbackIndex])
} catch {
// contents could not be loaded
NSLog("ERROR CONTENTS COULD NOT BE LOADED FROM \(filepath)")
}
} else {
NSLog("Could not build file path")
}
}
// This method will be called when a content script provided by your extension calls safari.extension.dispatchMessage("message").
override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {
page.getPropertiesWithCompletionHandler { properties in
switch messageName {
case "loadTemplate":
self.loadTemplate(withPage: page, withUrl: URL(string: userInfo?["path"] as! String)!, withCallbackIndex: userInfo?["callbackIndex"] as! String)
default:
NSLog("NO DEFINITION FOR STRING VALUE")
}
}
}
Скрипт содержимого обрабатывает ответ (JS)
let handleMessage = event => {
let callbackIndex = event.message.callbackIndex;
delete event.message.callbackIndex;
let callbackKey = event.name+'_'+callbackIndex;
if ( typeof messageCallbacks[callbackKey] === 'function' ) {
messageCallbacks[callbackKey](event.message);
delete messageCallbacks[callbackKey]
}
};
safari.self.addEventListener("message", handleMessage);
//// html data is accessible from event.message.htmlData