iOS
 Computer >> コンピューター >  >> プログラミング >> iOS

iOSアプリでバックグラウンド中もタイマーを動かし続ける方法【Swift】

iOSアプリをバックグラウンドに移行した後もタイマーを動かし続けたいケースは多くあります。そのような場合、Appleが提供している beginBackgroundTask(withExpirationHandler:) メソッドを利用することで、一定時間だけ処理を継続できます。詳細な仕様については、Apple公式ドキュメントを参照してください。

本記事では、このメソッドを使ってバックグラウンドでタイマーを動かすコードを実際に書いていきます。それでは始めましょう。

実装手順

ステップ1:Xcodeプロジェクトを作成する

Xcodeを起動し、「Single View Application」を選択して新規プロジェクトを作成します。ここではプロジェクト名を「BackgroundTimer」とします。

ステップ2:applicationDidEnterBackground にコードを記述する

AppDelegate.swift を開き、applicationDidEnterBackground メソッド内に以下のコードを追記します。

backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
    UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!)
})
_ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.doSomething), userInfo: nil, repeats: true)

ステップ3:doSomething() 関数を定義する

次に、タイマーから呼び出される新しい関数 doSomething() を追加します。

@objc func doSomething() {
    print("I'm running")
}

最終的なコード全体像

以上の実装をまとめると、AppDelegate.swift の該当部分は以下のようになります。

func applicationDidEnterBackground(_ application: UIApplication) {
    backgroundTaskIdentifier = UIApplication.shared.beginBackgroundTask(expirationHandler: {
        UIApplication.shared.endBackgroundTask(self.backgroundTaskIdentifier!)
    })
    _ = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(self.doSomething), userInfo: nil, repeats: true)
}
@objc func doSomething() {
    print("I'm running")
}

アプリを実行して動作を確認する

このサンプルでは、アプリがバックグラウンドに移行したタイミングで「I'm running」という文字列を出力するようにしています。ホームボタンをタップしてアプリをバックグラウンドにすると、コンソール上で「I'm running」の出力が始まります。ぜひ実際に試してみてください。

ただし、注意点があります。Appleのドキュメントに記載されているとおり、また実際に検証しても分かるように、バックグラウンドでタイマーを動かせる時間は最大約3分間です。

アプリをバックグラウンドにしたまま3分ほど待つと、「I'm running」の出力が止まるのが確認できます。その後、アプリを再びフォアグラウンドに戻すと、「I'm running」の出力が再開されます。

まとめ

beginBackgroundTask(withExpirationHandler:) を使えば、アプリがバックグラウンド中でも約3分間はタイマーなどの処理を継続できます。位置情報やオーディオ再生など、特定のバックグラウンドモードを利用すればさらに長時間の処理も可能ですが、通常の用途では今回の手法が基本となります。バックグラウンドでの制限事項を理解したうえで、適切に活用しましょう。

  1. iOS 13ダークモードにアプリを対応させる方法:開発者向け実装ガイド

    Appleは2019年9月19日、過去4年以内に発売されたすべてのiPhone(iPhone 6s以降)を対象に、待望のiOS 13アップデートを世界中でリリースしました。このアップデートの最大の目玉機能のひとつが、システム全体に適用されるiOS 13のダークモードです。スマートフォンのディスプレイが発する白い光による目の疲れを軽減できることが期待されています。この機能はAppleデバイスのエンドユーザーにとって嬉しいものですが、iOS開発者にとっては、iOS 13ダークモードに対応したアプリを準備するという課題でもあります。iOS 13ダークモードにアプリを対応させるには?開発者の皆さんの参

  2. Androidスマホでバックグラウンドアプリを停止する5つの方法【動作改善・バッテリー節約】

    Androidスマートフォンは非常に高性能なデバイスであり、デジタルカメラ、電子書籍リーダー、MP3プレーヤー、電卓、懐中電灯、ラジオなど、多くの機器の役割を1台に集約した革命的な存在です。しかし、それぞれの機能を実現するために多数のアプリが必要となり、スマホには次々とアプリがインストールされていきます。 インストール済みアプリが多いこと自体は、ストレージ容量を増やせばある程度解決できます。本当の問題は、多くのアプリがバックグラウンドで動作し続け、限られたリソースを消費してしまう点にあります。その結果、スマホの動作が遅くなったりフリーズしたり、バッテリーの減りが通常より速くなったりします。これ