问题是document.referrer无法正常工作

时间:2019-11-08 09:51:16

标签: javascript html ios swift

我当前正在使用HTML文件加载Web视图。网络功能在js文件中处理。这不是问题。

但是我的问题是backButton。我检查是否有要返回的页面。因此,我们使用document.referrer来显示使用现有服务器的Web视图。

但是它不起作用,因为它在创建iOS hybridApp时在iOS内部使用。

因此,我检查了history.back()是否有效。有用。有一个页面可以返回。

有些页面需要返回,但是document.referrer无效。

从主页移动到html包含js文件的详细信息页面

location.href = './Detail.html'

Common.js文件标题中的后退按钮功能

    alert(document.referrer) // return empty
    if (document.referrer) {
      history.back();
    } else {
      location.href = "./Main.html"; // only can do
    }

两个html文件(主要,详细信息)使用共同的标头。该功能在Common.js文件中。我正在使用Swift5

Main.html

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover, shrink-to-fit=no">
<meta name="referrer" content="always">

Detail.html

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover, shrink-to-fit=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="referrer" content="always">

我们如何解决这个问题?

谢谢。

2 个答案:

答案 0 :(得分:1)

我找到了另一个解决方案。这来自Navigating中的WKWebView。这使您可以像document.referrer一样工作。

但是,由于这是WKWebView的功能,因此需要jsios之间的通信。

  1. 修改现有js的功能。

Common.js文件标题中的后退按钮功能

var data = { 
           type : "backCheck",
           callback : "backCheckCallback"
       }
webkit.messageHandlers.sendMessageToIos.postMessage(data);
  1. 在Ios中接收消息
@available(iOS 8.0, *)
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
    if message.name == "sendMessageToIos" {
        let getMessage = message.body as! NSDictionary
        guard getMessage["type"] != nil else {
           return
        }
   let type : String = getMessage["type"] as! String
   let callbackName : String = getMessage["callback"] as! String
   if type == "backCheck" {
       let backCheck = WKWebView.canGoBack
       self.WKWebView.evaluateJavaScript("\(callbackName)(\(backCheck))", completionHandler: { (any, err) -> Void in
                            print(any ?? "no any")
                            print(err ?? "no Error")
                        })
        }
  1. 在js文件中配置回调函数
function backCheckCallback(backCheck){
  if(backCheck) {
    history.back();
  } else {
    location.href = "./Main.html";
  }
}

答案 1 :(得分:0)

现在我的问题已经解决,但这不是根本的解决方案。就我而言,我通过在接收到推送消息并移动页面时附加用于推送的参数来解决该问题。

迅速

webUrl =  "Web/Detail?pram=pram" // current Url
webUrl = "\(webUrl!)&push=Y"
let splitData = webUrl.split(separator: "?")
var myReq : URLRequest!
let mainUrl : String = String(splitData[0])
let mainParameter : String = String(splitData[1])
let url1 = Bundle.main.url(forResource: mainUrl, withExtension: "html")!
let url2 = URL(string: "?" + mainParameter, relativeTo: url1)!
myReq = URLRequest(url: url2)
WKWebView.load(myReq)

JS

if (getParameter("push") != "Y")) {
  history.back();
} else {
  location.href = "./Main.html"; // only can do
}

这可以解决问题,但我认为会有更好的解决方案。请在答案中给我写一个更好的解决方案。