Repro - Mobile Analytics for growth
English
リソース
Growth Hack Journal
アカウント登録 管理画面に戻る
  • 動作環境
  • 管理画面ガイド
  • 開発ガイド
    • アカウント作成
    • iOS/Android SDK
      • 導入
      • セッション・ライフサイクル
      • ユーザーID
      • デバイスID
      • ユーザープロフィール
      • イベントトラッキング
      • プッシュ通知
        • APNs証明書の設定 (iOS)
        • FCMの設定 (Android)
        • iOS
          • プッシュ通知の設定
          • バッジを消す処理の実装
          • デバイストークンをReproに送信
          • オプション:リッチ通知の受信準備
        • Android
        • Unity
        • Cordova
        • Monaca
        • Cocos2d-x
        • React Native
        • Flutter
      • ニュースフィード
      • アプリ内メッセージ
      • UXオプティマイザー(ベータ版)
      • WebView
      • オプトアウト機能
      • Adjustで取得したアトリビューションデータをReproにセットする
      • AppsFlyerで取得したアトリビューションデータをReproにセットする
      • ログレベル
      • 検証方法
    • Web
    • オーディエンスAPI
    • オーディエンスインポート(β)
    • プッシュAPI
    • ユーザープロフィールAPI
    • ユーザープロフィールバルクインポートAPI
  • リリースノート
  • FAQ
objc,swift,swift-sdk3

プッシュ通知(iOS)¶

プッシュ通知の設定¶

APNs証明書の設定 (iOS) を参照し、設定してください。

バッジを消す処理の実装¶

プッシュ通知作成フォームから 「バッジを表示する」をオン にして送信すると、プッシュ通知を受信したアプリのアイコンにバッジが自動で表示されます。

表示されたバッジを消すためには UIApplication クラスの applicationIconBadgeNumber に0をセットする必要があります。アプリの仕様に合わせて任意のタイミングで applicationIconBadgeNumber に0をセットしてください。

例えば、アプリがActiveになったタイミングでバッジを消す場合は UIApplicationDelegate の applicationDidBecomeActive: で applicationIconBadgeNumber に0をセットします。

// AppDelegate.m

@implementation AppDelegate
- (void)applicationDidBecomeActive:(UIApplication *)application
    ...
    application.applicationIconBadgeNumber = 0;
    ...
// AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate {

    func applicationDidBecomeActive(_ application: UIApplication) {
        ...
        application.applicationIconBadgeNumber = 0
        ...
// AppDelegate.swift

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func applicationDidBecomeActive(_ application: UIApplication) {
        ...
        application.applicationIconBadgeNumber = 0
        ...

注釈

「バッジを表示する」をオン にしたプッシュ通知を送信する場合は、必ずバッジクリア処理を実装してください。

デバイストークンをReproに送信¶

プッシュ通知の宛先を指定するためにデバイストークンをReproに送信します。

XcodeのCapabilitiesにてPush NotificationsをONにします。

Capabilities

次に下記のコードを追加してください。

// AppDelegate.m

#import <Repro/Repro.h>
#import <UserNotifications/UserNotifications.h>
    ...
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ...
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_9_x_Max) {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert | UNAuthorizationOptionBadge | UNAuthorizationOptionSound) completionHandler:^(BOOL granted, NSError * _Nullable error) {
        }];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    } else {
        UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
        [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }
    return YES;
}
// AppDelegate.swift

import Repro
import UserNotifications
    ...
class AppDelegate: UIResponder, UIApplicationDelegate {
        ...
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        ...
        if #available (iOS 10.0, *) {
            let center = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.sound, .alert, .badge], completionHandler: { (granted, error) in
            })
            application.registerForRemoteNotifications()
        } else {
            let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            UIApplication.shared.registerUserNotificationSettings(settings)
            UIApplication.shared.registerForRemoteNotifications()
        }
        return true
    }
// AppDelegate.swift

import Repro
import UserNotifications
    ...
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {
        ...
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        ...
        if #available (iOS 10.0, *) {
            let center = UNUserNotificationCenter.current()
            center.delegate = self
            center.requestAuthorization(options: [.sound, .alert, .badge], completionHandler: { (granted, error) in
            })
            application.registerForRemoteNotifications()
        } else {
            let settings: UIUserNotificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            UIApplication.shared.registerUserNotificationSettings(settings)
            UIApplication.shared.registerForRemoteNotifications()
        }
        return true
    }
// AppDelegate.m
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    [Repro setPushDeviceToken:deviceToken];
}

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
    NSLog(@"Remote Notification Error: %@", error);
}
// AppDelegate.swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Repro.setPushDeviceToken(data: deviceToken)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Remote Notification Error: \(error)")
}
// AppDelegate.swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    Repro.setPushDeviceToken(data: deviceToken)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Remote Notification Error: \(error)")
}

デバイストークンの取得に成功した場合は application:didRegisterForRemoteNotificationsWithDeviceToken: メソッドが呼び出されるので、その中でReproにデバイストークンを渡します。

デバイストークンの取得に失敗した場合は application:didFailToRegisterForRemoteNotificationsWithError: メソッドが呼び出されるので、エラーの内容を見て適宜対処します。

以上の実装をした後にアプリを起動すると、下記のようなプッシュ通知の許諾ダイアログが表示されます。

プッシュ通知 Dialog

このダイアログにて OK を選択すると application:didRegisterForRemoteNotificationsWithDeviceToken: メソッドが呼び出され、Reproにデバイストークンが設定されます。

以上でプッシュ通知の受信準備は完了です。

オプション:リッチ通知の受信準備¶

iOS 10から画像や動画、音声ファイルなどを通知に利用することができるリッチ通知機能が追加されました。リッチ通知を受信するためには下記の手順が必要です。

Notification Service Extensionの作成¶

Xcodeのメニューの File -> New -> Target... をクリックします。

../../../_images/7-1-AddNotificationServiceExtention.png

iOS -> Notification Service Extension -> Next をクリックします。

../../../_images/7-2-AddNotificationServiceExtention.png

任意のProduct Nameを入力してFinishをクリックします。

../../../_images/7-3-AddNotificationServiceExtention.png

下記のようなダイアログが出てきたら Activate をクリックします。

../../../_images/7-4-AddNotificationServiceExtention.png

Notification Service Extensionの実装¶

Notification Service Extension に下記の記述をします。

#import <UserNotifications/UserNotifications.h>

...

@implementation NotificationService

- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {

    self.contentHandler = contentHandler;
    self.bestAttemptContent = [request.content mutableCopy];

    NSDictionary *attachment = request.content.userInfo[@"rpr_attachment"];
    if (!attachment) {
        contentHandler(self.bestAttemptContent);
        return;
    }

    NSString *urlStr = attachment[@"url"];
    NSString *type = attachment[@"type"];
    NSURL *url = [NSURL URLWithString:urlStr];

    [[[NSURLSession sharedSession] downloadTaskWithURL:url
                                     completionHandler:^(NSURL * _Nullable location,
                                                         NSURLResponse * _Nullable response,
                                                         NSError * _Nullable error) {

                                         if (error) {
                                             contentHandler(self.bestAttemptContent);
                                             return;
                                         }

                                         NSString *fileName = [NSString stringWithFormat:@"%@.%@", [[NSUUID UUID]UUIDString], type];
                                         NSURL *fileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:fileName]];
                                         [[NSFileManager defaultManager] moveItemAtURL:location toURL:fileURL error:nil];

                                         NSError *attachError = nil;
                                         UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:@"IDENTIFIER" URL:fileURL options:nil error:&attachError];
                                         if (!attachError) {
                                             self.bestAttemptContent.attachments = @[attachment];
                                         }

                                         contentHandler(self.bestAttemptContent);
                                     }] resume];
}
import UserNotifications
...
class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let attachment = request.content.userInfo["rpr_attachment"] as? [String: String] {
            if let urlString = attachment["url"], let fileURL = URL(string: urlString), let type = attachment["type"] {

                URLSession.shared.downloadTask(with: fileURL) { (location, response, error) in
                    if let location = location {
                        let fileName = UUID().uuidString + "." + type
                        let tmpFile = "file://".appending(NSTemporaryDirectory()).appending(fileName)
                        let tmpUrl = URL(string: tmpFile)!
                        try? FileManager.default.moveItem(at: location, to: tmpUrl)

                        if let attachment = try? UNNotificationAttachment(identifier: "IDENTIFIER", url: tmpUrl, options: nil) {
                            self.bestAttemptContent?.attachments = [attachment]
                        }
                    }
                    contentHandler(self.bestAttemptContent!)
                }.resume()
            }
        } else {
            contentHandler(self.bestAttemptContent!)
        }
    }
import UserNotifications
...
class NotificationService: UNNotificationServiceExtension {

    var contentHandler: ((UNNotificationContent) -> Void)?
    var bestAttemptContent: UNMutableNotificationContent?

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        self.contentHandler = contentHandler
        bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

        if let attachment = request.content.userInfo["rpr_attachment"] as? [String: String] {
            if let urlString = attachment["url"], let fileURL = URL(string: urlString), let type = attachment["type"] {

                URLSession.shared.downloadTask(with: fileURL) { (location, response, error) in
                    if let location = location {
                        let fileName = UUID().uuidString + "." + type
                        let tmpFile = "file://".appending(NSTemporaryDirectory()).appending(fileName)
                        let tmpUrl = URL(string: tmpFile)!
                        try? FileManager.default.moveItem(at: location, to: tmpUrl)

                        if let attachment = try? UNNotificationAttachment(identifier: "IDENTIFIER", url: tmpUrl, options: nil) {
                            self.bestAttemptContent?.attachments = [attachment]
                        }
                    }
                    contentHandler(self.bestAttemptContent!)
                }.resume()
            }
        } else {
            contentHandler(self.bestAttemptContent!)
        }
    }

上記の実装が終わったら、 プッシュ通知を作成する をご覧ください。

  • « FCMの設定 (Android)
  • プッシュ通知(Android) »

About Us Careers Terms of Service Privacy Policy Cookie Policy

© 2020 Repro Inc.