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

时间:2012-07-18 07:38:16

标签: objective-c macos cocoa

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

4 个答案:

答案 0 :(得分:16)

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

备注

此演示应用程序和您的应用程序仅在部署时才有效,最好在/Applications/MyGreat.app中,不会从Xcode调试文件夹中可靠地工作。< / p>

项目设置

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

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

    1. 将ServiceManagement.framework导入主应用程序(而非助手)并在.h文件中包含#import <ServiceManagement/ServiceManagement.h>
    2. 从Github获取StartAtLoginController。这是一个易于使用的类,由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. 来完成
    6. 在.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];
          }
      }
      
    7. 就是这样。正如您在此项目中看到的,您可能需要使用其他一些方法,例如:

      if ([loginController startAtLogin]) {
          NSLog(@"Error");
      }
      

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

      BOOL startsAtLogin = [loginController startAtLogin];
      if (startsAtLogin) {
          // Do stuff
      }
      

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

    8. 帮助应用程序代码设置

      请务必严格按照您的实施方式测试此代码。

      1. 默认情况下,导航到支持文件组中的HelperApp.plist,使您的帮助应用程序成为UIElement。在底部添加一行,其中键Application is agent (UIElement)YES作为值(这将禁止应用程序在每次用户启用登录时闪烁停靠图标)我还删除了所有内容除了界面构建器中的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];
        

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

      4. 就是这样。
      5. 部署

        在为自己或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)

答案 2 :(得分:2)

对于沙盒应用程序,您需要创建特殊的Login Item帮助程序应用程序(位于Contents / Library / LoginItems中)。查看更多here。另请注意,您的应用必须从/ Applications文件夹启动才能正确使用登录项。

答案 3 :(得分:0)

让沙盒应用在登录时启动的设置非常耗时,而且很容易出错。这就是为什么我制作了一个Swift软件包来使其自动化。使用我的LaunchAtLogin软件包,您要做的就是在Xcode中添加一个构建步骤,然后编写两行代码:

import LaunchAtLogin

LaunchAtLogin.isEnabled = true