액션이 있는 알림 만들기

소개



알림에 대한 조치를 구현하고 싶습니다.
LI◯E나 MESSE◯GER의 통지를 3D 터치했을 때 나오는 것을 상상해 주시면 대략 맞습니다. 기본적으로 로컬 알림 구현과 함께 사용됩니다.

알림 권한 요청



우선 UserNotifications의 import

AppDelegate.swift
import UserNotifications

iOS9, iOS10 이상으로 나누어 요청
알림 권한 대화 상자 표시

AppDelegate.swift
func application(_ application: UIApplication, 
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

if #available(iOS 10.0, *) {
            // iOS 10
            let center = UNUserNotificationCenter.current()
            // optionsでバッジ,サウンド,アラートを設定
            // アラートだけにすれば上から降りてくるやつだけになる
            center.requestAuthorization(options: [.badge, .sound, .alert], completionHandler: { (granted, error) in
                if error != nil {
                    return
                }

                if granted {
                    debugPrint("通知許可")
                } else {
                    debugPrint("通知拒否")
                }
            })

        } else {
            // iOS 9
            let settings = UIUserNotificationSettings(types: [.badge, .sound, .alert], categories: nil)
            UIApplication.shared.registerUserNotificationSettings(settings)
        }
   return true
}

여기까지는 로컬 통지와 함께합니다.

다음에 구체적인 액션의 설정과, 통지로부터 액션을 선택했을 때의 동작을 기입합니다.
이번에는 액션과 라벨을 2개 준비해, 대응한 액션으로 카운트 업시킵니다.

ViewController

import UIKit
import UserNotifications

// アクションをenumで宣言
enum ActionIdentifier: String {
    case actionOne
    case actionTwo
}

// Delegateの宣言を忘れずにする
class ViewController: UIViewController, UNUserNotificationCenterDelegate {

    var one: Int = 0
    var two: Int = 0

    @IBOutlet var label1: UILabel!
    @IBOutlet var label2: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        // アクション設定
        let actionOne = UNNotificationAction(identifier: ActionIdentifier.actionOne.rawValue,
                                            title: "アクション1",
                                            options: [.foreground])
        let actionTwo = UNNotificationAction(identifier: ActionIdentifier.actionTwo.rawValue,
                                            title: "アクション2",
                                            options: [.foreground])

        let category = UNNotificationCategory(identifier: "category_select",
                                              actions: [actionOne, actionTwo],
                                              intentIdentifiers: [],
                                              options: [])

        UNUserNotificationCenter.current().setNotificationCategories([category])
        UNUserNotificationCenter.current().delegate = self


        let content = UNMutableNotificationContent()
        content.title = "こんにちわ!"
        content.body = "アクションを選択してください!"
        content.sound = UNNotificationSound.default

        // categoryIdentifierを設定
        content.categoryIdentifier = "category_select"

        // 60秒ごとに繰り返し通知
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true)
        let request = UNNotificationRequest(identifier: "notification",
                                            content: content,
                                            trigger: trigger)

        // 通知登録
        UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)

    }

    // アクションを選択した際に呼び出されるメソッド
    @available(iOS 10.0, *)
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: () -> Swift.Void) {

        // 選択されたアクションごとに処理を分岐
        switch response.actionIdentifier {

        case ActionIdentifier.actionOne.rawValue:
            // 具体的な処理をここに記入
            // 変数oneをカウントアップしてラベルに表示
            one = one + 1
            label1.text = String(one)

        case ActionIdentifier.actionTwo.rawValue:
            // 具体的な処理をここに記入
            two = two + 1
            label2.text = String(two)

        default:
            ()
        }

        completionHandler()
    }


}

완성도





참고 기사



iOS 10 User Notifications Framework 구현 요약

좋은 웹페이지 즐겨찾기