mBaas (nifty) + Swift3로 푸시 알림 사용

Swift3에 익숙하지 않았기 때문에 조금 시간이 걸렸기 때문에,
게재해 둡니다.

번거로움
  • p12 인증서에 암호를 설정했기 때문에 알림에 오류가 발생했습니다.
  • swift3에 대한 샘플 코드를 찾을 수 없으며 참조로 시간이 걸렸습니다

  • 1. 구현 절차 Cocoapods에서 NCMB 설치


    # Uncomment the next line to define a global platform for your project
    # platform :ios, '9.0'
    
    target 'push_sample' do
      # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
      use_frameworks!
      pod 'NCMB', :git => 'https://github.com/NIFTYCloud-mbaas/ncmb_ios.git'
    end
    
    post_install do |installer|
        installer.pods_project.targets.each do |target|
            target.build_configurations.each do |config|
                config.build_settings['SWIFT_VERSION'] = "3.0"
            end
        end
    end
    

    2. 라이브러리 추가 및 Capability 설정









    빌드하지 않으면 Apple Developer의
    Select an App ID for your Apple Push Notification service SSL Certificate (Sandbox)
    에서 선택할 수 없다고 생각합니다.

    3. 개발자 센터에서 통지용 인증서 작성 및 통지 이용 설정







    키를 다운로드하고 다운로드한 키 파일을 더블 클릭하여 키체인에 등록

    대상 앱에서 푸시 알림을 사용하기 위해 Active로 설정


    4. Nifty 클라우드의 모바일 백엔드에서 푸시 알림 이용을 위한 키 생성 준비

    Mac Finder -> 응용 프로그램 -> 유틸리티 -> 키체인 액세스 시작




    여기가 공백이 아니면 알림시 오류가 발생합니다.


    작성한 p12 파일을 적당한 장소에 저장합니다.

    5. Nifty 클라우드의 모바일 백엔드에서 푸시 알림 설정





    6.AppDelegate.swift에 알림 수락 구현

    AppDelegate.swift
    import UIKit
    import NCMB
    import UserNotificationsUI
    import UserNotifications
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
        let applicationkey = "ニフティクラウドのmbile backendで生成したキー"
        let clientkey      = "ニフティクラウドのmbile backendで生成したキー"
    
        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
            NCMB.setApplicationKey(applicationkey, clientKey: clientkey)
            // デバイストークンの要求
            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
                // Enable or disable features based on authorization.
            }
            application.registerForRemoteNotifications()
    
            return true
        }
    
        // UIApplication.shared.registerForRemoteNotifications()によって呼び出される
        func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
            // 端末情報を扱うNCMBInstallationのインスタンスを作成
            let installation = NCMBInstallation.current()
            // デバイストークンの設定
            installation?.setDeviceTokenFrom(deviceToken as Data!)
            // 端末情報をデータストアに登録
            installation?.saveInBackground { (error) -> Void in
                if (error != nil){
                    // 端末情報の登録に失敗した時の処理
                    if ((error as! NSError).code == 409001){
                        // 失敗した原因がデバイストークンの重複だった場合
                        // 端末情報を上書き保存する
                        self.updateExistInstallation(currentInstallation: installation!)
                    }else{
                        // デバイストークンの重複以外のエラーが返ってきた場合
                    }
                }else{
                    // 端末情報の登録に成功した時の処理
                }
            }
        }
    
    
        // 端末情報を上書き保存するupdateExistInstallationメソッドを用意
        func updateExistInstallation(currentInstallation : NCMBInstallation){
            let installationQuery: NCMBQuery = NCMBInstallation.query()
            installationQuery.whereKey("deviceToken", equalTo:currentInstallation.deviceToken)
            do {
                let searchDevice = try installationQuery.getFirstObject()
                // 端末情報の検索に成功した場合
                // 上書き保存する
                currentInstallation.objectId = (searchDevice as AnyObject).objectId
                currentInstallation.saveInBackground { (error) -> Void in
                    if (error != nil){
                        // 端末情報の登録に失敗した時の処理
                    }else{
                        // 端末情報の登録に成功した時の処理
                    }
                }
            } catch _ as NSError {
                // 端末情報の検索に失敗した場合の処理
            }
        }
    


    7. 통지 수신 확인


    앱을 백그라운드로 만들거나 종료하고 기다립니다.


    무사히 전화를 받으면 첫걸음이 완료됩니다.

    이 구현으로 할 수없는 일

    할 수없는 일이지만,
    1. 앱 종료 시 알림 메시지를 탭해도 앱이 시작되지 않음
    2. 알림에서 앱으로 전환했을 때 특정 동작을 시키는 구현이 되어 있지 않다
    3. 릴리스 환경시의 과제의 검증이 되어 있지 않다.

    등, 많이 있기 때문에, 우선 어떤 것인가 시험하고 싶다고 하는 분의 도움이 된다고 생각합니다.

    좋은 웹페이지 즐겨찾기