【Swift】UserNotificationsの実装例と注意

実行環境
  • mac OS Sierra
  • Xcode 8.3.2
  • Swift3.1
フォアグラウンド

バックグラウンド(ホーム画面)

バックグラウンド(ロック画面)

AppDelegate.swift

import UIKit
import UserNotifications

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
    var window: UIWindow?
    let center = UNUserNotificationCenter.current()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.

        self.center.delegate = self
        return true
    }

    // フォアグラウンド時に通知を受信した場合のみ呼ばれる
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler([.alert, .sound])
    }

AlertViewController.swift

import UIKit
import RxSwift
import UserNotifications

class AlertViewController: UIViewController, UNUserNotificationCenterDelegate {
    @IBOutlet weak var datePicker: UIDatePicker!

    let disposeBag = DisposeBag()
    var myAppDelegate = UIApplication.shared.delegate as! AppDelegate
    var setAlertTime: Date?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.requestAuth()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func didTapSaveAlert(_ sender: UIButton) {
        // 現在時刻との差分を計算
        guard let setAlertTime = self.setAlertTime else { return }
        let timeLag = setAlertTime.timeIntervalSinceNow
        self.createAlert(time: timeLag)
        self.toast(message: "アラートを設定しました") {
            self.dismiss(animated: true, completion: nil)
        }
    }

    // DatePickerを変更し終わった度にくる
    @IBAction func changed(_ sender: UIDatePicker) {
        self.setAlertTime = self.datePicker.date
    }

    // キャンセルボタンタップ時イベント
    @IBAction func didTapCancelButton(_ sender: UIBarButtonItem) {
        self.dismiss(animated: true, completion: nil)
    }

    func requestAuth() {
        self.myAppDelegate.center.requestAuthorization(options: [.badge, .sound, .alert], completionHandler: { (granted, error) in
            if error != nil {
                return
            }
            if granted {
                debugPrint("通知許可")
            } else {
                debugPrint("通知拒否")
            }
        })
    }

    // アラートを作成・リクエストする
    func createAlert(time: Double) {
        // 通知内容の作成
        let contents = UNMutableNotificationContent()

        contents.title = "タイトル"
        contents.body = "ここをタップしてアプリを開く。"

        // トリガーの作成
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: time, repeats: false)

        // リクエストの作成
        let identifier = NSUUID().uuidString
        let request = UNNotificationRequest(identifier: identifier, content: contents, trigger: trigger)

        // リクエスト実行
        self.myAppDelegate.center.add(request)
    }
}
注意事項
  • アプリがバックグラウンド時の通知は特にUNUserNotificationCenterDelegateは必要ない。
  • アプリがフォアグラウンド時にバックグラウンド時と同様の通知を受けたいときだけUNUserNotificationCenterDelegateuserNotificationCenter(_:willPresent:withCompletionHandler:)が必要。
  • UNUserNotificationCenterDelegateを設定(center.delegate = self)するのはapplication(_:didFinishLaunchingWithOptions:)でないといけない。(アプリ起動後にdelegateを設定してもコールバックが呼ばれない)
参考サイト

UNUserNotificationCenterDelegate – UserNotifications | Apple
User Notifications framework! フォアグラウンド時も通知バナー表示
User Notifications Framework実装まとめ

参考テキスト
詳解Swift 第3版 [ 荻原 剛志 ]

詳解Swift 第3版 [ 荻原 剛志 ]

価格:3,456円
(2017/1/3 01:58時点)
感想(0件)

スポンサーサイト
広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中