hello world 项目的 safari 应用程序扩展在几秒钟后崩溃

Posted

技术标签:

【中文标题】hello world 项目的 safari 应用程序扩展在几秒钟后崩溃【英文标题】:safari app extension crashes after a few seconds for hello world project 【发布时间】:2018-10-10 22:33:57 【问题描述】:

    打开xcode

    file > new >project > Cocoa app

    文件 > 新建 > 目标 > Safari 扩展

    编译运行扩展

    选择 Safari。

    xcode 编译没有错误。

Safari 打开几秒钟然后崩溃。

这是调试窗口的输出。

2018-10-10 15:27:18.039905-0700 Safari[1020:16719] [SQLiteStore] 获取数据库存储协调锁失败 /Users//Library/Safari/Favicon Cache/favicons.db-lock: 【35:资源暂时不可用】2018-10-10 15:27:18.040155-0700 Safari[1020:16719] [SQLiteStore] 无法获得对 数据库位于 文件:///Users//Library/Safari/Favicon%20Cache/favicons.db。 2018-10-10 15:27:18.041141-0700 Safari [1020:16719] [SQLiteStore] 获取数据库存储协调锁失败 /Users//Library/Safari/Favicon Cache/favicons.db-lock: 【35:资源暂时不可用】2018-10-10 15:27:18.041226-0700 Safari[1020:16719] [SQLiteStore] 无法获得对 数据库位于 文件:///Users//Library/Safari/Favicon%20Cache/favicons.db。 2018-10-10 15:27:18.041331-0700 Safari [1020:16719] [SQLiteStore] 回退到内存存储 2018-10-10 15:27:18.042877-0700 Safari[1020:16719] [FaviconPersistence] 使用内存表示 用于数据库 /Users//Library/Safari/Favicon 缓存/favicons.db 2018-10-10 15:27:18.125466-0700 Safari[1020:16771] [SQLiteStore] 获取数据库存储协调锁失败 /Users//Library/Caches/com.apple.Safari/TabSnapshots/Metadata.db-lock: 【35:资源暂时不可用】2018-10-10 15:27:18.125660-0700 Safari[1020:16771] [SQLiteStore] 无法获得对 数据库位于 文件:///Users//Library/Caches/com.apple.Safari/TabSnapshots/Metadata.db。 2018-10-10 15:27:18.235987-0700 Safari [1020:16718] 群未能 锁定映射文件:errno = 35 2018-10-10 15:27:18.236343-0700 Safari [1020:16718] 群未能锁定地图文件:errno = 35 2018-10-10 15:27:18.293614-0700 Safari[1020:16718] 获取失败 独家访问 AutoFill 更正 SQLite 存储在 自动填充校正.db。未能获得对自动填充的独占访问权限 更正 SQLite 存储在 AutoFillCorrections.db。 2018-10-10 15:27:18.299481-0700 Safari[1020:16718] 获取独占失败 访问自动填充更正 SQLite 存储在 CloudAutoFillCorrections.db。无法获得独占访问权限 自动填充更正 SQLite 存储在 CloudAutoFillCorrections.db。 2018-10-10 15:27:18.300530-0700 Safari[1020:16718] 获取失败 独家访问 AutoFill 更正 SQLite 存储在 自动填充校正.db。未能获得对自动填充的独占访问权限 更正 SQLite 存储在 AutoFillCorrections.db。 2018-10-10 15:27:18.304153-0700 Safari[1020:16718] 获取独占失败 访问自动填充更正 SQLite 存储在 CloudAutoFillCorrections.db。无法获得独占访问权限 自动填充更正 SQLite 存储在 CloudAutoFillCorrections.db。 2018-10-10 15:27:18.620185-0700 Safari[1020:16763] 获取失败 独家访问 AutoFill 更正 SQLite 存储在 自动填充校正.db。未能获得对自动填充的独占访问权限 更正 SQLite 存储在 AutoFillCorrections.db。 2018-10-10 15:27:18.623032-0700 Safari [1020:16773] [众包自动填充] 无法 读取云自动填充校正集,错误:错误 Domain=NSCocoaErrorDomain Code=260 "文件无法打开 因为它不存在。” 2018-10-10 15:27:18.629453-0700 Safari[1020:16763] 无法获得对自动填充的独占访问权限 更正 SQLite 存储在 CloudAutoFillCorrections.db。失败 在以下位置获得对 AutoFill 更正 SQLite 存储的独占访问权限 CloudAutoFillCorrections.db。 2018-10-10 15:27:18.675086-0700 Safari[1020:16765] [CloudBookmarks] 获取远程迁移时出错 状态:错误 Domain=com.apple.SafariBookmarksSync.CloudBookmarksErrorDomain Code=0 “(空)” 2018-10-10 15:27:18.771588-0700 Safari [1020:16718] [RemotePlistController] 下载的 plist 无法加载: Error Domain=NSCocoaErrorDomain Code=260 "文件无法打开 因为它不存在。” 2018-10-10 15:27:19.161007-0700 Safari[1020:16773] 无法获得对自动填充的独占访问权限 更正 SQLite 存储在 AutoFillCorrections.db。获取失败 独家访问 AutoFill 更正 SQLite 存储在 自动填充校正.db。 2018-10-10 15:27:19.167933-0700 Safari[1020:16773] 无法获得对自动填充的独占访问权限 更正 SQLite 存储在 CloudAutoFillCorrections.db。失败 在以下位置获得对 AutoFill 更正 SQLite 存储的独占访问权限 CloudAutoFillCorrections.db。 2018-10-10 15:27:19.279743-0700 Safari[1020:16763] [RemotePlistController] 下载的 plist 可以 未加载:错误域=NSCocoaErrorDomain Code=260 "该文件 无法打开,因为它不存在。” 2018-10-10 15:27:20.064438-0700 Safari[1020:16763] 获取独占失败 访问 AutoFillCorrections.db 中的 AutoFill 更正 SQLite 存储。 未能获得对自动填充更正 SQLite 的独占访问权限 存储在 AutoFillCorrections.db 中。 2018-10-10 15:27:20.081337-0700 Safari[1020:16763] 无法获得对自动填充的独占访问权限 更正 SQLite 存储在 CloudAutoFillCorrections.db。失败 在以下位置获得对 AutoFill 更正 SQLite 存储的独占访问权限 CloudAutoFillCorrections.db。 2018-10-10 15:27:20.084003-0700 Safari[1020:16763] [CrowdsourcedAutoFill] 既不是本地也不是云 分类校正数据库可以打开程序结束于 退出代码:0

我已尝试重新启动计算机。

我已经尝试清理项目。

我尝试使用

删除元数据
xatter -cr .

三个我都试过了。

【问题讨论】:

这有帮助吗? ***.com/questions/52586564/… 【参考方案1】:

如果 Xcode 调试器没有从内容脚本接收到任何事件,它会终止扩展进程。根据我的观察,这完全没问题,并且在生产中您的应用不会那么容易死掉(已编辑:这不是真的,请看帖子底部)

为了规避这种行为,您可能需要将此 sn-p 添加到您的 script.js

setInterval(() => safari.extension.dispatchMessage("ping", ), 1000);

它将使内容脚本每秒向扩展程序发送一条名为“ping”的消息。这应该足以让您的扩展程序保持活力。同样,这只是调试真正需要的,您的生产构建不需要此行可靠地工作(已编辑:这不是真的,请查看帖子底部)

请记住,默认情况下,内容脚本仅注入 *.webkit.org 页面。这是由扩展的Info.plist 文件中SFSafariToolbarItem 属性的值决定的。出于测试目的,您可能希望在所有网站上启用您的扩展程序,如下所示:

<key>SFSafariWebsiteAccess</key>
<dict>
  <key>Level</key>
  <string>All</string>
</dict>

请注意,内容脚本不会注入到空选项卡中,因此请务必加载一些远程页面。

更新

显然,Safari 实际上会像在调试器中那样杀死生产构建中的扩展。所以 setInterval() hack 在这种情况下仍然是相关的。这仅适用于没有弹出框的扩展。

【讨论】:

我已经创建了扩展构建并将其安装在 safari 中,但在 30 次不活动后它仍在处理 几个月后,我发现在其他情况下不会发生这种行为。例如。对我来说,Xcode 从不使用弹出视图控制器杀死扩展。 这个答案是错误的。你不应该使用setTimeout,而应该使用setInterval 感谢您指出这一点,@ChristopherJ。我编辑了我的答案来解决这个问题。【参考方案2】:

在第一次运行时,您应该选择您的 Cocoa App 目标,然后才运行扩展。请先尝试构建并运行您的应用,然后说是否有帮助。

【讨论】:

这对我有点用。扩展程序出现并且可以正常工作。但是我在控制台中遇到了同样的错误。

以上是关于hello world 项目的 safari 应用程序扩展在几秒钟后崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Rust 入门搭建开发环境构建我们的第一个应用 Hello World及cargo项目

spring-boot实战01:Hello World项目搭建

使用nwjs开发桌面应用之Hello,World!

简单的Flask项目,hello world!

Windows10 IoT开发系列“Hello,World!”指导

如何将 SimplSockets 与委托一起用于“hello world”项目?