ログイン時に開く

現在、いわゆる「ログイン時に開く」を実装したアプリをApp Storeに申請中です。承認されるか、却下されるかわからないのですが、備忘録を残しておきたいと思います。

私がXcode 4.5で試した方法なので、それ以外ではOrganizerのValidateで却下されたり、うまくOrganaizerでSubmitできても、iTunes ConnectでInvalid Binaryと表示されるかもしれません。

SMLoginItemsSetEnabled関数を使う

  • App Storeに申請するにはSandbox化が必要です。
  • その為、AppleがdepreciatedしているLSSharedFileListInsertItemURL関数は使えない。
  • そこで、SMLoginItemsSetEnabled関数を使う。
  • ただし、この関数は次の条件でしか使えない。
    1. Contents/Library/LoginItemsにメインアプリを起動するヘルパーアプリが保存されていること。
    2. ヘルパーアプリは、LSUIElementもしくはLSBackgroundOnlyキーをInfo.plistファイルに設定していること。

StartAtLoginControlerを使う

Alex Zielenski氏の「StartAtLoginController」を使わせていただきました。

https://github.com/alexzielenski/StartAtLoginController:Title=https://github.com/alexzielenski/StartAtLoginController

ログイン項目に表示されない

SMLoginItemsSetEnabled関数を呼んでも、システム環境設定の「ユーザとグループ」にある、各ユーザのログイン項目に追加されませんでした。最初、関数の呼び出しに失敗したのかと思ったのですが、きちんとログイン時にアプリが開くため、バグではないと思うのですが。

他にやったこと

  • ヘルパーアプリ
    1. MainMenu.xibからメインウィンドウを削除。
    2. Info.plistのApplication is background onlyをYES。
    3. ヘルパーアプリのBuild SettingsにあるSkip InstallをYES。
  • メインアプリ
    1. アプリの環境設定で、「ログイン時に開く」を有効にした時、確認アラートを表示させ、可否を問う。
    2. ヘルパーアプリをContent/Library/LoginItemsにコピーする為、メインアプリのBuild PhaseにCopy FIleを追加。DestinationはWrapperで。
    3. ヘルパーアプリのembedded.provisionprofileを削除しないとOrganaizerのValidateが失敗するため、Build PhaseにRun Scriptを追加。
rm "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Contents/Library/LoginItems/${PRODUCT_NAME}Helper.app/Contents/embedded.provisionprofile"
  • 両アプリ
    1. Provisioning Profilesで作成し、インストール。
    2. ヘルパーもEnable App Sandboxingを有効にする。

余談

他に書き忘れていることはないかなぁ...