■はじめに
iOS 10以降で使えるUserNotificationsでローカル通知の実装をしてみました。
とはいえ、表題の内容には既にネット上に詳しい説明をしている記事が多くあります。
実装してみたい方は、まずは本記事の末に記載した参考記事をご覧ください。参考記事で理解できた方は以下読まなくて大丈夫です。
■既に記事があるのになぜ書くのか
私が実際にコードを書いてみた時に「参考記事は各機能やその役割に関しては詳細に書かれているけど、実際動かそうとした時に、どこにどう書けばよいか部分的にちょっとわかりにくい箇所があるかも・・・」と感じたためです。
経験者の方からすると、参考記事は丁寧すぎるくらい説明されていると思いますが、初心者が気軽に試してみることができるように、今回試したことを残すことは無駄(他の記事との重複)にはならないかなと思いました。
■今回の実装に関して
iOS 10以降のNotificationの基本 - Qiitaの記事を参考にさせていただいた上で、以下変更を加えて実装してみました。
・フォアグラウンドでも通知を表示する機能の追加
・UISegmentedControlは使用せず、10秒後に通知が飛ぶように変更
※通知内容やコメントに関しては日本語に変更しています。
■実装内容
どこにどの内容を書けばよいかわかるよう、通知に関する記述箇所に絞らずにあえて全体のコードを載せます。
「Main.storyboard」に「Button」を1つ配置し、「setNotification」という名称のActionボタンをまずは作りましょう。
その後は以下の通りに記述します。各文章がそれぞれどのような機能や定義なのかは
UserNotifications | Apple Developer Documentationと照らし合わせながら確認していくとよいかもしれません。
(1)AppDelegate.swift
※UserNotificationsのimport忘れずに!
import UIKit
import UserNotifications
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.alert, .badge, .sound]) {(granted, error) in
if granted {
print("許可する")
} else {
print("許可しない")
}
}
return true
}
func applicationWillResignActive(_ application: UIApplication) {
}
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(_ application: UIApplication) {
}
func applicationDidBecomeActive(_ application: UIApplication) {
}
func applicationWillTerminate(_ application: UIApplication) {
}
}
(2)ViewController.swift
※「UserNotifications」のimportと「UNUserNotificationCenterDelegate」プロトコルの宣言を忘れずに!
import UIKit
import UserNotifications
class ViewController: UIViewController, UNUserNotificationCenterDelegate {
@IBAction func setNotification(_ sender: Any) {
let content = UNMutableNotificationContent()
content.title = "時間です"
content.subtitle = "10秒経過しました"
content.body = "タップしてアプリを開いてください"
content.sound = UNNotificationSound.default()
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 10, repeats: false)
let request = UNNotificationRequest(identifier: "Timer", content: content, trigger: trigger)
let center = UNUserNotificationCenter.current()
center.delegate = self
center.add(request) { (error) in
if let error = error {
print(error.localizedDescription)
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.alert, .badge, .sound])
}
}
■おわりに
基本的には同様の内容の記事を書くことは誰も幸せにならないという認識はあるものの、もしかすると解らずに困っている人がいるかもと思い記事に残しました。
今回動かしてみた実装内容は、実際のアプリでは通知に関する機能を1つのファイルに分けて実装するなど違いがあるかと思いますので、別途実践的な内容にチャレンジしてみようと思います。
■参考
・UserNotifications | Apple Developer Documentation
・iOS 10以降のNotificationの基本 - Qiita
・User Notifications frameworkでローカル通知を送ってみる - しめ鯖日記
・[iOS 10] User Notifications framework を使用して時限式のローカル通知を作成する #wwdc | Developers.IO