【问题标题】:Using Swift with an OS X Preference Pane plugin将 Swift 与 OS X Preference Pane 插件一起使用
【发布时间】:2015-08-17 01:41:05
【问题描述】:

我想使用 Swift 为 System Preferences 应用程序构建一个 OS X Preference Pane 插件,但我无法让它工作。

单击“下一步”后,Xcode 模板不提供选择 Swift 作为语言的选项,而是自动在 Objective-C 中创建项目。

无需添加任何代码或执行任何其他操作,项目即可成功构建。如果您右键单击产品并选择“在外部编辑器中打开”,系统首选项将成功安装并加载首选项窗格。

效果很好!

这很好,但是现在,我想使用 Swift 添加一个新的 Cocoa 子类。

接受默认值,并允许它创建桥接头。

现在,退出系统偏好设置并不添加任何代码,重新构建项目。和以前一样,右键单击产品并“在外部编辑器中打开”。

系统偏好设置会确认替换偏好设置面板,它会安装它,但是加载失败。

如果您在 Finder 中显示构建的 Product,除了 .prefPane 插件之外,还有一个 .swiftmodule 文件夹。

我猜在构建阶段或构建设置中缺少一些东西,负责将 .swiftmodule 与包的其余部分合并,但一直无法弄清楚。

添加一些使用新类的代码后,需要导入 Swift 项目的伞头文件(“Prax-Swift.h”)来使项目编译,但是导入伞头文件并不能解决这个问题。

//  Prax.h

#import <PreferencePanes/PreferencePanes.h>
#import "Prax-Swift.h"

@interface Prax : NSPreferencePane

@property PraxObject *ourPrax;

- (void)mainViewDidLoad;

@end

我还尝试删除 Prax.h 和 Prax.m 并在 Swift 中简单地实现 NSPreferencePane 子类。和以前一样,项目构建和安装,但系统偏好设置无法加载它。

//  Prax.swift

import PreferencePanes

class Prax: NSPreferencePane {

    override func mainViewDidLoad() {

    }
}

对不起,如果我在这个问题中使用了太多图片;这似乎是解释问题并使其易于重现的最清晰方法。可能有一个简单的解决方案。有什么想法吗?

【问题讨论】:

  • 您查看过控制台应用程序吗?您可能会在此处找到错误消息。
  • 不,控制台中没有显示错误消息。有系统首选项活动消息,反映了“显示全部”和其他访问的首选项窗格,但没有关于它无法加载的那个。我不希望它提供有关该问题的太多线索,因为这似乎与 Xcode 没有正确构建插件包有关。

标签: xcode macos swift system-preferences nspreferencepane


【解决方案1】:

首先,您需要启用“Embedded Content Contains Swift”设置,以便 Xcode 将必要的 Swift 库复制到包中。

然后,你会得到这个错误:

系统偏好设置[68872]:dlopen_preflight 失败 dlopen_preflight(/.../preftest.prefPane/Contents/MacOS/preftest): 库未加载:@rpath/libswiftAppKit.dylib 引用自:/.../preftest.prefPane/Contents/MacOS/preftest 原因:找不到图像 for /.../preftest.prefPane

这意味着应用不知道从哪里加载包含的 Swift 库。

要解决此问题,请将 @loader_path/../Frameworks 添加到构建设置中的运行路径搜索路径,告诉它 Swift 库位于您的 prefpane 的 Frameworks 目录中:

有关动态加载的更多信息,请参阅dyld man page

【讨论】:

  • 是否还需要添加复制文件阶段,以便 Swift 库位于 Frameworks 目录中?
  • 酷!我所要做的就是打开“嵌入式内容包含 Swift 代码”的开关。运行时搜索路径已经存在,我不必添加复制文件阶段。谢谢,jtbandes!
  • 这仍然适用于 Swift 4 和 macOS High Sierra 吗?
  • @jtbandes 我正在使用 Swift 开发屏幕保护程序。它们也被安装到系统偏好设置中,苹果似乎改变了它们在 High Sierra 中的加载。见github.com/klaas/QlaasSwiftScreenSaverforums.developer.apple.com/message/268934#268934
  • @jtbandes 我刚刚在 Xcode 9.1 中使用 Swift 4 创建了一个虚拟首选项窗格,当在 High Sierra 下使用时它实际上像屏幕保护程序一样崩溃。很想看到s.o.验证我的发现。这是我的示例窗格:github.com/klaas/QlaasSwiftPreferencesPane 现在将创建一个雷达。
【解决方案2】:

macOS High Sierra 引入了一个 Apple 错误。此错误现已在 macOS 的最新 dot 版本中得到解决。有关工作示例项目,请参阅 https://github.com/klaas/QlaasSwiftPreferencesPane

【讨论】:

  • 这似乎不再起作用了。使用 macOS 10.5.2 和 Xcode 11.3.1。它只是在加载首选项窗格时显示错误。 (无法加载 QlaasSwiftPreferencesPane 首选项窗格。)设置始终嵌入 Swift 标准库解决了该错误。
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
相关资源
最近更新 更多