gpt4 book ai didi

swift - 实现了助手应用程序但未在登录时启动

转载 作者:搜寻专家 更新时间:2023-10-30 21:56:30 25 4
gpt4 key购买 nike

我需要在用户登录时启动我的 Mac 应用程序。

这是我做的:

我创建了一个新的 Coca 应用程序目标。

• build设置将“跳过安装”设置为"is"

• Info.plist“应用程序仅在后台”为"is"

• 在主应用和辅助应用上都启用了沙盒。

• 向主应用程序添加了复制文件阶段:Wrapper、Contents/Library/LoginItems,添加了 Helper.app

Helper应用的AppDelegate.swift

import Cocoa
import ServiceManagement
extension Notification.Name {
static let killLauncher = Notification.Name("killLauncher")
}

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

@objc func terminate() {
NSApp.terminate(nil)
}

func applicationDidFinishLaunching(_ aNotification: Notification) {
print("hi")
let mainAppIdentifier = "co.myprogress.osx"
let runningApps = NSWorkspace.shared.runningApplications
let isRunning = !runningApps.filter { $0.bundleIdentifier == mainAppIdentifier }.isEmpty

if !isRunning {
DistributedNotificationCenter.default().addObserver(self,
selector: #selector(self.terminate),
name: .killLauncher,
object: mainAppIdentifier)

let path = Bundle.main.bundlePath as NSString
var components = path.pathComponents
components.removeLast()
components.removeLast()
components.removeLast()
components.append("MacOS")
components.append("TODOs Menubar") //main app name

let newPath = NSString.path(withComponents: components)

NSWorkspace.shared.launchApplication(newPath)
}
else {
self.terminate()
}
}

func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}


}

主应用的AppDelegate.swift

func applicationDidFinishLaunching(_ aNotification: Notification) {
let launcherAppId = "co.myprogress.TodosMenubarHelper"
let runningApps = NSWorkspace.shared().runningApplications
let isRunning = !runningApps.filter { $0.bundleIdentifier == launcherAppId }.isEmpty

let ret = SMLoginItemSetEnabled(launcherAppId as CFString, true)
print(ret)

if isRunning {
DistributedNotificationCenter.default().post(name: .killLauncher,
object: Bundle.main.bundleIdentifier!)
}

}

测试

• Cmd + B 构建应用程序

• 右键单击​​产品中的 .app > 在 Finder 中显示

• 已启动的应用程序

• 注销

• 重新登录——预期:应用程序启动。发生了什么:应用程序没有启动

最佳答案

不是一个完整的解决方案,但可能有助于调试:

我关注了this tutorial其中描述的步骤与您的步骤非常相似。我还将应用程序存档并导出为 Developer ID 应用程序,并将其安装到/Applications 中。

结果:它对我也不起作用。

打开 Console.app 后,system.log 显示了很多如下行,每 10 秒出现一次:

May 24 21:18:16 FooBar com.apple.xpc.launchd[1] (my.domain.TestHelper[43372]): Could not resolve CFBundleIdentifier specified by service: -10814: my.domain.TestHelper

即通过 SMLoginItemSetEnabled 注册 helper 有效,但系统找不到它。手动打开主应用程序并禁用登录时启动功能后,不再显示任何消息。注销似乎也有效。

最后我尝试在 Terminal.app 中手动打开主应用程序:

$ open -b my.domain.Test

它从各种 Xcode 构建位置和文件中打开了许多旧构建!因此,宁愿使用干净的系统来尝试该功能。否则,启动服务会打开主应用程序或辅助应用程序的意外版本。从 Xcode 测试该功能似乎是不可能的。

Apple还记录了登录项工作必须满足的一些条件。

有了一个干净的系统,我可以让它工作。

关于swift - 实现了助手应用程序但未在登录时启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50417312/

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