システムの起動時にアプリを起動する必要がありますが、問題は、アプリがすでにApp Storeにあるため、サンドボックスの使用などのいくつかのルールに従う必要があることです。これにより、LSSharedFileListInsertItemURLやSMLoginItemSetEnabledなどの目的の関数が失敗します。この場合、どのように行動すればよいですか?
4 に答える
私は最近、これと同じプロセスを実行しましたが、残念ながら、サンドボックスを使用すると、以前ほど簡単には実行できません。非常に詳細な手順でテストアプリケーションを作成しました。これは現在Githubにあります
ノート
このデモアプリケーションとアプリケーションは、できればにデプロイされている場合にのみ機能し、Xcodeデバッグフォルダーからは確実に機能/Applications/MyGreat.app
しません。
プロジェクト設定
これらは、この実装で完全に機能した私のプロジェクトの設定です。
- ARCを有効にして新しいプロジェクトを作成する
- メインアプリケーションとヘルパーアプリケーションの両方をサンドボックス化します(ヘルパーをまだ作成していない場合は、まもなく作成します)コード署名も有効にしました
- これは単なるテストアプリケーションであったため、メインアプリケーションとヘルパーのどちらにもアクティブな資格がありませんでした
- まだ作成していない場合は、ヘルパーアプリを作成します。プロジェクト設定に移動し、「ターゲットの追加」をクリックして、Cocoaアプリケーションを選択します。ARCも有効にしたMyAwesomeProjectHelperなどの名前を付けます。(「AppStoreカテゴリ」は空白のままにしました)
- 次に、メインアプリケーションのターゲットを選択します。[ビルドフェーズ]->[ビルドフェーズの追加]->[コピーファイルの追加]に移動します。
- 宛先をラッパーに変更します。チェックを外してインストールする場合にのみ、サブパス
Contents/Library/LoginItems
をコピーのままにします。ヘルパーアプリケーションを左側の製品からテーブルビューにドラッグします。
メインアプリケーションコードの設定
- ServiceManagement.frameworkをメインアプリケーション(ヘルパーではない)にインポート
#import <ServiceManagement/ServiceManagement.h>
し、.hファイルに含めます - GithubからStartAtLoginControllerを取得します。これは、ログインアイテムの追加、削除、クエリの複雑さに対処するためのAlexZielenskiによる使いやすいクラスです。
StartAtLoginController.h
hファイルにインポートします。 - この設定を制御するために必要なインターフェイスを作成します。アプリケーションがこれを自動的に有効にする場合、Mac App Storeから拒否されます(ガイドライン#2.26による)
- (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 }
ログインヘルパーが有効になっている場合に何かを行うため。
ヘルパーアプリケーションコードの設定
実装でこのコードを精力的にテストしてください。
- デフォルトでSupportingFilesグループにあるHelperApp.plistに移動して、ヘルパーアプリケーションをUIElementにします。下部にキー
Application is agent (UIElement)
とYES
値として行を追加します(これにより、ユーザーがログイン時に起動を有効にするたびにアプリケーションがドックアイコンを点滅するのを抑制します)InterfaceBuilderのAppDelegateを除くすべても削除しました - デフォルトの方法を消去して、次の
- (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];
このコードは、メインアプリケーションを見つけ、そのバイナリ実行可能ファイル(サンドボックス内でアプリケーションを起動するために必要)を判別して、アプリケーションを開き、終了します
- それでおしまい。
配備
アプリケーションを自分用またはMacAppStoreにデプロイするときに最後に行う必要があるのは、アーカイブ済みアイテムからヘルパーアプリを削除することです。これを行うには、HelperAppのターゲット->ビルド設定->インストールをスキップし、リリースに[はい]を設定します。Appleは、(http://developer.apple.com/library/ios/#documentation/ToolsLanguages/Conceptual/Xcode4UserGuide/000-About_Xcode/about.html)で詳細情報を提供しています。
サンドボックス化されたアプリケーションの場合、特別なログインアイテムヘルパーアプリケーション(Contents / Library / LoginItems内にあります)を作成する必要があります。詳しくはこちらをご覧ください。また、ログインアイテムが正しく機能するには、アプリを/Applicationsフォルダーから起動する必要があることに注意してください。
自分のアプリにLoginItemを実装したところ、次のリンクの情報が役に立ちました。
ユーザーログイン時に起動するMacアプリのヘルパーアプリケーションを作成するにはどうすればよいですか?
https://github.com/tcurdt/TCLoginItemHelper
http://www.delitestudio.com/2011/10/25/start-dockless-apps-at-login-with-app-sandbox-enabled/
サンドボックス化されたアプリをログイン時に起動するためのセットアップには時間がかかり、手順を間違えるのは簡単です。それが私がそれを自動化するためにSwiftパッケージを作った理由です。私のLaunchAtLogin
パッケージでは、Xcodeにビルドステップを追加してから、2行のコードを記述するだけです。
import LaunchAtLogin
LaunchAtLogin.isEnabled = true