ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • iOS Swift Notification 권한 확인하는 방법
    Language/iOS,AOS 2024. 7. 10. 16:50

    iOS 단말기에서 알림설정 정보를 가져와서 표시해주자.

     

    JavaScript

    common.js

    class Common {
      ...
      
      static isNotificationAuthorization() {
        if (Util.Browser.isAndroidApp()) {
        } else if (Util.Browser.isIosApp()) {
          window.isNotificationAuthorization = (jsonData) => {
            console.log('jsonData : ', jsonData);
            if (jsonData['isAllowedNotification'] === true) {
              console.log('AUTH OK');
            } else {
              console.log('AUTH NO');
            }
          };
    
          const message = {
            action: 'isNotificationAuthorization',
            callback: 'window.isNotificationAuthorization',
          };
          window.webkit.messageHandlers.IosBridge1.postMessage(message);
        }
      }
      
      ...
    }
    
    export default Common;

     

    호출

    Common.isNotificationAuthorization();


    Swift (네이티브)

    MainViewController

    // MARK: - iOS Bridge
    // 웹 액션 정의 : WebAction을 구분하는데 사용되는 타입
    enum WebAction: String {
        ...
        case isNotificationAuthorization
        ...
    }
    extension MainViewController: WKScriptMessageHandler {
        func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
            guard message.name == IOS_BRIDGE_NAME,
                  let messageBody = message.body as? [String: Any],
                  let action = messageBody["action"] as? String else { return }
            
            let webAction = WebAction(rawValue: action)
            
            Utils.Log("@@@@@@@@@@@@@@@@@@@@@@@ \(action)")
            
            switch webAction {
            
            ...
            
            case .isNotificationAuthorization:
                // 콜백 함수 실행
                guard let callback = messageBody["callback"] as? String else { return }
    
                Utils.isNotificationAuthorization(completion: { result in
                    if result {
    //                    Utils.Log("권한이 있습니다.")
                        let jsonData: [String: Any] = [
                            "isAllowedNotification": true
                        ]
                        
                        if let jsonString = Utils.convertDictionaryToJSONString(dictionary: jsonData) {
                            self.executeJavasScript(wKWeb: self.getActiveWkWebView(), callback: "\(callback)(\(jsonString));")
                        }
                    } else {
    //                    Utils.Log("권한이 없습니다.")
                        let jsonData: [String: Any] = [
                            "isAllowedNotification": false
                        ]
                        
                        if let jsonString = Utils.convertDictionaryToJSONString(dictionary: jsonData) {
                            self.executeJavasScript(wKWeb: self.getActiveWkWebView(), callback: "\(callback)(\(jsonString));")
                        }
                    }
                })
                
            ....
        }
    }

     

    Utils

    import Foundation
    import UIKit
    import WebKit
    import UserNotifications
    
    class Utils: NSObject {
        ...
        
        // 알림 권한 상태를 확인하는 함수
        static func checkNotificationAuthorizationStatus(completion: @escaping (UNAuthorizationStatus) -> Void) {
            UNUserNotificationCenter.current().getNotificationSettings { settings in
                DispatchQueue.main.async {
                    completion(settings.authorizationStatus)
                }
            }
        }
        
        static func isNotificationAuthorization(completion: @escaping (Bool) -> Void) {
            checkNotificationAuthorizationStatus { status in
                switch status {
                case .authorized:
                    Utils.Log("알림 권한이 허용되었습니다.")
                    completion(true)
                case .denied:
                    Utils.Log("알림 권한이 거부되었습니다.")
                    completion(false)
                case .notDetermined:
                    Utils.Log("아직 알림 권한을 설정하지 않았습니다.")
                    completion(false)
                case .provisional:
                    Utils.Log("알림 권한이 임시로 허용되었습니다.")
                    completion(false)
                case .ephemeral:
                    Utils.Log("임시 알림 권한이 허용되었습니다.")
                    completion(false)
                @unknown default:
                    Utils.Log("Unknown case")
                    completion(false)
                }
            }
        }
    }

     

    iOS 단말기

    설정 > 알림 > 알림 허용을 변경하면서 테스트 진행

    댓글

Designed by Tistory.