截图来自Share Extension的Safari

时间:2014-08-28 15:41:43

标签: ios xcode ios8 ios-app-extension

是否可以通过共享扩展程序在Safari中执行webview当前可见区域的屏幕截图?我可以使用Windows,但扩展不支持UIApplication,因此我无法访问该窗口。

4 个答案:

答案 0 :(得分:2)

你不能,因为无法从扩展程序到达UIApplication。您无法获得第一个UIWindow,即Safari层,因此您必须使用扩展所具有的Javascript预处理文件。因此,只需创建一个Javascript文件,当发送到Safari时,会生成带有当前可见区域图像数据的base64字符串。通过扩展中的kUTTypePropertyList标识符获取该字符串。因为那应该是NSData,使用+imageWithData从那里生成UIImage。这就是您正在寻找的内容,无需再次加载页面,如果网页需要登录,则可防止出现第二次加载和错误图像。

答案 1 :(得分:0)

据我所知,除非您动态调用所需的API,否则您不能这样做,甚至可能会遇到上下文权限问题和应用商店批准问题。

另一种方法可能是将当前的Safari URL传递给您的扩展,使用隐藏的UIWebView加载它并将此视图渲染为UIImage,但您将丢失当前可见的区域信息......

答案 2 :(得分:0)

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

你不能只获得Safari的可见区域,但你可以获得一点点聪明才智的截图。以下方法从ShareViewController捕获屏幕截图。

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
}

答案 3 :(得分:0)

这是获取共享扩展程序中网页截图的经批准方式:

with open('test.txt', 'r') as f:
    content = f.readlines()
    output_line = "".join([line.split(':')[1].replace('\n',';').strip() for line in content[0:4]])
    print(output_line)