[iPhone] Background バックグランド処理

バックグラウンドはできるだけ避けるべきというのがAppleのスタンスでしょうか 。ただ、バックグラウンドでもオーディオや位置情報を使うことはできるようです。
 

Swift 4.0
Xcode 9.2

 

Background Modes

 
バックグラウンド実行 – Apple Developerには、audioや位置情報、通知などはバックグラウンドでも動作することが必要なので説明も多いようです。
 
audioは継続的にバックグラウンドで動作し続けるので実際に使って見ます。
 

 

Background Modesの設定

 
「TARGET」->「Capabilities」->「Background Modes」を「ON」にして「Audio, AirPlay …」にチェックします。
 

 
Info.plist に以下の追加がされています。
 

 

AVAudioplayer

 
AVAudioplayerを使ってmp3を再生してみます。以下のままコードを記述しstoryboardを設定します。
 

[iPhone] AVAudioplayer 音楽の再生
MP3などのミュージック・ファイルを再生させるにはどうするのか? AVAudioplayer は色々と設定ができますが、まず簡単な音楽再生ア...

 

 

AppDelegateの設定

 
AVAudioSessonをAppDelegateに設定します。

AppDelegate.swift

 
これで実行するとバックグラウンドでも再生しているのがわかります。
 
オーディオを再生するとしながら、実際は別の処理をさせて音楽は無音にするということを考える方がいるとはおもいますし、実際このように使うことはできますが、
バックグラウンド実行 – Apple Developer
にはこのようにありますので、リジェクトされるかもしれませんね。

バックグラウンドで音声を再生するアプリケーションは、音声コンテンツを再生し、無音にならないようにしなければなりません。

 

Background FetchでSwift2, 3あたりまではできていたように思いますのでしばらく残しておきます。

Background Fetch

 
backgroundと言いながらも、定期的に10分に1回というような設定はできません、バッテリー消費を抑えるためOSにより制限されています。
(いろいろ面倒なこと、例えばAPNsを使ったりすれば可能でしょうけれども)
 

Background Modes 設定

 
「TARGET」->「Capabilities」->「Background Modes」
を「ON」にして
「Background fetch」にチェックします
 

 

 
下にこのようなコメントが出てきます

Add the “Required Background Modes” key to your info plist file

実際は自動的に設定されています。Info.plistを確認すると
 

 
「Required Background Modes」に「App downloads content from the network」
というのができています。コードで見ると、key: UIBackgroundModes, array: fetch となっています。
 
Info.plist

 

AppDelegate 設定

 
setMinimumBackgroundFetchInterval() に
UIApplicationBackgroundFetchIntervalMinimum
を設定します
 
minimumと言っても、あくまでOSの裁量での話です
 

 
次に、バックグランド処理が発生した時のハンドラー処理です

 
これをもとに、fetchした時間をNSUserDefaultsで保存してみます。

AppDelegate.swift

 
NSUserDefaultsで保存した記録を表示
Labelは毎回改行するので10linesに設定

ViewController.swift

 
simulatorでテストするときは「Product」「Scheme」「Edit Scheme」から
「Background Fetch」にチェックをいれて始めます


実機での確認では必要ないですが、ある程度アプリを使ってシステムにのpriorityをあげてやらないと何時間もfetchされないことになります。

つまり、ユーザーの実際の環境でアプリがで定期的にfetchされるかは千差万別となるというこでしょう。
結果はページの最初にあるような時刻でbackground fetchが起きていました。

06:52:50 から始まって早くて10分の間隔
2時間全く処理が起きなかったこともあります
因みに、この時間は電車の中でYuTubeを見ていたりしました ;-p

誤字脱字、意味不明などのご意見は 謙: e-mail まで
ブックマークしておくと便利です このエントリーをはてなブックマークに追加
Twitter:




ページのトップへ戻る

シェアする

  • このエントリーをはてなブックマークに追加

フォローする