コンテンツにスキップ

初期化

アプリの起動時に以下の手順でSDKの初期化処理を行います。

手順

  1. SDK実行キーを設定
  2. delegateの設定
  3. OSに対してプッシュ通知受信の許可をリクエスト
  4. デバイストークンを登録

import

import RichFlyer
#import <RichFlyer/RichFlyer.h>

SDK実行キーの設定

// Class RFApp
static func setServiceKey(serviceKey: String, appGroupId: String, sandbox: Bool)
// Class RFApp
+ setServiceKey:appGroupId:sandbox:
パラメータ 内容
serviceKey 管理サイトで発行されたSDK実行キー
SDK実行キーの取得方法
appGroupId AppGroupsのGroup ID
sandbox 通知の配信種別。
YES:Developmentプロビジョニングを適用する場合
NO:Distributionプロビジョニングを使用している場合

delegateの設定

// Class RFApp
static func setRFNotficationDelegate(delegate: RFNotificationDelegate)
// Class RFApp
+ setRFNotificationDelegate:
パラメータ 内容
delegate RFNotificationDelegateを実装しているクラスのオブジェクト

RFNotificationDelegate

public protocol RFNotificationDelegate {

    // アプリがフォアグラウンドにある場合ときにプッシュ通知を受信
    func willPresentNotification(_ center: UNUserNotificationCenter,
                                    willPresent notification: UNNotification,
                                    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Swift.Void)

    // 通知センターからアプリを起動した
    func didReceiveNotification(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Swift.Void)

    // アプリ起動時表示が閉じられた
    func dismissedContentDisplay(_ action: RFAction?, content: RFContent?) -> Swift.Void  
}
@protocol RFNotificationDelegate <NSObject>
    @optional

    // アプリがフォアグラウンドにある場合ときにプッシュ通知を受信
    - (void)willPresentNotificationWithCenter:(UNUserNotificationCenter *)center
                                notification:(UNNotification *)notification
                        withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler;

    // 通知センターからアプリを起動した
    - (void)didReceiveNotificationWithCenter:(UNUserNotificationCenter *)center
                                    response:(UNNotificationResponse *)response
                                        withCompletionHandler:(void (^)(void))completionHandler;

    // アプリ起動時表示が閉じられた
    - (void)dismissedContentDisplay:(RFAction*)action content:(RFContent*)content;
@end

OSに対してプッシュ通知受信の許可をリクエスト

// Class RFApp
static func requestAuthorization(application: UIApplication, applicationDelegate: UIApplicationDelegate, options: [RFAuthorizationOptions] = [.badge, .sound, .alert, .carPlay])
// Class RFApp
+ requestAuthorizationWithOptions:applicationDelegate:options:
パラメータ 内容
application UIApplicationオブジェクト
applicationDelegate UIApplicationDelegateを実装しているクラスのオブジェクト
options 通知表示のオプション(バッジ、通知の表示、サウンド、カープレイ)
カープレイはiOS10以上で利用可能

通知表示のオプション

public enum RFAuthorizationOptions {
    case badge    // バッジを表示する
    case sound    // サウンドを鳴らす
    case alert    // 受信時に通知を表示
    case carPlay  // カープレイ
}
typedef NS_OPTIONS(NSUInteger, RFAuthorizationOptions) {
RFAuthorizationOptionNone    = 0,          
    RFAuthorizationOptionBadge   = (1 << 0), // バッジを表示する
    RFAuthorizationOptionSound   = (1 << 1), // サウンドを鳴らす
    RFAuthorizationOptionAlert   = (1 << 2), // 受信時に通知を表示
    RFAuthorizationOptionCarPlay = (1 << 3), // カープレイ
};

デバイストークンを登録

// Class RFApp
static func registDevice(deviceToken: Data, completion: @escaping (_ result: RFResult) -> Void)
// Class RFApp
+ registDevice:completion:
パラメータ 内容
deviceToken OSから取得したデバイストークン
completion 処理完了時に呼び出されるハンドラ。結果オブジェクト(RFResult)が渡される。

結果オブジェクト

public struct RFResult {
    public let result: Bool    // 結果
    public let message: String // エラーメッセージ
    public let code: Int       // エラーコード
}
@interface RFResult : NSObject

@property (readonly) BOOL result;                            // 結果
@property (readonly, nonatomic, nullable) NSString* message; // エラーメッセージ
@property (readonly) NSInteger code;                         // エラーコード

@end

エラーコード

エラーコード 内容 予想される原因
401 認証失敗 認証トークンが不正か、期限切れの可能性があります。
アプリの再起動または requestAuthorization を呼ぶことで解消する可能性があります。
404 サービス不明 管理サイトで取得したSDK実行キーが指定されていない可能性があります。
SDK実行キーの確認方法
600 通信エラー RichFlyerサーバへの接続に失敗しています。通信環境の悪化等が考えられます。
601 デバイストークン不明 OSから発行されるデバイストークンがRichFlyer SDKに渡されていないか失われた可能性があります。
アプリの再起動または requestAuthorization を呼ぶことで解消する可能性があります。
602 認証トークン不明 デバイストークンの登録に失敗している可能性があります。
アプリの再起動または requestAuthorization を呼ぶことで解消する可能性があります。
603 認証トークン不明 デバイストークンの登録に失敗している可能性があります。
アプリの再起動または requestAuthorization を呼ぶことで解消する可能性があります。
604 SDK実行キー不明 SDK実行キーが指定されていない可能性があります。

実装例

Swift

import UserNotifications
import RichFlyer

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        // 管理サイトで発行されたSDK実行キーを設定
        RFApp.setServiceKey(serviceKey: "1234567890",
            appGroupId: "group.jp.co.infocity.richflyer",
            sandbox: false)

        //通知のDelegate設定
        RFApp.setRFNotficationDelegate(delegate: self)

        //OSに対してプッシュ通知受信の許可をリクエスト                                       
        RFApp.requestAuthorization(application: UIApplication.shared, applicationDelegate: self)

        // 自分で通知受信時のOptionを設定する場合
        //RFApp.requestAuthorization(application: UIApplication.shared, applicationDelegate: self, options: [.alert, .badge, .sound])

        return true
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        //デバイストークンを登録
        RFApp.registDevice(deviceToken: deviceToken, completion: { (result: RFResult) in
            if (!result.result) {
                // 失敗
                print(result.message + "(code:\(result.code))")
            }
        })

    }
}

extension AppDelegate: RFNotificationDelegate {
    func dismissedContentDisplay(_ action: RFAction?, content: RFContent?) {
    }

    func willPresentNotification(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    }

    func didReceiveNotification(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
    }
}

Objective-C

#import "AppDelegate.h"
#import <RichFlyer/RichFlyer.h>

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // 管理サイトで発行されたSDK実行キーを設定
    [RFApp setServiceKey:@"1234567890" appGroupId:@"group.jp.co.infocity.richflyer" sandbox:NO];

    // delegateの設定
    [RFApp setRFNotificationDelegate:self];

    // OSにプッシュ通知の受信許可をリクエスト
    [RFApp requestAuthorization:[UIApplication sharedApplication]
                                applicationDelegate:self];

    // 自分で通知受信時のOptionを設定する場合
    //[RFAppDelegate requestAuthorization:[UIApplication sharedApplication]                                             
    //                                         options:RFAuthorizationOptionAlert|RFAuthorizationOptionBadge|RFAuthorizationOptionSound
    //                             applicationDelegate:self];

    return YES;
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
    //デバイストークンを登録
    [RFApp registDevice:deviceToken completion:^(RFResult* result){
        if (!result.result) {
            // 失敗
            NSLog(@"%@(code:%ld)", result.message, (long)result.code);
        }
    }];
}

#pragma mark - RFNotificationDelegate

- (void)didReceiveNotificationWithCenter:(UNUserNotificationCenter *)center response:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
}

- (void)willPresentNotificationWithCenter:(UNUserNotificationCenter *)center notification:(UNNotification *)notification withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
}

- (void)dismissedContentDisplay:(RFAction *)action content:(RFContent*)content {
}