web-dev-qa-db-ja.com

iOS 4.0でアプリケーションを終了する

IOS4.0より前にiPhoneのホームボタンをクリックすると、アプリケーションが終了し、Appleのガイドには、プログラムによるアプリケーションの終了は受け入れられませんでした。

iOS4.0ですべてが変更され、ホームボタンをクリックすると、アプリが一時停止モード(マルチタスク)になります。そして、ユーザーがアプリを終了する明確な方法(終了ボタンなど)があるはずだと思います。

リンゴで今は大丈夫ですか?そしてどのようにそれを行うことができますか?

33
Tamer

まだこれを行うべきではありません。

さまざまな段階のハンドラーがあるので、これがその方法です。手動で終了しても意味がありません。アプリを再起動すると、理想的には中断したところから開始されるため、これは再開するか、古い状態を開始してロードすることによるものです。

終了する理由はありません。

編集

これが再び表示され続けると: iOS Human Interface Guidelines は「プログラムで終了しないでください」と言います。また、過去にexit()を呼び出したアプリに関する多くのレポートを見てきました。

Info.plistファイルに適切なキーを設定してサスペンドする代わりに終了することはもちろん問題ありませんが、それは専用のUIボタンではなく、ホームボタンによるプログラム終了のアプリケーション固有の実装です。

22
Eiko

Info.plistキーUIApplicationExitsOnSuspendを設定して、アプリが完全に終了することを確認できます。

50
Joost Schuur

プログラムで呼び出されるexit()には理由があります。

ブート時に常に起動され、システムによって強制終了されたときに再起動されるvoipアプリがあるとします。メモリ警告が発生したとき。通常は、voip TCPソケットを維持するためにバックグラウンドで実行する必要があるため、好ましい動作です。

ただし、a)TCPを使用してバックグラウンドで実行し、b)プッシュ通知を受け入れた後にのみ開始するなど、アプリが複数の操作モードをサポートしている場合、ユーザーがb)モードでアプリを使用する場合アプリが他のアプリに使用できるメモリを消費しているという空想。

したがって、アプリがバックグラウンドで起動され、ユーザーがアプリをb)モードで正常に実行し、exit(0)を正常に実行するようにした場合、起動時にアプリをチェックできればいいでしょう。

8
Stanislav Kutil

iOS Debugging Magic(Technical Note TN2239) も参照してください:

IOSアプリケーションのライフサイクルはユーザーの制御下にあることに注意してください。つまり、iOSアプリケーションは単に終了するべきではありません。リリースビルドは、とにかくクラッシュする状況でのみアボートを呼び出す必要があり、アボートコールはユーザーデータの損傷を防ぐか、問題をより簡単に診断できるようにします。

早期終了の原因を特定するトピックについては、 iPhone OSアプリケーションクラッシュレポートの理解と分析(テクニカルノートTN2151) が興味深いかもしれません。

少し話題を外してすみませんが、それは早期終了と診断に関連しています。

ジェフ

6
jww

これには本当の問題がありました。手動またはプログラムで終了することには大きなポイントがあります。

以前のiPhone OSでは、アプリは終了時にplistにその状態(最初の使用または2回目以降など)を書き出していました。ユーザーが戻ったとき、plistを読んでさまざまなものを表示したかったのです。また、終了後にユーザーが戻ってくるたびに最初の画面を表示したかったのです。

IPhone OS4でアプリがバックグラウンドで中断されると、アプリは中断したところに戻り(つまり、ユーザーがどこにいても同じ画面を表示する)、applicationWillTerminateが呼び出されることはないため、状態が変更されることはありません。

これはほとんどの場合(アプリから一時的に退出したときに続行できるようにするために)望まれる動作であるため、選択、つまり一時停止または終了できる方法が必要です。

UIApplicationExitsOnSuspend = YESを設定すると1つの方法しか与えられないため(つまり、HOMEが押されると常に終了します)、これは私が探しているソリューションではありません。

シーケンスが中断されただけでなく、一連のステップがすべて完了したらアプリに通知し、適切なタイミングで終了することを望んでいます。

これを行うには、アプリケーションが終了し、使用がシーケンス全体を完了したときに状態を書き出せるようにする必要があります。また、アプリを一時停止したい場合もあります。

[ホーム]ボタンを2回タップすると、中断されたアプリが表示されます。長くタッチして表示される(-)記号をタッチすると、アプリを削除(終了)できますが、これはユーザーにとってあまり直感的ではなく、手順が多すぎます。

もう1つのオプションは、アプリのナビゲーションタブの1つとして[終了]ボタンを使用することですが、それは見苦しいです。今のところ、私の唯一のオプションはUIApplicationExitsOnSuspend = YESの設定を選択しているようです。

3
Yoichi

@Joost Schuurの答えは次のとおりです。

  1. info.plistファイルを開きます

  2. キーの追加IApplicationExitsOnSuspendまたはSelect Applicationはバックグラウンドで実行されません

  3. 新しいキーをYESまたはチェックボックスに入力に設定します

applicationWillResignActiveおよびapplicationWillTerminateのブレークポイントは、それが機能することを示します。

3
iMeMyself

いつでもexit(1)を使用できます。これは、コード/理由の整数を持つ生/強制終了です。終了するだけのシミュレーションモードのように、開発中にこれを使用できます。 NOWのように。

3

あなたはこれをすることになっていない。ユーザーがアプリを終了する場合は、HOMEボタンを押します。

ユーザーがホームボタンを押すと、UIApplicationWillResignActiveNotification通知を受け取ります。その通知を使用して、すべてのリソースを破棄します。

基本的に、ユーザーがホームボタンを押すと、アプリは「隅に隠す」(できるだけ少ないメモリを消費する)必要があります。ただし、取り壊すほど、ユーザーが元に戻ったときにアプリが再び表示されるまでにかかる時間が長くなります(すべてのリソースをリロードする必要があります)。

1
bobobobo

あなたはこれを行うことができます:

@IBAction func yourButtonAcation(_ sender: Any) {

    UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)

}
0
Deepak Kumar

以下のメソッドを使用して、アニメーションで正常に終了するだけです

   @IBAction func MinimizeOrKillApp(){            
        UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
        //Comment if you want to minimise app
        Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { (timer) in
            exit(0)
        }
    }

Output

サンプルコードのダウンロード

推奨されておらず、アプリは拒否されますか????。私たちはすべて開発者であり、レビュアーチームから承認する方法を知っています

Apple開発者の質問

0
iMHitesh Surani