Safari App Extension 没有第二次加载

Posted

技术标签:

【中文标题】Safari App Extension 没有第二次加载【英文标题】:Safari App Extension doesn't load second time 【发布时间】:2019-03-01 02:24:19 【问题描述】:

我遇到了一个奇怪的问题,我第二次运行我的 Safari 应用程序扩展时,它不会显示在 Safari 中。

    打开 Xcode。 新建 > 项目。 在“其他”下,选择 Safari Extension App,然后单击“下一步”。 在此“产品名称”屏幕上输入您想要的任何内容,然后单击“下一步”。 点击“创建”。 点击 Xcode 左上角的 Play 图标运行项目。 它将打开一个小应用程序,底部有一个按钮,文本为:“在 Safari 扩展首选项中打开”。 它可能不会出现。如果是,请跳至 10。 在 Safari 的标题菜单中点击“开发”,点击“允许未签名的扩展”。 出现后,选中复选框以启用它。 点击左上角的停止图标停止 Xcode 运行。 在插件的 Info.plist 中更改一个值,例如将 SFSafariWebsiteAccess.Level 从“Some”更改为“All”。 点击 Xcode 中的播放图标。 Safari 会告诉您扩展权限已更改。确认这些更改,扩展程序将不再显示。

如果我更改其他值,也会发生同样的事情。如果我完全保持扩展代码和设置不变,则不会出现问题。但是一旦我改变了一些值,即使我把这些设置改回来,它也会完全崩溃。

这发生在两台不同的 Mac 上,分别是 10.13 和 10.14 以及最新的 Xcode。

【问题讨论】:

通常情况下,当扩展程序已发布/发送给用户(权限、扩展程序名称,...)时,项目设置不必更改,否则扩展程序开发人员可能会严重滥用它。所以实际上这是 Safari 开发者选择保护用户的行为。如果开发人员制作的应用程序只有很少且无害的权限,然后在足够多的用户安装了他的应用程序后将权限更改为有害的权限,那会很糟糕......这就是 Safari(不是 Xcode)限制的原因通过自动禁用扩展来实现。 【参考方案1】:

我在 Mojave 上使用 Xcode 时遇到了这个确切的问题。我要做的是转到产品>清洁构建文件夹。这可能与您正在做的事情相同,但要容易一些。

【讨论】:

这对我来说是正确的答案。我假设一旦扩展运行它就保存在内存中,所以重新编译什么都不做。您需要将其删除,以便 Safari 了解某些内容已更改,然后重新加载新版本。【参考方案2】:

我能够纠正此问题的唯一方法是转到您的构建目录并删除构建文件。

您首先必须停止您的项目,然后删除此目录: ~/Library/Xcode/DerivedData/[YOUR_PROJECT_NAME]/Build/Projects/Debug

YOUR_PROJECT_NAME 将是您的项目名称加上一堆随机字符,因此您需要自己搜索此文件夹的真实名称。

【讨论】:

【参考方案3】:

您可以编辑_____extension.appex 的方案,并将其可执行文件设置为Safari.app。每次构建/运行扩展(而不是包装器)时,都会打开一个新的 Safari 实例。这也将使 Xcode 控制台显示扩展的输出。不过要小心;如果 Safari 崩溃,您可能会丢失您打开的所有选项卡。这样,您不必清理构建文件夹(或手动删除 Finder 中的文件)。

【讨论】:

以上是关于Safari App Extension 没有第二次加载的主要内容,如果未能解决你的问题,请参考以下文章

Safari Extension Companion 始终为空

来自 Share Extension 的 Safari 截图

iOS9 Share Extension 无法在 Xcode 上调试

在我的应用程序中从我的 Today Extension(小部件)打开 Safari

iOS In App Purchase in Action Extension 应用程序

用户未在 Share App Extension 中登录 Firebase