- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一对实现 XPC 主应用程序 + 服务应用程序模式的 Swift Xcode 目标。我想出了如何来回传递自定义类,作为远程对象方法的参数或“返回值”(即完成处理程序/回复 block 的参数)。这一切都很好。
现在我正尝试添加一个新问题:使用来自服务的自定义类的 NSArray 调用完成处理程序,以将它们返回到主应用程序。我从Apple's docs了解到(和 this Obj-C answer )我需要在接收端的 NSXPCInterface
上将我的自定义类列入白名单。但我无法弄清楚如何在 Swift 中执行此操作。在线和文档中的所有示例都在 Obj-C 中,我很难在 Swift 中找到正确的等效项。
具体来说,这是我的自定义类的简化版本:
@objc(PartialSnapshot) public class PartialSnapshot : NSObject, NSSecureCoding {
public var rawPaths: [String]
public static var supportsSecureCoding: Bool = true
public func encode(with coder: NSCoder) {
coder.encode(rawPaths, forKey: "rawPaths")
}
public required init?(coder: NSCoder) {
guard
let rawPaths = coder.decodeObject(of: [NSArray.self], forKey: "rawPaths") as? [String]
else {
NSLog("PartialSnapshot: returning nil from init?(coder: NSCoder)")
return nil
}
self.rawPaths = rawPaths
}
}
@objc(ReadAllSnapshotsRpcReturnType) public class ReadAllSnapshotsRpcReturnType : NSObject, NSSecureCoding {
var partials: [PartialSnapshot]
public static var supportsSecureCoding: Bool = true
public func encode(with coder: NSCoder) {
coder.encode(partials, forKey: "partials")
}
public required init?(coder: NSCoder) {
guard
let partials = coder.decodeObject(of: [NSArray.self], forKey: "partials") as? [PartialSnapshot]
else {
NSLog("ReadAllSnapshotsRpcReturnType: returning nil from init?()")
return nil
}
self.partials = partials
}
}
还有我在远程对象协议(protocol)上的方法签名:
@objc func ReadAllSnapshotsRpc(then completion: @escaping (ReadAllSnapshotsRpcReturnType?, Error?) -> Void)
我想我大概知道我需要从 this Objective-C answer 做什么.当我在主应用程序中创建我的 NSXPCConnection
时,我需要添加一行,如下面的第三行:
let connection = NSXPCConnection(machServiceName: SecurityProxyConstants.domain, options: .privileged)
connection.remoteObjectInterface = NSXPCInterface(with: SecurityProxyProtocol.self)
connection.remoteObjectInterface?.setClasses(ReadAllSnapshotsRpcReturnType.self, for: #selector(PartialSnapshot.self), argumentIndex: 0, ofReply: true)
但是,我显然没有完全正确的语法,而且我尝试过的许多语法变体也没有编译。谁能指出我正确的方向?
编辑:这是我遇到的运行时错误,让我相信我需要加入白名单:
<NSXPCConnection: 0x600003f5b0c0> connection to service with pid 9679 named com.mycompany.MyApp.SecurityProxy: Exception caught during decoding of reply to message 'ReadAllSnapshotsRpcWithThen:', dropping incoming message and calling failure block.
Ignored Exception: Exception while decoding argument 0 (#1 of invocation):
<NSInvocation: 0x600001bdb740>
return value: {v} void
target: {@?} 0x0 (block)
argument 1: {@} 0x0
argument 2: {@} 0x0
Exception: value for key 'NS.objects' was of unexpected class 'PartialSnapshot' (0x10c7abe00) [/Users/mwg/Library/Developer/Xcode/DerivedData/MyApp-brumjpaxvoxfmjchpswlfnbsarho/Build/Products/Debug/MyApp.app].
Allowed classes are:
{(
"'NSArray' (0x7ff8485798a0) [/System/Library/Frameworks/CoreFoundation.framework]"
)}
最佳答案
在这种情况下你不需要白名单,这里是文档:
如果您发布的界面看起来像这样,则需要它
@objc func ReadAllSnapshotsRpc(then completion: @escaping (NSArray?, Error?) -> Void)
即如果您要返回一个未知的不透明数组,但是您返回明确类型化的对象,那么所有其他内容都在 NSSecureCoding
上,如所述。
更新:所述错误的原因在于解码 - 解码时应枚举所有类。以下是固定变体:
public required init?(coder: NSCoder) {
guard
let partials = coder.decodeObject(of: [NSArray.self, PartialSnapshot.self], forKey: "partials") as? [PartialSnapshot]
else {
NSLog("ReadAllSnapshotsRpcReturnType: returning nil from init?()")
return nil
}
self.partials = partials
}
关于swift - 如何在 Swift 中将 XPC 自定义类列入白名单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72710588/
我正在尝试创建 XPC 服务,但似乎没有创建该服务。在我的服务的 main 方法中,我做的第一件事是对 syslog 进行一些调用,以便我可以查看服务是否开始运行。这些日志消息永远不会出现在日志中。
我正在开发一个应用程序,其中我从主应用程序中分离出了两个不同的 XPC 服务。我希望 XPC 服务与其他 XPC 服务进行通信,其他 XPC 服务将进行一些处理并将数据返回到第一个服务,第一个服务将进
我正在开发一个应用程序,其中我从主应用程序中分离出了两个不同的 XPC 服务。我希望 XPC 服务与其他 XPC 服务进行通信,其他 XPC 服务将进行一些处理并将数据返回到第一个服务,第一个服务将进
免责声明:我是 MacOS/Xcode 的新手 我想在 Swift 中构建一个简单的 XPC 启动代理(即:在 ~/Library/LaunchAgents 中)但我找不到太多文档。 我从 Xcode
在我的主应用程序包中,我包含了支持 XPC 服务。应用程序是沙盒的,一切都工作得很好,除了当我从 XPC 服务应用程序调用 [[NSUserDefaults standardUserDefault]
我按照 Apple 推荐的高风险操作实现了 XPC。问题是,当 XPC 崩溃时,它会向用户显示崩溃对话框。我知道这段代码有时会崩溃,这就是我首先实现 XPC 的原因。那么有什么办法可以抑制崩溃报告吗?
我正在尝试将 Wine 1.7.13 移植到现代 Cocoa 中。我正在考虑在 XPC 服务的进程中运行 Windows 二进制文件,以实现安全隔离和防崩溃。然而,有一个问题:据我所知,XPC 服务是
我正在使用 C 接口(interface)来实现 XPC 服务;顺便说一句,除了以下问题之外,我的 XPC 服务运行得非常好。 有一天我尝试通过 XPC 发送一个“大”数组; 200,000 个条目的
这不是一个与代码相关的问题,因为我在过去 2 小时内没有添加任何新代码,但我正在使用这个 cocoapod ( https://github.com/ealeksandrov/EAIntroView)
我正在尝试检测是否通过错误处理程序安装了辅助工具,但错误 block 不会被执行,成功 block 也不会执行。当 helper 已经安装时,它工作正常。它只是在有错误时不捕获错误。在文档中总是执行这
我有一段代码使用 NSURLsession 触发几个请求,有时我在 xcode 的调试器上收到以下消息 received XPC error Connection interrupted for me
是否可以在 XPC 服务中使用 AVFoundation 和 OpenCV?我有这么简单的代码 #include #import @interface AppDelegate(){ cv:
我在从 XPC 服务的 block 回调中传输 NSAttributtedString 时遇到了很大的问题。 我试图将基本字符串返回为: NSDictionary *arrayComa = @{NSF
我有一个 LaunchAgent,使用 HockeyApp 进行崩溃报告。现在我注意到 HockeyApp 没有报告未捕获的异常,就像在普通的 macOS 应用程序中一样。 例如: - (void)u
我的 cocoa 应用程序设计是一个 .app(UI)和三个 XPC 服务。 主应用程序需要文件只读才能显示powerbox并在 UI 中显示所选路径 com.apple.security.app-s
我有一个窗口应用程序,为了添加一些功能,我需要另一个应用程序,该应用程序在登录时启动并将数据同步到服务器(如果可用)。 我尝试过 NSDistributionNotification,但它在沙盒应用程
我成功创建了 XPC 服务并通过从主应用程序发送消息与 XPC 服务进行通信。但我想知道的是,是否可以发起从XPC服务到主应用程序的通信。 Apple documentation说XPC是双向的。如果
我最近升级到 Swift 5、Xcode 版本 10.2 (10E125),在修复了正在进行的应用程序上的一些编译问题后,看到了这个新的、以前从未见过的请求。通过直接搜索,我在我的项目中找不到任何证据
我的应用程序包含一个内核扩展作为关键组件。该内核扩展由系统控制套接字控制。出于安全原因,该系统控制套接字仅接受来自 super 用户的连接。 为了从我的常规非 super 用户应用程序进行通信,我有一
我正在尝试获得一个简单的命令行 Swift 应用程序,稍后将用于与 Chrome\Firefox 进行本地消息传递,以与工作场所的其他应用程序进行通信。 主 UI 应用程序(即 XPC 服务器): /
我是一名优秀的程序员,十分优秀!