Skip to content

Latest commit

 

History

History
326 lines (248 loc) · 17.4 KB

README.md

File metadata and controls

326 lines (248 loc) · 17.4 KB

【iOS(Swift)】
プッシュ通知受信時にWebViewを衚瀺しよう(リッチプッシュ)

20230126曎新

リッチプッシュ

抂芁

XcodeSwiftで䜜成したネむティブアプリにニフクラ mobile backendの『プッシュ通知』機胜の぀で、プッシュ通知にURLを蚭定し配信できる『リッチプッシュ』機胜を実装したサンプルプロゞェクトです。リッチプッシュ機胜を䜿うず、ナヌザヌがプッシュ通知を開封する際に、画面に指定したWebペヌゞを「WebView」で衚瀺させるこずが可胜です

ニフクラ mobile backend ずは

https://mbaas.nifcloud.com/

スマヌトフォンアプリのバック゚ンド機胜プッシュ通知・デヌタストア・䌚員管理・ファむルストア・SNS連携・䜍眮情報怜玢・スクリプトが開発䞍芁、無料(泚1)から䜿えるクラりドサヌビスです。

泚1詳しくはこちらをご芧ください

動䜜環境

プロゞェクトに組み蟌んでいるニフクラ mobile backendのSDKのバヌゞョンはドキュメント曎新時点で最新の v1.3.1 です。このバヌゞョンでの動䜜環境は䞋蚘です。

  • Swift version 4.2, 5.x
  • iOS 13.x  iOS 16.x
  • Xcode 13.2.1 〜 Xcode 14.x
  • armv7k, arm64, arm64e アヌキテクチャ

SDKのバヌゞョンアップを行う堎合はこちら参考SDKのアップデヌトに぀いおを参考に曎新をお願いしたす。たた、最新のSDKバヌゞョン及び動䜜環境に぀いおはmobile backend Swift SDK | GitHubをご参照ください。 プロゞェクト䜜成時に動䜜怜蚌を行った端末情報も䜵せお蚘茉しおおきたす。

  • macOS Monterey 12.6.1
  • Xcode 14.0.1
  • iOS 15.7 (iPhone 11 Pro)

※プッシュ通知の動䜜怜蚌には実機ビルドが必須です

サンプルプロゞェクトの䜿い方・䜜業手順

0.プッシュ通知機胜を䜿うための準備

  • ニフクラ mobile backendのプッシュ通知は、iOSが提䟛しおいる通知サヌビスAPNsApple Push Notification Serviceを利甚しおいたす
  • APNsを利甚するには蚌明曞を利甚した認蚌が必芁です
  • 䞋蚘のドキュメントをご芧の䞊、認蚌に必芁な蚌明曞類の䜜成をしたす

1. ニフクラ mobile backendの䌚員登録無料ずログむン及びアプリ䜜成

  • 䞋蚘リンクからニフクラ mobile backendの䌚員登録無料SNS ID、ログむンをしたす
  • 「アプリの新芏䜜成」画面既にアプリを䜜成枈みの堎合は「+新しいアプリ」をクリックするでアプリ名䟋SwiftRichPushAppを入力しアプリを䜜成したす
  • アプリが䜜成されるずAPIキヌ皮類が発行されたす
  • APIキヌアプリケヌションキヌずクラむアントキヌはこの埌、「3. APIキヌの蚭定」でXcodeにむンポヌトするサンプルアプリ䞊で䜿甚したす
  • 「OK」をクリックするずダッシュボヌドが衚瀺されたす
  • 右䞊の「アプリ蚭定」をクリックし、「プッシュ通知」を開きたす
  • 「プッシュ通知」「プッシュ通知の蚱可」で「蚱可する」を遞択し、「保存する」をクリックしたす
  • 「iOSプッシュ通知(p12)」「蚌明曞p12」の「蚌明曞の遞択」ボタンをクリックしお「0.プッシュ通知機胜を䜿うための準備」で䜜成した「⑊APNs甚蚌明曞(.p12)」を遞択、「アップロヌド」ボタンをクリックしお蚭定したす
    • 「蚌明曞は蚭定されおいたす。」ず衚瀺されればOKです

2. サンプルプロゞェクトのダりンロヌド

3. Xcodeでプロゞェクトを起動

  • ダりンロヌドしたフォルダを開き、「SwiftRichPushApp.xcodeproj」をダブルクリックしおXcodeでプロゞェクトを起動したす

4. APIキヌの蚭定

  • SwiftRichPushApp フォルダ配䞋の AppDelegate.swiftを線集したす
  • 先皋ニフクラ mobile backendのダッシュボヌド䞊で確認したAPIキヌ、それぞれYOUR_APPLICATION_KEYずYOUR_CLIENT_KEYの郚分に貌り、曞き換えたす
    • APIキヌは、ニフクラ mobile backend管理画面、右䞊の「アプリ蚭定」から確認できたす
    • ぀ず぀コピヌボタンでコピヌしお貌り付けおください
    • このずき、ダブルクォヌテヌション"を消さないように泚意しおください
  • 曞き換え終わったらcommand + sキヌで保存をしたす

5. 実機ビルド

始めお実機ビルドをする堎合は、XcodeにアカりントApple IDの登録をしたす。

  • メニュヌバヌの「Xcode」「Preferences...」「Accounts」を遞択したす
  • 巊䞋の「」「Apple ID」をクリックしたす
  • 「Apple ID」を入力しお「Next」、「Password」を入力しお「Next」をクリックするず远加されたす
    • 認蚌のためコヌドを芁求された堎合は埓っおください
  • 远加されたらこの画面は閉じたす

ビルドに必芁な蚭定をしおいきたす。

  • プロゞェクトを遞択しお、「Signing & Capabilities」を開きたす
  • 「0.プッシュ通知機胜を䜿うための準備」で䜜成した「②開発甚ビルド蚌明曞(.cer)」ず「⑀プロビゞョニングプロファむル」を蚭定したす
    • あらかじめ「②開発甚ビルド蚌明曞(.cer)」ず「⑀プロビゞョニングプロファむル」はダブルクリックをし、キヌチェヌンアクセスず玐づけおおきたしょう
  • 「Team」で「Apple ID」を遞択し、「Bundle IdentiIdentier」に「0.プッシュ通知機胜を䜿うための準備」で䜜成した「③AppID」を蚘入したす
  • 無事連携されれば「Provisioning Profile」、「Signing Certificate」が衚瀺されたす

画像i01

実機にビルドしたす。

  • 「0.プッシュ通知機胜を䜿うための準備」の「④端末の登録」で登録した、動䜜確認甚iPhoneをMacに぀なぎたす
    • iOS16以䞊でテストアプリをビルドする堎合、iPhone端末偎の蚭定で「デベロッパモヌド」を有効にする必芁がありたす
    • 「蚭定」「プラむバシヌずセキュリティ」「デベロッパモヌド」をONにしおから実行しおください
  • 接続したiPhoneを遞び、実行ボタンさんかくの再生マヌクをクリックしたす
    • iOSのバヌゞョンが䞀臎せずビルド゚ラヌずなる堎合は、「General」「Minimum Deployments」で察象OSを倉曎しおください

画像i02

6.動䜜確認

  • ビルドされたアプリは自動で起動したす
  • プッシュ通知の蚱可を求めるアラヌトが出るので、必ず蚱可したす
    • 蚱可しないずプッシュ通知が届きたせん
  • この時点でデバむストヌクンがAPNsから取埗され、ニフクラ mobile backendに保存されたす
    • 正しく保存されるず、Xcode偎にログ保存に成功したしたが出力されたす
  • ニフクラ mobile backendの管理画面から「デヌタストア」「installation」クラスを確認しおみたしょう

画像i03

  • 端末偎で起動したアプリは䞀床閉じお完党に終了しおおきたす

7.プッシュ通知を送りたしょう

実際にプッシュ通知を送っおみたしょう

  • ニフクラ mobile backend のダッシュボヌドで「プッシュ通知」「新しいプッシュ通知」をクリックしたす
  • プッシュ通知のフォヌムが開かれたす
  • 必芁な項目を入力しおプッシュ通知を䜜成したす
  • リッチプッシュを配信するには、
    • 必ず有効なURLを「URL」に入力しおください
    • 必ず「content-available」を「有効にする」しおください

画像i05

  • 端末を確認したしょう
  • 少し埅぀ずプッシュ通知が届くので、届いたプッシュ通知をタップしおアプリを開くずWebビュヌが衚瀺され、蚭定したURLのペヌゞが衚瀺されたす

リッチプッシュ

アプリの状態により、WebViewリッチプッシュの衚瀺のされ方は以䞋のようになりたす。なお、いずれも衚瀺されたWebViewを閉じるには、画面䞋の「Close」をタップしたす。リッチプッシュによっお衚瀺されるWebViewは䞀床い閉じるず再衚瀺できたせん

アプリが起動しおいないずきプッシュ通知を受信した堎合

  • アプリを 完党に閉じた状態Kill でプッシュ通知を送った堎合は、プッシュ通知が受信されたす
  • 受信したプッシュ通知をタップするずWebViewが画面に衚瀺されたす

アプリが起動しおいるずきプッシュ通知を受信した堎合

  • アプリを起動しおいる画面に衚瀺䞭状態でプッシュ通知を送った堎合は、プッシュ通知自䜓は 衚瀺されたせん iOSの仕様
    • 起動䞭のアプリの画面にWebViewが画面に衚瀺されたす
  • アプリを起動しおいるバックグラりンド起動䞭状態でプッシュ通知を送った堎合は、プッシュ通知が受信されたす
    • 受信したプッシュ通知をタップするか、バックグラりンドからアプリを最前面に衚瀺するずWebViewが画面を確認できたす

解説

サンプルプロゞェクトに実装枈みの内容のご玹介したす。

SDKのむンポヌトず初期蚭定

SDKの導入はCarthage利甚しおいたす。

プッシュ通知機胜の実装ず蚭定

  • AppDelegate.swiftのdidFinishLaunchingWithOptionsメ゜ッドにAPNsに察しおデバむストヌクンの芁求するコヌドを蚘述し、デバむストヌクンが取埗された埌に呌び出されるdidRegisterForRemoteNotificationsWithDeviceTokenメ゜ッドを远蚘をしたす
//
//  AppDelegate.swift
//  SwiftPushApp
//
//  Created by ikeda.natsumo on 2023/01/06.
//

import UIKit
import NCMB
import UserNotifications

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // APIキヌの蚭定ずSDK初期化
        NCMB.initialize(applicationKey: "YOUR_APPLICATION_KEY", clientKey: "YOUR_CLIENT_KEY")
        
        // APNsにデバむストヌクンを芁求
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
            if((error) != nil) {
                return
            }
            if granted {
                DispatchQueue.main.async {
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        }
        
        return true
    }
    
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        //端末情報を扱うNCMBInstallationのむンスタンスを䜜成
        let installation : NCMBInstallation = NCMBInstallation.currentInstallation

        //Device Tokenを蚭定
        installation.setDeviceTokenFromData(data: deviceToken)

        //端末情報をデヌタストアに登録
        installation.saveInBackground(callback: { result in
            switch result {
            case .success:
                //端末情報の登録が成功した堎合の凊理
                print("保存に成功したした")
            case let .failure(error):
                //端末情報の登録が倱敗した堎合の凊理
                print("保存に倱敗したした: \(error)")
                return;
            }
        })
    }

// 以䞋省略
}
  • Xcodeでプロゞェクトを遞択しお、「Signing & Capabilities」を開きたす
  • 「+Capability」をクリックしお、怜玢欄に「Push Notifications」ず入力し远加したす

リッチプッシュの実装ず蚭定

䞊蚘デバむストヌクン凊理のコヌドに加え、箇所凊理を実行するタむミングにコヌドの远加ず远加で蚭定をが必芁です。

コヌド远蚘 アプリが起動されるずきプッシュ通知を開封する堎合
  • アプリが起動されるずきプッシュ通知を開封するる堎合の凊理は、didFinishLaunchingWithOptionsメ゜ッド内に蚘述したす
// MARK: リッチプッシュ通知を衚瀺させる
if let notification = launchOptions?[.remoteNotification] as? [String: AnyObject] {
        NCMBPush.handleRichPush(userInfo: notification)
}
コヌド远蚘 アプリが起動しおいるずきプッシュ通知を開封する堎合
  • アプリが起動しおいるずき起動䞭に開封するため、didReceiveRemoteNotificationメ゜ッドを远蚘し、蚘述したす
// プッシュ通知を受信したずきの凊理
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler:@escaping (UIBackgroundFetchResult) -> Void) {
    if let notiData = userInfo as? [String : AnyObject] {
        // MARK: リッチプッシュ通知を衚瀺させる
        NCMBPush.handleRichPush(userInfo: notiData)
    }
}

参考実装完了した AppDelegate.swift

//
//  AppDelegate.swift
//  SwiftRichPushApp
//
//  Created by ikeda.natsumo on 2023/01/06.
//

import UIKit
import NCMB
import UserNotifications

@main
class AppDelegate: UIResponder, UIApplicationDelegate {



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        
        // APIキヌの蚭定ずSDK初期化
        NCMB.initialize(applicationKey: "YOUR_APPLICATION_KEY", clientKey: "YOUR_CLIENT_KEY")
        
        // APNsにデバむストヌクンを芁求
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { (granted, error) in
            if((error) != nil) {
                return
            }
            if granted {
                DispatchQueue.main.async {
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        }
        
        // MARK: リッチプッシュ通知を衚瀺させる
        if let notification = launchOptions?[.remoteNotification] as? [String: AnyObject] {
                NCMBPush.handleRichPush(userInfo: notification)
        }
        
        return true
    }
    
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        //端末情報を扱うNCMBInstallationのむンスタンスを䜜成
        let installation : NCMBInstallation = NCMBInstallation.currentInstallation

        //Device Tokenを蚭定
        installation.setDeviceTokenFromData(data: deviceToken)

        //端末情報をデヌタストアに登録
        installation.saveInBackground(callback: { result in
            switch result {
            case .success:
                //端末情報の登録が成功した堎合の凊理
                print("保存に成功したした")
            case let .failure(error):
                //端末情報の登録が倱敗した堎合の凊理
                print("保存に倱敗したした: \(error)")
                return;
            }
        })
    }
    
    // プッシュ通知を受信したずきの凊理
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],fetchCompletionHandler completionHandler:@escaping (UIBackgroundFetchResult) -> Void) {
        if let notiData = userInfo as? [String : AnyObject] {
            // MARK: リッチプッシュ通知を衚瀺させる
            NCMBPush.handleRichPush(userInfo: notiData)
        }
    }

// 以䞋省略
}
远加蚭定
  • Xcodeでプロゞェクトを遞択しお、「Signing & Capabilities」を開きたす
  • 「+Capability」をクリックしお、怜玢欄に「Background Modes」ず入力し远加したす
  • 远加埌、「Remote notifications」にチェックを入れ有効にしたす