iPhoneアプリケーションを終了する適切な方法?


277

iPhoneアプリをプログラミングしていますが、特定のユーザーアクションのためにアプリを強制的に終了する必要があります。アプリが割り当てたメモリをクリーンアップした後、アプリケーションを終了するために呼び出す適切なメソッドは何ですか?


34
適切な方法は1つだけです
ベリリウム

5
プログラムで終了することを検討しているすべての人が想像できる唯一の状況は、次のシナリオです。これは、ブランドが開発者に圧力をかけることがあります。しかし、それは間違っています。
ダニエル

6
@Daniel通常、アプリをアップロードする際に、iTunes Connectに免責事項/利用規約(EULA)を記載します。ユーザーがアプリをダウンロードした場合、それはユーザーがEULAに同意したことを意味します
Paul de Lange

8
iOSアプリを強制終了する必要があるのには、完全に正当な理由があります。私の場合、アプリのリリース前ベータ版を配布しています。ベータ版はすべてのIAPを無料で開きます。これらには時間制限があり、数週間後に期限切れになる必要があります。だから私はベータ期間が終わった後にアプリを殺すために以下の答えを使用しています。LIVE版ではこれを削除します。しかし、それでも答えは私を助けて正解です!
badweasel 2013年

5
アプリを終了する有効な理由の1つは、アプリが長期間有効なバックグラウンド実行アプリであり、アプリがバックグラウンドで実行する必要がなくなった状態になった場合です。たとえば、ユーザーはログアウトします。この場合、アプリを次に起動したときにクリーンな状態で開始するように終了することは理にかなっています。これは、とりわけ、メモリリークに対するセーフティネットとして機能します。この場合、アプリはバックグラウンドで終了するため、ユーザーは何も問題に気付かないでしょう。
frankodwyer、2015年

回答:


217

試しましたexit(0)か?

または、[[NSThread mainThread] exit]私は試していませんが、より適切な解決策のようです。


85
これはAppleの禁止事項であるため(非標準インターフェースの場合、アプリストアでアプリが拒否される可能性があります)、8月の回答を「正しいもの」と見なしてください。ちなみに、この答え(ブレットのもの)はすべてのCプログラムに対して正しく、NSThreadはすべてのCocoaプログラムに対して正しいです。
Olie

21
Tech Q&A QA1561では、アプリがクラッシュしたように見えるため、Appleはexitの使用を強く推奨していません。 developer.apple.com/iphone/library/qa/qa2008/qa1561.html
progrmr

8
[[NSThread mainThread] exit]は、exitがインスタンスメソッドではないため、アプリケーションをクラッシュさせます。exit(0)は、iOS 4でアプリをバックグラウンドに送信します。exit(0)を再度呼び出すと、クラッシュします。少なくともシミュレータでは。
user123444555621 2010

10
なぜこれほど多くの人がこれに反対しているのか理解していますが、開発者に信用を与えるのはどうですか?私たちはすべて大人なので、この機能について知りたいのです。これは内部QAビルドに非常に役立ち、初めて検索したときに、この「誤った」答えを見てうれしかったです。
evanflash 2013年

7
@Kevin "Do n't do that"が正しい答えになることは決してありません。必要に応じて警告と免責事項を表示しますが、「これを行う方法」に対する唯一の正しい答えは「これを行う方法です」です。私が何かをする方法を探しているなら(たぶんデバッグ中にそれを強制的に終了させたいかもしれません)、人々は正当に「あなたはしないでください!」と宣言します。必要な答えを埋めようとするのは時間の無駄です。ただし、多くの人が何かをするのに悪い理由があるかもしれませんが、正しいStackOverflowの答えは質問に答えるものです。正当な理由のある人も同様にその方法を検索するためです。
Glenn Maynard 2016年

274

iPhoneでは、アプリを終了するという概念はありません。アプリを終了させる唯一のアクションは、電話のホームボタンをタッチすることであり、これは開発者がアクセスできるものではありません。

Appleによると、アプリはそれ自体で終了するべきではありません。ユーザーがホームボタンを押さなかったため、ホーム画面に戻ると、アプリがクラッシュしたような印象をユーザーに与えます。これは混乱を招く非標準的な動作であり、回避する必要があります。


13
私が言ったように、それは非標準的な振る舞いであり、避けられるべきです。iPhoneアプリはデスクトップアプリではありません。それらをそのように扱わないでください。
8月

8
アップルの意見は理解できますが、同様の状況です。アプリケーションにインターネットアクセスが必要です。それが利用できない場合、エラーメッセージが表示されるのではなく、アプリを離れることができます
Anthony Main

22
私たちは人々が眠るのを助けるアプリを持っています。バッテリーの消耗を減らすために、一定期間後にアプリを終了したいと考えています。私はこのケースは許容できると思います-ユーザーがうまくいけば眠っていて、手動でアプリを終了できないので。
JamesSugrue、2009年

36
私はまだ同意しません。彼らが目を覚ますと、アプリは「消えて」、ユーザーは何が起こったのか不思議に思うようになります。代わりに、アプリにタイマーを設定し、時間切れになったときにアプリをアイドル状態にします。アクティビティはありません。アプリはまったく何もしないので、バッテリーを消耗しません。Springboardもアプリです。エネルギーを節約するためだけにシャットダウンするわけではありません。代わりに、ユーザー入力を待つだけです。
8月

8
これは実際には質問の答えにはなりません。それは100%正確ですが、理想的にはOPの質問または承認された回答のいずれかに対するコメントであると思います。
Ben Zotto

49

exit(0)はクラッシュとしてユーザーに表示されるため、ユーザーに確認メッセージを表示します。確認後、サスペンド(ホームボタンをプログラムで押す)し、アプリがアニメーション付きでバックグラウンドになるまで2秒待ってから、ユーザーのビューの背後で終了します。

-(IBAction)doExit
{
    //show confirmation message to user
    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Confirmation"
                                                 message:@"Do you want to exit?"
                                                delegate:self
                                       cancelButtonTitle:@"Cancel"
                                       otherButtonTitles:@"OK", nil];
    [alert show];
}

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex != 0)  // 0 == the cancel button
    {
        //home button press programmatically
        UIApplication *app = [UIApplication sharedApplication];
        [app performSelector:@selector(suspend)];

        //wait 2 seconds while app is going background
        [NSThread sleepForTimeInterval:2.0];

        //exit app when app is in background
        exit(0);
    }
}

1
Appleはこの「exit(0)」を承認しますか?一部の人々はあなたが終了0を使用する場合、Appleがアプリケーションを拒否すると言うので
Gajendra K Chauhan

2
@GajendraKChauhan exit(0)は関係ありません。ポイントは、アプリに「終了動作」があることです。AppStoreでは、非常に重要なサードパーティによって作成されたいくつかのアプリを除いて、動作自体を終了することは禁止されています。また、ホームボタンの動作の模倣も拒否される可能性があります。
Eonil、2016

41

こちらのQ&Aを確認してください:https : //developer.apple.com/library/content/qa/qa1561/_index.html

Q:iOSアプリケーションをプログラムで終了するにはどうすればよいですか?

iOSアプリケーションを適切に終了するためのAPIは提供されていません。

iOSでは、ユーザーはホームボタンを押してアプリケーションを閉じます。アプリケーションに目的の機能を提供できない状況が発生した場合、推奨されるアプローチは、問題の性質とユーザーが実行できる可能なアクション(WiFiのオン、位置情報サービスの有効化など)を示すアラートをユーザーに表示することです。ユーザーが自分の裁量でアプリケーションを終了できるようにします。

警告:exit関数を呼び出さないでください。アプリケーションの呼び出しexitは、正常な終了を実行してホーム画面に戻るアニメーションではなく、クラッシュしたようにユーザーに表示されます。

また、exitを呼び出す-applicationWillTerminate:と同様のUIApplicationDelegateメソッドが呼び出されないため、データが保存されない場合があります。

開発またはテスト中にアプリケーションを終了する必要がある場合は、abort関数またはassertマクロが推奨されます


2
これに準拠するために、ボタンのないAlertViewを追加しました。簡単です。
Schultz9999 2013

素晴らしい答えです。exit(0)で動作し、プライベートAPIに属していることを知りませんでした
Alex Cio

39

これは実際にはプログラムを終了する方法ではなく、人々に強制的に終了させる方法です。

UIAlertView *anAlert = [[UIAlertView alloc] initWithTitle:@"Hit Home Button to Exit" message:@"Tell em why they're quiting" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
[anAlert show];

2
少なくともシミュレータでは、これを行うと、ユーザーがアプリを再度開いたときにアラートが表示されます。したがって、少なくとも1つのボタンを提供することをお勧めします。
チェシャーコウ

Kalyanの回答を使用して、ホームボタンが押されたときにアプリが終了するようにします。
Timur Kuchkarov 2013

これに関する問題は、実際にはアプリを終了しないことです。そのため、ユーザーがアプリをスワイプしない限り、開発者が終了することで達成したいこと(無効/古いUIをスローする、定数をクリアするなど)は実行されません。閉まっている。
Ben Leggiero 2015年

これはアプリを殺しません。
ダスティン

38

info.plistに移動し、「アプリケーションがバックグラウンドで実行されない」というキーを確認します。今回は、ユーザーがホームボタンをクリックすると、アプリケーションが完全に終了します。


1
しかし、バックグラウンドプロセスも却下されます。
Gajendra K Chauhan 2013

17

追加UIApplicationExitsOnSuspendのプロパティをapplication-info.plistしますtrue


この設定は実行時に変更できますか?つまり、アプリが次のサスペンドで終了することを選択した場合を除いて、バックグラウンドでライブしたいと思います。このとき、UIApplicationExitsOnSuspendを導入します。これは可能ですか?
Motti Shneor

13

いくつかのテストの後、私は次のように言うことができます:

  • プライベートインターフェイスを使用[UIApplication sharedApplication]すると、アプリがクラッシュしたように見えますが、クラッシュする- (void)applicationWillTerminate:(UIApplication *)application前に呼び出されます。
  • using exit(0);もアプリケーションを終了しますが、「通常」のように見えます(スプリングボードのアイコンは期待どおりに表示され、ズームアウト効果があります)。ただし、- (void)applicationWillTerminate:(UIApplication *)applicationデリゲートメソッドは呼び出されません。

私のアドバイス:

  1. - (void)applicationWillTerminate:(UIApplication *)applicationデリゲートのを手動で呼び出します。
  2. を呼び出しexit(0);ます。

Appleが原因「出口はむしろホーム画面に優雅終了し、アニメーションバックを実行するよりも、クラッシュしたことがユーザーに表示されます呼び出すアプリケーション」に使用出口にいないと言うdeveloper.apple.com/library/ios/#qa/qa2008/ qa1561.html
MickyD

8

ApplicationDelegateは、ユーザーによる意図的な終了の通知を受け取ります。

- (void)applicationWillResignActive:(UIApplication *)application {

この通知を受け取ったら、電話します

        exit(0);

これはすべての作業を行います。そして最高のことは、それはユーザーが終了することを意図していることです。そのため、ここでそれを呼び出すことは問題になりません。

私のオーディオアプリでは、音楽の再生中に他のユーザーがデバイスを同期した後にアプリを終了する必要がありました。同期が完了するとすぐに通知が届きます。しかし、その直後にアプリを終了すると、実際にはクラッシュのように見えます。

したがって、代わりに次のバックグラウンドアクションでアプリを本当に終了するようにフラグを設定します。同期後にアプリを更新しても問題ありません。


1
アプリケーションは、電話の着信などの他の理由でアクティブな状態で辞任するため、良い解決策ではありません。
frankodwyer 2015年

解決策は、有用な場合にのみ終了するチェックを追加することです。たとえば、ユーザーがスタート画面にいる場合です。その後、電話がかかってきても問題ありません。私のアプリではiOS 2以降、Appleはこれを拒否していません。stackoverflow.com/a/43906936/712124

6

私のアプリは最近拒否されましたbc私は文書化されていない方法を使用しました。文字通り:

「残念ながら、プライベートAPIを使用しているため、App Storeに追加できません。iPhone開発者プログラムライセンス契約のセクション3.3.1で概説されている非パブリックAPIの使用は禁止されています。

「3.3.1アプリケーションはAppleが規定する方法でのみ文書化されたAPIを使用でき、プライベートAPIを使用または呼び出してはなりません。」

アプリケーションに含まれている非公開APIはterminateWithSuccessです


6

アップルは言う:

「警告:exit関数を呼び出さないでください。exitを呼び出すアプリケーションは、正常な終了を実行してホーム画面に戻るアニメーションではなく、クラッシュしたようにユーザーに表示されます。」

これは悪い仮定だと思います。ユーザーが終了ボタンをタップすると、「アプリケーションを終了します。」などのメッセージが表示されても、クラッシュしたようには見えません。Appleは、アプリケーションを終了する有効な方法を提供する必要があります(exit(0)ではありません)。


3
彼らはそれをどのiDeviceの下部にあるホームボタンと呼んでいます。このの中で、独自の終了ボタンを構築する必要は決してありませんので、だから。
ポパイ

4

これは良い答えを得ましたが、少し拡大することにしました:

AppleのiOSヒューマンインターフェイスガイドラインを十分に読まないと、アプリケーションをAppStoreに受け入れられません。(彼らはあなたに対して彼らに対して何かをすることを拒否する権利を保持します)「プログラムで終了しないでください」セクションhttp://developer.apple.com/library/ios/#DOCUMENTATION/UserExperience/Conceptual/MobileHIG/UEBestPractices/UEBestPractices。 html は、この場合の扱い方に関する正確なガイドラインです。

Appleプラットフォームで問題が発生した場合、簡単に解決策を見つけることができません。HIGにご相談ください。Appleがあなたにそれを望まないだけの可能性もあり、彼らは通常(私はAppleではないので常に保証することはできません)彼らのドキュメントでそう述べています。


3

アプリケーションがインターネット接続を必要とする場合、アプリケーションを終了する必要があるかもしれません。アラートを表示してから、次のようにすることができます。

if ([[UIApplication sharedApplication] respondsToSelector:@selector(terminate)]) {
    [[UIApplication sharedApplication] performSelector:@selector(terminate)];
} else {
    kill(getpid(), SIGINT); 
}

9
いいえ、それを終了する必要はありません。たとえば、iTunesアプリが適切な接続を検出できない場合、接続されていないことを示す画面が表示されます。終了せず、何が起こっているかをユーザーに通知するだけです。次に、ユーザーはホームボタンをタップして終了します。
8月

1
ただし、機能しない場合はコンパスアプリが終了します。
ジョシュリー

3

exit(0)abort()関数を使用してアプリを終了することはできません。Appleはこれらの関数の使用を強く推奨していません。ただし、この関数は開発やテストの目的で使用できます。

開発またはテスト中にアプリケーションを終了する必要がある場合は、アボート機能またはアサートマクロが推奨されます

詳細については、このApple Q&Aスレッドを見つけてください。

この機能を使用すると、アプリケーションがクラッシュするような印象を与えます。そのため、特定の機能が利用できないため、アプリを閉じることをユーザーに知らせる終了メッセージ付きのアラートを表示できるというような提案を受けました。

ただし、アプリの起動と停止に関するiOSヒューマンインターフェイスガイドラインでは、「終了」または「閉じる」ボタン使用してアプリケーションを終了しないことを推奨しています。むしろ、彼らは状況を説明するために適切なメッセージを表示することを提案しているということです。

iOSアプリは、閉じるまたは終了オプションを表示しません。ユーザーは、別のアプリに切り替えたり、ホーム画面に戻ったり、デバイスをスリープモードにしたりすると、アプリの使用を停止します。

プログラムでiOSアプリを終了しないでください。人々はこれをクラッシュと解釈する傾向があります。何かが原因でアプリが意図したとおりに機能しなくなった場合は、ユーザーに状況を伝え、ユーザーが何ができるかを説明する必要があります。


2

上記に加えて、私が追加したかっただけの良い、答え、あなたの記憶をきれいにすることを考えてください。

アプリケーションが終了すると、iPhone OSは残されたアプリケーションを自動的にクリーンアップするため、すべてのメモリを手動で解放しても、アプリケーションが終了するまでの時間が長くなるだけです。


IOS4.0とUPの現在のシナリオで回答を変更してください。:P
rptwsthi

2
- (IBAction)logOutButton:(id)sender
{
   //show confirmation message to user
   CustomAlert* alert = [[CustomAlert alloc] initWithTitle:@"Confirmation" message:@"Do you want  to exit?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK", nil];
   alert.style = AlertStyleWhite;
   [alert setFontName:@"Helvetica" fontColor:[UIColor blackColor] fontShadowColor:[UIColor clearColor]];
   [alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

   if (buttonIndex != 0)  // 0 == the cancel button
   {
      //home button press programmatically
      UIApplication *app = [UIApplication sharedApplication];
      [app performSelector:@selector(suspend)];
      //wait 2 seconds while app is going background
      [NSThread sleepForTimeInterval:2.0];
      //exit app when app is in background
      NSLog(@"exit(0)");
      exit(0);
  }
}

1

上記の[[NSMutableArray new] addObject:nil]アプローチを使用して、tell-tale exit(0)関数を呼び出さずにアプリを強制終了(クラッシュ)しました。

どうして?私のアプリはすべてのネットワークAPI呼び出しで証明書のピン留めを使用して、中間者攻撃を防止しているためです。これには、金融アプリが起動時に行う初期化呼び出しが含まれます。

証明書の認証に失敗すると、すべての初期化呼び出しでエラーが発生し、アプリが不確定な状態のままになります。ユーザーが家に帰ってからアプリに戻ることはできません。アプリがOSによって削除されない限り、まだ初期化されておらず、信頼できないためです。

したがって、この1つのケースでは、アプリが安全でない環境で動作していることをユーザーに通知するアラートを表示し、ユーザーが「閉じる」をクリックしたときに、前述の方法を使用してアプリを強制終了することをお勧めします。


1つのフルスクリーンのありふれたアラートを表示して、「証明書のピン留め」の理由でアプリが使用できないことをユーザーに通知することを妨げている原因がわかりません。それだけです。ユーザーは最終的にアプリを閉じます。ご存じないかもしれませんが、iOSはプロセスを強制終了(状態を維持)し、後で復元する権利を留保しており、iOSアプリケーションの「ライフサイクル」は実際にはありません。あなたのクラッシュ-単にクラッシュであり、OSはとにかくアプリを復活させるかもしれません。
Motti Shneor

うわー、3歳のポスト。とにかく、新しいアプリアーキテクチャは、APIを再試行してブロック画面をドロップするか、新しいエラーでブロック画面に戻す再試行ボタンを使用して、ほぼそれを行います。
マイケルロング

古いアプリ構造では、起動API呼び出しを再試行するための適切な方法がほとんどありませんでした。アプリは、それらがないと一貫性のない状態でした。永続的なブロック画面を使用することもできましたが、ユーザーが自分でアプリを強制終了する必要があり、すべてのユーザーがアプリをダブルクリックして強制終了する方法を知っているわけではないことが判明しました。今日はもっと簡単ですが、3年前はかなり隠されていました。
マイケルロング

1
[[UIApplication sharedApplication] terminateWithSuccess];

それはうまくいき、自動的に電話をかけました

- (void)applicationWillTerminateUIApplication *)application delegate.

コンパイル時の警告を削除するには、このコードを追加します

@interface UIApplication(MyExtras)
  - (void)terminateWithSuccess;
@end 

5
これはプライベートな方法であり、Diego Mercadoは彼のアプリが拒否されたことを上記で説明したので、なぜそのようなリスクを取るのか。
RVN

プライベートAPIを使用すると、アプリがAppleに拒否されます。
ZYiOS

2
エンタープライズアプリの場合-これはソリューションになります。
user1140780 2013年

-(IBAction)exitApp:(id)sender {SEL selector = NSSelectorFromString(@ "terminateWithSuccess"); [self performSelector:selector withObject:[UIApplication sharedApplication]]; }
unom

@unmirceaはレビューに合格しましたか?
Awesome-o

1

関数exit(0)を直接呼び出さないでください。関数をすぐに終了し、アプリがクラッシュしたように見えます。したがって、ユーザーに確認アラートを表示して、ユーザーが自分でこれを実行できるようにする方が良いでしょう。

Swift 4.2

func askForQuit(_ completion:@escaping (_ canQuit: Bool) -> Void) {
    let alert = UIAlertController(title: "Confirmation!", message: "Do you want to quit the application", preferredStyle: .alert)
    alert.addAction(UIAlertAction(title: "Yes", style: UIAlertAction.Style.default, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(true)
    }))
    alert.addAction(UIAlertAction(title: "No", style: UIAlertAction.Style.cancel, handler: { (action) in
        alert.dismiss(animated: true, completion: nil)
        completion(false)
    }))
    self.present(alert, animated: true, completion: nil)
}

/// Will quit the application with animation
func quit() {
    UIApplication.shared.perform(#selector(NSXPCConnection.suspend))
    /// Sleep for a while to let the app goes in background
    sleep(2)
    exit(0)
}

使用法:

self.askForQuit { (canQuit) in
     if canQuit {
         self.quit()
     }
}

0

ユーザーはアプリがいつ終了するかを決定する必要があります。アプリが終了したときのユーザーの操作は良いとは思いません。したがって、そのための素晴らしいAPIはありません。ホームボタンだけにあります。

エラーがある場合:より適切に実装するか、ユーザーに通知します。再起動が必要な場合:ユーザーに通知するよりも適切に実装します。

馬鹿げているように聞こえますが、ユーザーに決定させたり通知したりせずにアプリを終了するのは悪い習慣です。また、Appleによると、ユーザーとのやり取りにはホームボタンがあるため、同じ機能(アプリの終了)に2つのことはありません。


0

ホームボタン以外の方法でアプリを終了することは、実際にiOS風ではないアプローチです。

私はこのヘルパーを行いましたが、プライベートなものは使用していません:

void crash()
{ [[NSMutableArray new] addObject:NSStringFromClass(nil)]; }

しかし、私の場合はまだ制作用ではありません。これは、クラッシュレポートをテストするため、またはコアデータのリセット後に高速再起動するためのものです。関数が製品コードに残っている場合に拒否されないように安全にしただけです。


0

Swift 4.2(またはそれ以前)

呼び出されたライブラリをDarvin使用できます。

import Darwin

exit(0) // Here you go

注意:これはiOSアプリケーションでは推奨されません。

これを行うと、クラッシュログが表示されます。


0

iPadOS 13では、次のようにすべてのシーンセッションを閉じることができます。

for session in UIApplication.shared.openSessions {
    UIApplication.shared.requestSceneSessionDestruction(session, options: nil, errorHandler: nil)
}

これapplicationWillTerminate(_ application: UIApplication)により、アプリデリゲートが呼び出され、最終的にアプリが終了します。

ただし、次の2つのことに注意してください。

iOS / iPadOS 13のシーンに関する詳細:https ://developer.apple.com/documentation/uikit/app_and_environment/scenes


-1

他の方法でアプリを終了する

私はこのヘルパーを行いましたが、プライベートなものは使用していません:

出口(0);


-1

位置情報の更新を取得する(そのために位置情報の更新のバックグラウンド機能を使用するなど)ために、バックグラウンドで実行される長命のアプリである場合は、アプリを終了することが適切な場合があります。

たとえば、ユーザーが位置情報ベースのアプリからログアウトし、ホームボタンを使用してアプリをバックグラウンドにプッシュするとします。この場合、アプリは引き続き実行される可能性がありますが、完全に終了することは理にかなっています。これはユーザーにとっては適切であり(使用する必要のないメモリやその他のリソースを解放する)、アプリの安定性にとっては有効です(つまり、可能な場合は定期的にアプリを定期的に再起動することで、メモリリークやその他のメモリ不足に対するセーフティネットを確保できます。問題)。

これは(おそらくすべきではありませんが、以下を参照してください:-)次のようなもので実現できます。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
        exit(0);
    } else {
       // normal handling.
    }
}

その後、アプリはバックグラウンドで終了するため、ユーザーには問題がなく、クラッシュに似ていないため、次回アプリを実行したときにユーザーインターフェイスが復元されます。言い換えると、ユーザーにとっては、アプリがバックグラウンドにあるときにシステムが開始したアプリの終了と何の違いもありません。

それでも、アプリを終了できることをシステムに知らせるには、より標準的なアプローチを使用することが望ましいでしょう。たとえば、この場合は、マップビューに現在の場所を表示する(存在する場合)をオフにするなど、位置の更新の要求を停止して、GPSが使用されていないことを確認します。これにより、[[UIApplication sharedApplication] backgroundTimeRemaining]アプリがバックグラウンドに入った数分後(つまり)にシステムがアプリを終了します。これにより、アプリを終了するためにコードを使用する必要がなく、同じ利点がすべて得られます。

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    if (/* logged out */) {
       // stop requesting location updates if not already done so
       // tidy up as app will soon be terminated (run a background task using beginBackgroundTaskWithExpirationHandler if needed).
    } else {
       // normal handling.
    }
}

そしてもちろん、http://developer.apple.com/iphone/library/qa/qa2008/qa1561.htmlexit(0)を参照する他の回答のように、フォアグラウンドで実行される平均的な本番アプリには使用することは決して適切ではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.