iOS7が発表されてから随分経ちましたが、マルチタスキングについて書いてみようと思います。
だいたいマルチタスクに興味を持つのは開発者の方で、
しかもタイマー系アプリを作ろうと思ってる方だと思うので、ちょっと内容は技術者向けになると思います。
アプリ「2chChekcer」を作るときにどうしても使いたかったので勉強した内容を共有します。
iOS4に実装された擬似的なマルチタスクでは、アプリを閉じてから10分の間は自由に処理を動かすことができました。
それ以上の時間は、特定のアプリ(位置情報・メッセージ・音楽再生)しか許可されてませんでした。
その状態から、iOS7では全てのアプリがマルチタスクに対応するという発表があったので、勘違いする方も多かったのではないかと思います。
実際はどうなったかというと、iOS7のマルチタスク(fetch)では、OS側が判断したタイミングで30秒間処理を行う時間が与えられるということです。
ここで開発者が設定できることは、チェックする間隔の最少時間を設定できます。
頻度が多くならないようにという意味なので注意が必要です。
1時間と設定した場合、1時間以内に処理を行うのではなくて、1時間は処理しないでね!ということになります。
また、30秒だけ時間が与えられますが、ダウンロードが終わっていない場合は延長できます。
こちらもiOS7で新しく実装されたNSURLSessionを使用することで実現します。
OSもユーザーの使用する時間帯を記憶したり、他のアプリの使用状況から判断するというなかなか賢いことをしてくれますが、10分毎みたいなことは実現できないみたいです。
ちなみに、iOS7で追加されたマルチタスクがもう一つあって、remoteがあります。
fetchと違うところは、処理のタイミングがプッシュ通知になることです。
OS側で判断されるわけではないので、開発者に裁量があるともいえます。
何かアップデートがあった時に、ユーザーにプッシュ通知を送ると共に、
バックグラウンドで更新情報をダウンロードしておくみたいな使い方ができます。
(ちなみにプッシュ通知のサウンドやメッセージがなくても大丈夫です。)
これを応用すれば、定期実行はできるようになるのではないかと思いますが、
試したことがないので、本当にできるかはわかりません。
冒頭にあった2chCheckerというアプリでは、5分毎の処理を実現していますが、
これはサーバー側で行っています。
処理をphpで書いて、cronで5分毎に実行しています。
気になった方は調べてみると面白いと思います。