如何在Chrome中通过iframe订阅pushManager?

时间:2016-10-25 12:35:27

标签: google-chrome service-worker web-push push-api

我可以通过iframe注册服务工作者。当我尝试运行" pushManager.subscribe"我有:

   func createPolygonFromTheDrawablePoints(){

        let numberOfPoints = self.coordinates.count
        //do not draw in mapview a single point
        if numberOfPoints > 2 { addPolyGonInMapView(drawableLoc: coordinates) }//neglects a single touch
        coordinates = []
        self.canvasView.image = nil
        self.canvasView.removeFromSuperview()

        let origImage = UIImage(named: "pen")
        let tintedImage = origImage?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
        drawBtn.setImage(tintedImage, for: .normal)
        drawBtn.tintColor = UIColor.red
        drawBtn.backgroundColor = UIColor.white

    }

    func  addPolyGonInMapView( drawableLoc:[CLLocationCoordinate2D]){

        isDrawingModeEnabled = true
        let path = GMSMutablePath()
        for loc in drawableLoc{

            path.add(loc)

        }
        let newpolygon = GMSPolygon(path: path)
        newpolygon.strokeWidth = 3
        newpolygon.strokeColor = UIColor.black
        newpolygon.fillColor = UIColor.black.withAlphaComponent(0.5)
        newpolygon.map = googleMapView
        if cancelDrawingBtn.isHidden == true{ cancelDrawingBtn.isHidden = false }
        userDrawablePolygons.append(newpolygon)
        addPolygonDeleteAnnotation(endCoordinate: drawableLoc.last!,polygon: newpolygon)
    }

此问题仅限于Chrome中的iframe。它在Firefox中运行良好。如果没有Chrome中的iframe,它的效果很好

3 个答案:

答案 0 :(得分:2)

长话短说,你不能! 必须打开注册服务工作者的路径(是顶级域)才能注册服务工作者。 实现这一目标的一种方法是:

假设你的iframe看起来像这样:

 <iframe src="https://example.com"></iframe>

使用postMessage与iframe通信并请求权限,然后window.open("https://example.com/")注册服务工作者并获取令牌。

希望这会有所帮助:)

答案 1 :(得分:2)

您不能使用iframe,也不允许使用。

必须从顶级窗口执行权限请求。

唯一的选择(例如我们用于Pushpad Express)是从iframe重定向到/打开一个新窗口,然后从顶级窗口询问权限,最后重定向回来。

这是为了让用户明白哪个网站要求推送通知的权限。否则,担心例如广告可能会显示推送通知的提示,这会产生误导。

BTW我还建议在sandbox的{​​{1}}属性中添加一个新值,以便允许提示推送通知,但规范目前并不支持它。

答案 2 :(得分:0)

Chrome要求您订阅从顶级域名推送,否则不太清楚用户允许推送的来源。