gpt4 book ai didi

swift - Xcode+ swift +XPC : How to start and deploy a Swift XPC target on MacOS

转载 作者:行者123 更新时间:2023-11-28 06:05:18 25 4
gpt4 key购买 nike

免责声明:我是 MacOS/Xcode 的新手

我想在 Swift 中构建一个简单的 XPC 启动代理(即:在 ~/Library/LaunchAgents 中)但我找不到太多文档。
我从 Xcode XPC 模板开始,但我不知道这对我的 Swift 项目来说是否是个好主意。
我注意到我还应该有 ~/Library/LaunchAgents/com.demo.myservice.plist

版本:
- 苹果操作系统:10.13.2
-Xcode:9.2

创建 Xcode XPC 项目的说明:

  1. 文件 > 新项目
  2. 我选择了 MacOS 模板:XPC
  3. 我创建了包“com.demo.myservice”
  4. 它为我创建了一个 Objective-C 项目。所以我删除了所有文件(即:myserviceProtocol.hmyservice.hmyservice.mmain.mInfo.plist
  5. 创建文件:

myserviceProtocol.swift

import Foundation

@objc(myserviceProtocol) protocol myserviceProtocol {
func ping()
}

myservice.swift

import Foundation

class myservice : NSObject, myserviceProtocol {
func ping() {
print("ping")
}
}

main.swift

import Foundation

class ServiceDelegate : NSObject, NSXPCListenerDelegate {
func listener(_ listener: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool {
newConnection.exportedInterface = NSXPCInterface(with:myserviceProtocol.self)
let exportedObject = myservice()
newConnection.exportedObject = exportedObject
newConnection.resume()
return true
}
}

// Create the listener and resume it:
//
let delegate = ServiceDelegate()
let listener = NSXPCListener.service()
listener.delegate = delegate;
listener.resume()

Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>com.demo.myservice</string>
<key>ProgramArguments</key>
<array>
<string>myservice</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
  1. 我构建它: enter image description here

  2. 我将 Info.plist 复制到 ~/Library/LaunchAgents/中:cp ~/Documents/myservice/myservice/Info.plist ~/Library/LaunchAgents/com.demo .myservice.plist
    我使用 id -u

  3. 检索我的用户 ID

然后我尝试从命令行执行它(因为它似乎没有从 Xcode 执行任何操作):

sudo launchctl debug user/501/com.demo.myservice /Users/olivier/Library/Developer/Xcode/DerivedData/myservice-hbwefcgibyqbajguvblgcmxsnrmd/Build/Products/Debug/myservice.xpc
Configuration failed: 113: Could not find specified service
Could not find service "com.demo.myservice" in domain for uid: 501

我不太确定我在做什么。我使用 XPC 模板来创建我的 swift XPC 是否正确。

最佳答案

如果您希望您的 Agent 提供 XPC 服务,您需要将其公开为 Mach 服务。

您初始化监听器的方式是针对 XPC 服务(注意大写 S),XPC 服务是一个包,它是您应用程序包的一部分,位于 Contents/XPCServices/ 目录中.

总而言之,您必须:

1.) 创建一个通过 mach 服务公开 XPC 服务的代理。你的听众看起来像:

let listener = NSXPCListener(machServiceName: "com.rderik.exampleXPC" )

2.) 要使用代理的服务,您需要建立与该 mach 服务的连接。

let connection = NSXPCConnection(machServiceName: "com.rderik.exampleXPC")

希望对您有所帮助。

如果您想阅读更多内容,我在这里写了一篇关于如何做到这一点的教程:

https://rderik.com/blog/creating-a-launch-agent-that-provides-an-xpc-service-on-macos/

关于swift - Xcode+ swift +XPC : How to start and deploy a Swift XPC target on MacOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48412745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com