我需要在系统启动时启动我的应用程序,但问题是:它已经在App Store中,所以我必须遵循一些规则,比如使用沙盒。这会导致所需函数失败,例如 LSSharedFileListInsertItemURL 和 SMLoginItemSetEnabled 。在这种情况下我该怎么做?
答案 0 :(得分:16)
我最近经历了同样的过程,不幸的是,使用沙盒它并不像以前那么容易。我使用非常详细的说明制作了一个测试应用程序,现在是on Github
此演示应用程序和您的应用程序仅在部署时才有效,最好在/Applications/MyGreat.app
中,不会从Xcode调试文件夹中可靠地工作。< / p>
这些是我的项目的设置,与此实现完美配合。
Contents/Library/LoginItems
仅在未选中安装时保留复制。将助手应用程序从左侧的Products拖到tableview中。#import <ServiceManagement/ServiceManagement.h>
StartAtLoginController.h
导入您的h文件。- (IBAction)checkChanged:(id)sender
之类的方法我创建了一个与StandardUserDefaults绑定的简单复选框。 (如果您选择执行其他操作,则此实现可能会有所不同。)我还将复选框绑定到IBOutlet NSButton *loginCheck;
以确定其状态。这也可以通过[[NSUserDefaults standardUserDefaults] boolForKey:YourKey]
在.m文件中实现与此类似的代码。
StartAtLoginController *loginController = [[StartAtLoginController alloc] init];
[loginController setBundle:[NSBundle bundleWithPath:[[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"Contents/Library/LoginItems/HelperApp.app"]]];
// Change "HelperApp.app" to the name of your helper
if ([loginCheck state]) {
if (![loginController startAtLogin]) {
[loginController setStartAtLogin: YES];
}
} else {
if ([loginController startAtLogin]) {
[loginController setStartAtLogin:NO];
}
}
就是这样。正如您在此项目中看到的,您可能需要使用其他一些方法,例如:
if ([loginController startAtLogin]) {
NSLog(@"Error");
}
启用或禁用设置后进行检查以确保其正常工作。或者这个:
BOOL startsAtLogin = [loginController startAtLogin];
if (startsAtLogin) {
// Do stuff
}
如果启用了登录助手,则执行某些操作。
请务必严格按照您的实施方式测试此代码。
Application is agent (UIElement)
和YES
作为值(这将禁止应用程序在每次用户启用登录时闪烁停靠图标)我还删除了所有内容除了界面构建器中的App Delegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
并将其替换为- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
在此方法中实现与此类似的代码。
NSString *appPath = [[[[[[NSBundle mainBundle] bundlePath] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent] stringByDeletingLastPathComponent];
// This string takes you from MyGreat.App/Contents/Library/LoginItems/MyHelper.app to MyGreat.App This is an obnoxious but dynamic way to do this since that specific Subpath is required
NSString *binaryPath = [[NSBundle bundleWithPath:appPath] executablePath]; // This gets the binary executable within your main application
[[NSWorkspace sharedWorkspace] launchApplication:binaryPath];
[NSApp terminate:nil];
此代码找到您的主应用程序,确定它的二进制可执行文件(在沙箱中启动应用程序所需)打开您的应用程序,然后退出
在为自己或Mac App Store部署应用程序时,您应该做的最后一件事是从Archived项目中删除您的Helper应用程序。通过导航到HelperApp的目标来执行此操作 - &gt;构建设置 - &gt;跳过安装并为发布设置是。 Apple提供了更多信息(http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Conceptual/Xcode4UserGuide/000-About_Xcode/about.html)
答案 1 :(得分:4)
我刚为自己的应用程序实现了一个LoginItem,并在这些链接中找到了有用的信息:
How to create a helper application for Mac App to start it on user login?
https://github.com/tcurdt/TCLoginItemHelper
http://www.delitestudio.com/2011/10/25/start-dockless-apps-at-login-with-app-sandbox-enabled/
答案 2 :(得分:2)
对于沙盒应用程序,您需要创建特殊的Login Item帮助程序应用程序(位于Contents / Library / LoginItems中)。查看更多here。另请注意,您的应用必须从/ Applications文件夹启动才能正确使用登录项。
答案 3 :(得分:0)
让沙盒应用在登录时启动的设置非常耗时,而且很容易出错。这就是为什么我制作了一个Swift软件包来使其自动化。使用我的LaunchAtLogin
软件包,您要做的就是在Xcode中添加一个构建步骤,然后编写两行代码:
import LaunchAtLogin
LaunchAtLogin.isEnabled = true