Hatena::Groupiphone-dev

Ni chicha, ni limona - 平均から抜けられない僕

2009-04-02

アプリケーションを自分自身で終了させる方法←使っちゃダメ! 23:34  アプリケーションを自分自身で終了させる方法←使っちゃダメ! - Ni chicha, ni limona - 平均から抜けられない僕 を含むブックマーク はてなブックマーク -  アプリケーションを自分自身で終了させる方法←使っちゃダメ! - Ni chicha, ni limona - 平均から抜けられない僕  アプリケーションを自分自身で終了させる方法←使っちゃダメ! - Ni chicha, ni limona - 平均から抜けられない僕 のブックマークコメント

注意:この方法を実装するとHIG違反になってしまいます。使わないでください!!

iPhoneアプリアプリ自身で終了させる方法が、Cocos2dを調べていたら書かれていたのでこちらにも記しておきます。

(恥ずかしながら、今までホームボタンでしか終了させられませんでした)

	if( [[UIApplication sharedApplication] respondsToSelector:@selector(terminate)] )
		[[UIApplication sharedApplication] performSelector:@selector(terminate)];

これで良いようです。確かにこのコードが呼ばれたらホーム画面に戻ることができました。

ただ、そのとき必ずExit code:1で終了しているので、何か問題があるのかもしれません。

ですので、ご利用時はご注意ください。

※もし適切な終了方法をご存知の方がいたら教えていただけると嬉しいです。

追記【重要】

Twitterで「それってHIG違反じゃないの?」という指摘があったので慌ててドキュメントを確認。そうしたら46ページに、

iPhone applications should never quit programmatically because doing so looks like a crash to the user. There may be times, however, when external circumstances prevent your application from functioning as intended. When this happens, you need to tell users about the situation and explain what they can do about it. This way, users decide whether they want to take corrective action and continue with your application or press the Home button and open a different application.

と書いてあるのを見付けました。つまり、


プログラムで終了処理を書いたらダメだよ。クラッシュしたんじゃないかと間違われるからね。ホームボタンや別アプリのオープンでアプリを終了させるように仕様。でないとサポートやらなにやらで自分で自分の首をしめちゃうよ』


ということです。ユーザー視点では上記のとおりで、開発者視点だと「これやるとRejectだかんね」というわけですね。

せっかくなので情報は残しておきますが、冒頭にも「使うな危険」は残しておきます。失礼しました。

とおりすがりとおりすがり2009/04/03 10:45Objective-CもC言語なんですから
exit( 0 );
でよろしいかと。

とおりすがりとおりすがり2009/04/03 12:45分かったうえで、あえてやろうとしてたのかと思ってました...

Technical Q&A QA1561: How do I programmatically quit my iPhone application?
http://developer.apple.com/iphone/library/qa/qa2008/qa1561.html

paellapaella2009/04/03 13:00ありがとうございます。> お二方(一人?)

気づかずにやっていたので、危ないところでした。
ちなみにexit(0)は試していないのですが、プロセス終了だからとはいえCocoa touchフレームワークの終了処理をすっとばしてしまうのは流石に・・・と躊躇していました。

とおりすがりとおりすがり2009/04/03 13:21UIApplicationのようなフレームワークのクラスに対してrespondsToSelectorを使うということは、公開されていない(いつなくなるかもわからない)メソッドの存在を確認しているということですから、それだったらexitの方がまだましかと思ったんです。確かにフレームワークの終了処理はすっとばしてしまいますけど、関数がなくなることはないですから。

どちらにしても、こんなことはすっぱり忘れてHIGに従っておいた方がいいですよね。

paellapaella2009/04/03 14:02> すっぱり忘れて

ですね。ありがとうございました。> お二方(一人?どっちだろう?)

paellapaella2009/04/09 09:22スミマセン、Twitterのsumihiroさんからの指摘で、HIGと書くべきところをHIDと書いていました。Human Interface Deviceか。