Mac OS X:在应用程序商店中启动时启动?

pAK*_*-76 8 macos cocoa objective-c

我需要在系统启动时启动我的应用程序,但问题是:它已经在App Store中,所以我必须遵循一些规则,比如使用沙盒.这导致所需函数失败,如LSSharedFileListInsertItemURLSMLoginItemSetEnabled.在这种情况下我该怎么做?

Kei*_*ley 16

我最近经历了同样的过程,不幸的是,使用沙盒它并不像以前那么容易.我使用非常详细的说明制作了一个测试应用程序,现在在Github上

笔记

这个演示应用程序和应用程序,如果他们被部署只会工作的最好/Applications/MyGreat.app,并不会从Xcode的debug文件夹中可靠地工作.

项目设置

这些是我的项目的设置,与此实现完美配合.

  1. 在启用ARC的情况下创建新项目
  2. Sandbox你的主要应用程序和帮助程序应用程序(如果你还没有创建帮助程序,我们很快就会得到它)我也启用了代码签名
  3. 由于这只是一个测试应用程序,因此我没有主应用程序或帮助程序的有效权利
  4. 如果您还没有,请创建一个帮助应用程序.转到项目设置,然后单击"添加目标",选择一个Cocoa应用程序.将其命名为MyAwesomeProjectHelper,同时启用ARC.(我把它的"App Store类别"留空了)
  5. 现在选择主应用程序的Target.转到构建阶段 - >添加构建阶段 - >添加复制文件.
  6. 将目标更改为包装器.Contents/Library/LoginItems仅在未选中安装时使子路径保留复制.将助手应用程序从左侧的Products拖到tableview中.

主应用程序代码设置

  1. 将ServiceManagement.framework导入主应用程序(而不是助手)并包含#import <ServiceManagement/ServiceManagement.h>在.h文件中
  2. 抓住StartAtLoginController从GitHub.这是一个易于使用的类,由Alex Zielenski来处理添加,删除和查询登录项的复杂性.导入StartAtLoginController.h到您的h文件中.
  3. 创建控制此设置的任何界面.如果您的应用程序自动启用此功能,将从Mac App Store拒绝(根据指南#2.26)
  4. 实现一个方法,比如- (IBAction)checkChanged:(id)sender我将一个简单的复选框绑定到StandardUserDefaults.(如果您选择执行其他操作,则此实现可能会有所不同.)我还将复选框绑定到IBOutlet NSButton *loginCheck;以确定其状态.这也可以通过[[NSUserDefaults standardUserDefaults] boolForKey:YourKey]
  5. 在.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];
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  6. 而已.正如您在此项目中看到的,您可能希望使用其他一些方法,例如:

    if ([loginController startAtLogin]) {
        NSLog(@"Error");
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在启用或禁用设置以确保其正常工作后进行检查.或这个:

    BOOL startsAtLogin = [loginController startAtLogin];
    if (startsAtLogin) {
        // Do stuff
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果启用了登录助手,则执行某些操作.

帮助应用程序代码设置

确保使用您的实现大力测试此代码.

  1. 通过导航到默认情况下位于Supporting Files组中的HelperApp.plist,使您的帮助应用程序成为UIElement.在底部添加一行,使用Key Application is agent (UIElement)YESValue (这将阻止应用程序在每次用户启用登录时闪存停靠图标)我还删除了除界面构建器中的App Delegate之外的所有内容
  2. 删除默认方法- (void)applicationDidFinishLaunching:(NSNotification *)aNotification并替换为- (void)applicationWillFinishLaunching:(NSNotification *)aNotification
  3. 在此方法中实现与此类似的代码.

    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];
    
    Run Code Online (Sandbox Code Playgroud)

    此代码找到您的主应用程序,确定它的二进制可执行文件(在沙箱中启动应用程序所需)打开您的应用程序,然后退出

  4. 而已.

部署

在为自己或Mac App Store部署应用程序时,您应该做的最后一件事是从已存档项目中删除您的Helper应用程序.通过导航到HelperApp的目标 - >构建设置 - >跳过安装并为发布设置是,执行此操作.Apple提供了更多信息(http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Conceptual/Xcode4UserGuide/000-About_Xcode/about.html)