使用iOS共享/操作扩展程序获取主机应用的屏幕截图?

时间:2015-10-14 07:56:28

标签: swift algorithm ios8-extension ios8-share-extension webpage-screenshot

我想知道如何使用共享/操作扩展程序截取iOS主机应用程序的屏幕截图。

我的用例如下:

  1. 使用Safari浏览器访问网页(https,例如gmail)
  2. 点按“分享”按钮,然后选择分机号
  3. 该扩展程序将截取当前网页
  4. 的屏幕截图

    此用例的工作示例是Awesome Screenshot iOS app

    我曾尝试过以下方法

    1. 在UIWebView / WKWebkit上重新加载baseURI(loadRequest)(无法访问https内容,例如Gmail)。所以没有做任何重新加载(很棒的截图不是重装btw)
    2. 使用ExtensionPreprocessingJS通过arguments.completionFunction函数获取DOM内容。我无法在这里提取document.body虽然我可以获得源码等,但是带有baseURI的loadHTMLString会搞乱表示层。
    3. 在ExtensionPreprocessingJS中使用html2canvas获取图像并将其作为子项附加到主机应用程序的网页,但不知道如何提取它。此外,某些网页(例如Gmail)的图片也丢失了。
    4. Mobile Safari没有visibleContentsAsDataURL方法。
    5. 我认为一种可行的方法是在ExtensionPreprocessingJS中使用html2canvas,但如何以某种方式保存此图像?

1 个答案:

答案 0 :(得分:1)

编辑:所以下面的工作在模拟器中,但在设备上工作。我现在也在寻找解决方案。

这是我认为Awesome Screenshot应用程序使用的解决方案:

func captureScreen() -> UIImage
{
    // Get the "screenshot" view.
    let view = UIScreen.mainScreen().snapshotViewAfterScreenUpdates(false)

    // Add the screenshot view as a subview of the ShareViewController's view.
    self.view.addSubview(view);

    // Now screenshot *this* view.
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, false, 0);
    self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Finally, remove the subview.
    view.removeFromSuperview()

    return image
}