Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
167
Help us understand the problem. What is going on with this article?
@natsumo

【Swift】iOSアプリにプッシュ通知を実装したサンプルアプリを作ってみた

iOSのプッシュ通知はこんな感じ

iOS10のプッシュ通知デザインはこんなかんじです。(ちょっと違いますが、iOS13でも同じ感じです)
Swiftで作ったiOSアプリにプッシュ通知の実装をしたい!という方へにはこの記事が参考になるかと思います:thumbsup:

295.png

サンプル

動作環境と事前準備

推奨動作環境(こちらで動作確認をしている環境です)

  • Mac OS X 10.14 以上
  • Xcode 11.2 以上
  • iPhone8 iOS 13.3 以上

事前準備

サンプルプロジェクト一覧

すべて自由に使ってOKです▼

言語 プッシュ通知 リッチプッシュ ペイロード取得
Swift SwiftPushApp SwiftRichPushApp SwiftPaylpadApp
  • 上記3つのサンプルを用意しました
    • 通常のプッシュ通知のみ実装した、SwiftPushApp
    • SwiftPushAppに加えて、プッシュ通知を開くとWebViewを表示できるリッチプッシュ機能を実装した、SwiftRichPushApp
    • SwiftPushAppに加えて、配信したプッシュ通知からメッセージなどのデータを取得するペイロード機能を実装した、SwiftPayloadApp
  • 使い方は各リンク先のREADMEにしたがってください◎
  • それぞれについて次でコード解説します('▼'*♪

コード紹介

そもそもプッシュ通知の仕組みって?

iOSの場合はAPNsというApple社のプッシュ通知用サーバーを介してプッシュ通知は配信されます。
下図のように①~⑤の流れでプッシュ通知は端末に届きます。

001.png

この中で「②デバイストークン発行」でAPNsから発行されたデバイストークンを端末で取得し、サーバー側に保存する処理は、アプリ側に実装する必要があります。

<プッシュ通知の基本>デバイストークンの取得とサーバーへの登録

AppDelegate
import UIKit
import UserNotifications
import NCMB

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    //********** APIキーの設定 **********
    let applicationkey = "YOUR_NCMB_APPLICATIONKEY"
    let clientkey      = "YOUR_NCMB_CLIENTKEY"

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        //********** SDKの初期化 **********
        NCMB.initialize(applicationKey: applicationkey, clientKey: clientkey)

        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .badge, .sound]) {granted, error in
            if error != nil {
                // エラー時の処理
                return
            }
            if granted {
                // デバイストークンの要求
                UIApplication.shared.registerForRemoteNotifications()
            }
        }

        return true
    }

    // デバイストークンが取得されたら呼び出されるメソッド
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // 端末情報を扱うNCMBInstallationのインスタンスを作成
        let installation : NCMBInstallation = NCMBInstallation.currentInstallation
        // デバイストークンの設定
        installation.setDeviceTokenFromData(data: deviceToken)
        // 端末情報をデータストアに登録
        installation.saveInBackground {result in
            switch result {
                case .success:
                    // 端末情報の登録に成功した時の処理
                    break
            case let .failure(error):
                    // 端末情報の登録に失敗した時の処理
                    print(error)
                    break
            }
        }

    }
}

リッチプッシュの処理

リッチプッシュって何?

  • プッシュ通知にURLを載せて配信し、プッシュ通知開封時にWebビューで表示することができる機能です

001.png

  • 実装は簡単で、上記デバイストークン処理のコードに加え、下記のコードを追記するだけです◎
リッチプッシュを表示させる処理
// MARK: アプリが起動されるときに実行される処理を追記する場所
if let notification = launchOptions?[.remoteNotification] as? [String: AnyObject] {
    NCMBPush.handleRichPush(userInfo: notification)
}

ペイロードの処理

ペイロードって何?

  • プッシュ通知にJSONデータを持たせて配信し、開封時にプッシュ通知からデータを取得することができる機能です
  • ペイロードとして取得したデータは、アプリ内で使用することが可能です

図1.png

アプリ非起動時に受信する

  • アプリが起動されたときにペイロードを取得するためには、 didFinishLaunchingWithOptions メソッド内に処理を記述します
// 【ペイロード:アプリ非起動時に受信】アプリが起動されたときにプッシュ通知の情報を取得する
if let remoteNotification = launchOptions?[UIApplication.LaunchOptionsKey.remoteNotification] as? NSDictionary {
  /* 省略 */
}

アプリ起動時に受信する場合

  • 起動中に受信するためには、 didReceiveRemoteNotification メソッドを追記し、記述します
// 【ペイロード:アプリ起動時に受信】アプリが起動中にプッシュ通知の情報を取得する
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  /* 省略 */
}

参考

GitHubにたくさんサンプルアプリを公開しています!
https://github.com/natsumo/

167
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
natsumo
ニフクラ mobile backend(NCMB)の企画を担当しています。非エンジニアでも簡単に機能を試せるチュートリアルを量産しています。mobile backend の学習参考書もあります → https://www.amazon.co.jp/dp/4910415114/
fjct
クラウド・IoT 関連サービスを開発・提供している企業です。(こちらは、富士通クラウドテクノロジーズの有志にて運営しております。)

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
167
Help us understand the problem. What is going on with this article?