Help us understand the problem. What is going on with this article?

[Swift]アプリ起動中に、コードによりホーム画面に戻る方法

はじめに

とあるiOSアプリを触っていると、設定画面に言語変更のオプションがあり興味本位で変更してみるとアプリの再起動を促されて自動でホーム画面に戻るというUXを見つけました。そこでどういう実装をしているのか気になり調べてみました。
完成図↓

アプリを意図的に落とすUXはどうなのか

この点に関しては以下の記事に詳しく書かれていました。
https://news.mynavi.jp/article/20190528-iphone_why/

メモリ不足に起因するリソース不足などについてもシステム側でメモリの開放が行われることから、アプリを落とさなければならないという状況は極めて限定的ではあると考えられます。しかし表示言語の変更などのやむをえない場合についてはこのようなUXを実装しても問題なさそうです。

単純にアプリを落とす方法

ただ単にアプリを落とすだけなら、exit(0)などで落とすことができます。ただし、これだけだとアプリが突然クラッシュしたかのような挙動となりあまりふさわしいとは思えません。

また、exit(0)以外にも、fatalError()やassertなどで落とすことができますが、今回の言語の変更を目的とした、使用用途としては不適だと言えます。これらの使い分けについては以下の記事が大変参考になりましたのでご覧ください。

https://scior.hatenablog.com/entry/2019/04/04/202352

exit(0)//今回使用する
fatalError()//不適
assert(false, "")//不適

そこで

そこでアプリを終了させる前にホーム画面に戻るという処理を行います。こうすることでクラッシュしたかのような挙動は避けることができました。
コードは以下の通り単純です。

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

この処理の後に先程のexit(0)を呼べば良いのですが以下のように直後に呼んでしまうと一瞬画面がブラックアウトしたように見えてしまい、これもまた好ましい挙動ではありません。

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

よって、タイマーを用いて、ほんの少しの間遅延させて実行することとします。
自分は以下のように実装しました。

完成したコード

UIControl().sendAction(#selector(URLSessionTask.suspend), to: UIApplication.shared, for: nil)
Timer.scheduledTimer(withTimeInterval: 0.2, repeats: false) { _ in
            exit(0)
        }

最後に

これからちょくちょく記事を書いて行くのでよかったら見て行ってもらえたら嬉しいです。
何かご指摘や質問(わからないかもですが)などありましたら気軽にコメントでもDMでもください。

追記

AppStore公開時の審査について

StackOverflowなどでこの方法では審査に通らないとする意見も見られるそうです。
しかし自分で調べたところ大手アプリにおいてもこの方法を使用しているものが見受けられたので、一概に落とされるとも限りません。
もし、この方法を用いたアプリを審査申請された方がおられましたらどうなったかコメント頂けると助かります。自分も次のアプリ公開時にこの方法を使用して試してみようと思います。

p_x9
いろいろ手を出してどれも中途半端な人。アプリ開発(iOS,Flutter)やROS(ロボット)などを主にしてます。最近はSLAM勉強してます。(ほぼ確率統計) 孤独にやってるので気軽にリプやらください
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした