【发布时间】:2018-07-02 22:10:07
【问题描述】:
免责声明:我对 MacOS/Xcode 比较陌生
我想在 Swift 中构建一个简单的 XPC 启动代理(即:~/Library/LaunchAgents),但我找不到太多文档。
我从 Xcode XPC 模板开始,但我不知道这对我的 Swift 项目是否是个好主意。
我注意到我也应该有~/Library/LaunchAgents/com.demo.myservice.plist
版本:
- MacOS:10.13.2
- Xcode:9.2
Xcode XPC 项目创建说明:
- 文件 > 新建项目
- 我选择了 MacOS 模板:XPC
- 我创建了“com.demo.myservice”包
- 它为我创建了一个 Objective-C 项目。所以我删除了所有文件(即:
myserviceProtocol.h、myservice.h、myservice.m、main.m和Info.plist - 创建文件:
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>
我将
Info.plist复制到 ~/Library/LaunchAgents/ 中:cp ~/Documents/myservice/myservice/Info.plist ~/Library/LaunchAgents/com.demo.myservice.plist
我用id -u检索我的用户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。
【问题讨论】: