首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Safari应用程序扩展:在HTTPS页面上加载HTML文件

Safari应用程序扩展:在HTTPS页面上加载HTML文件
EN

Stack Overflow用户
提问于 2018-06-13 19:43:33
回答 1查看 582关注 0票数 1

我正在开发一个Safari应用程序扩展(因为Safari扩展现在被正式否决了),我想通过JS将一些HTML注入到页面中。但是当我向我的safari-extension:// URL发出请求时,请求是在没有SSL的情况下发出的,而Safari当前阻止混合内容,并且不允许任何改变策略的方法。所以我有两个问题。

  1. 对于我的开发环境,我如何绕过这个问题呢?
  2. 我在注释这里中看到,生产打包扩展(旧的Safari扩展)将使用SSL加载资源。对Safari应用程序扩展来说是这样吗?

编辑

我有一个苹果开发者帐户,签了我的扩展,但仍然没有运气。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-26 20:41:57

我使用向safari扩展公开的HTML在响应中将消息传递协议作为字符串发送。

内容脚本请求HTML模板(JS)

代码语言:javascript
复制
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监听消息和句柄(迅速)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50845070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档