楽天リワードSDK iOS 機能詳細 - RakutenReward/RakutenRewardSDK GitHub Wiki

詳細な機能について

RakutenReward クラス

アプリから SDK 側の情報を取得する場合、RakutenReward クラスの下記メソッドを使用してください。

メソッド  戻り値の型 説明
getStatus RakutenRewardStatus リワード機能のステータスを返します
getUser User ユーザ情報を返します
isOptedOut Bool リワード機能の opt-in/out 設定を返します
isUIEnabled Bool 通知 UI の表示/非表示設定を返します
getVersion String SDK のバージョンを返します

RakutenRewardStatus

RakutenRewardStatus はリワード機能の状態を返す enum で、下記のように定義されてます。

メソッド 戻り値の型
Online リワード機能は正常に動作しています
Offline 通信又はその他の問題により、リワード機能は正常に動作していません
AppCodeInvalid AppCode が不正のため、リワード機能は正常に動作していません

RakutenRewardStatus の値は、下記のように取得することができます。

Swift

let status : RakutenRewardStatus = RakutenReward.sharedInstance.getStatus() 

Objective-C

RakutenRewardStatus status = [RakutenReward sharedInstance] getStatus];

getVersion

SDK のバージョンは String 形式で定義されています。(例:”3.0.0”) 下記の方法で SDK のバージョンを取得することができます。

Swift

let version : String = RakutenReward.sharedInstance.getVersion()

Objective-C

NSString *version = [RakutenReward sharedInstance] getVersion];

isOptedOut

ユーザはポータルの設定画面から、リワード機能をオプトアウト(無効化)することができます。 ユーザがリワード機能を無効化した場合、optedOut の値は true になります。

Swift

let isOptedOut : Bool = RakutenReward.sharedInstance.isOptedOut()

Objective-C

Boolean isOptedout = [RakutenReward sharedInstance] isOptedOut];

isUIEnabled

ユーザはポータルの設定画面から、ミッション達成時の通知 UI の表示有無を選択することができます。 ユーザが通知 UI を非表示に設定した場合、uiEnabled の値は false になります。

Swift

let isUIEnabled : Bool = RakutenReward.sharedInstance.isUIEnabled()

Objective-C

Boolean isUIEnabled = [RakutenReward sharedInstance] isUIEnabled];

User クラス

User クラスはユーザ情報を持つクラスで、下記のメソッドにアクセス可能です。

Swift

let user : User? = RakutenReward.sharedInstance.getUser()

Objective-C

User *user = [RakutenReward sharedInstance] getUser];

MissionAchievementData クラス

MissionAchievementData はユーザが達成したミッションの情報を定義したクラスで、 下記のプロパティを保持しています。

プロパティ 説明
name String ミッション名
iconUrl String アイコン画像の URL
instruction String ミッションの説明
action String アクションコード
notificationType String 通知タイプ
achievedDate Date ミッション達成日
point Int 達成時に得られるポイント数
custom Bool 通知タイプが Custom の場合は true, それ以外の場合は false

RakutenRewardDelegate

RakutenRewardDelegate は、下記のメソッドを定義したプロトコルです。 これを実装することにより、ステータスやユーザ情報の変更、ミッションの達成等があった場合に通知を受け取ることがで きます。

public protocol RakutenRewardDelegate {
  optional func didSDKStateChange(status: RakutenRewardStatus)
  optional func didUpdateUnclaimedAchievement(missionAchievement: MissionAchievementData)
  optional func didUpdateUser(user: User) 
}

実装方法

上記の通知を受け取りたい場合、下記の例を参考に RakutenRewardDelegate の実装を行なってください。

Swift

public class ViewController : RakutenRewardDelegate { 
  override func viewDidLoad() {
    RakutenReward.sharedInstance.delegate = self 
  }
}

Objective-C

@interface ViewController : UIViewController<RakutenRweardDelegate> { }
@implementation ViewController {
 - (void) viewDidLoad {
  [super viewDidLoad];
  [RakutenReward sharedInstance].delegate = self;
 }
}

didUpdateUser(user: User)

didUpdateUser メソッドはユーザ情報に変更があった時に呼ばれます。 (例:ユーザがログイン又はログアウトした時)

didUpdateUnclaimedAchievement(missionAchievemnet: MissionAchievementData)

didUpdateUnclaimedAchievement メソッドは、ユーザがミッションを達成した際に呼ばれます。 ミッションの達成通知 UI をカスタムに設定している場合、 このメソッド内に独自 UI を表示する処理を 実装することで、独自 UI を表示することができます。

Swift

func didUpdateUnclaimedAchievement(missionAchievement: MissionAchievementData) { 
  if (missionAchivement.isCustom()) {
    // Show Custom UI here 
  }
}

Objective-C

- (void) didUpdateUnclaimedAchievement: (MissionAchievementData *)missionAchievement {
  switch(status) {
    case RakutenRewardStatusOnline:
      [[RakutenReward sharedInstance] logAction:@"actionCodeOfLaunchMission"];
      break;
    case RakutenRewardStatusOffline:
      break;
    case RakutenRewardStatusAppCodeInvalid:
      break;
  }   
}

didSDKStateChange(status: RakutenRewardStatus)

didSDKStateChange メソッドは RakutenRewardStatus の値に変更があった時に呼ばれます。 例えば1 日1回、初回起動時にミッションを達成させたい場合、didSDKStateChange を利用して実装することが可能です。 下記のように、ステータスが Online になったタイミングを検知して、logAction メソッ ドを呼んでください。 ※1日1回等の判定は別途必要です

Swift

func didSDKStateChange(status: RakutenRewardStatus) { 
  switch(status) {
    case .Online: RakutenReward.sharedInstance.logAction(actionCodeOfLaunchMission) break
    case .Offline: break
    case .AppCodeInvalid: break
  }
}

Objective-C

- (void) didUpdateUnclaimedAchievement: (MissionAchievementData *)missionAchievement {
  switch(status) {
    case RakutenRewardStatusOnline:
      [[RakutenReward sharedInstance] logAction:@"actionCodeOfLaunchMission"];
      break;
    case RakutenRewardStatusOffline:
      break;
    case RakutenRewardStatusAppCodeInvalid:
      break; 
  }
}

ミッション達成通知にカスタムのUIを実装する方法

  1. アクションを送信する
RakutenReward.sharedInstance.logAction(actionCode: "Example")
  1. RakutenRewardDelegateの didUpdateUnclaimedAchievement でミッション達成の通知を受け取る
RakutenRewardDelegate {
    didUpdateUnclaimedAchievement(_ missionAchievement: MissionAchievementData)
}
  1. didUpdateUnclaimedAchievement で UI を表示するコードを実装する
func didUpdateUnclaimedAchievement(missionAchievement: MissionAchievementData) {
 
    // UIの表示/非表示設定を確認します
    guard RewardConfiguration.isUserSettingUIEnabled else {
      return
    }
 
    //  ノーティフィケーションタイプがカスタムであるかどうかを確認 
    if missionAchievement.isCustom() {
      // カスタムUIをメインスレッドで表示させる
    }
}

ポイントは、missionAchievement オブジェクトの claim メソッドをコールすることでできます

func didUpdateUnclaimedAchievement(missionAchievement: MissionAchievementData) {
    // UIのコードは書いておく
    // この操作は、例えばユーザーがクレイムのためのボタンを押したときなどにご使用ください
    missionAchievement.claim()
}

ミッションが複数ある場合

actionCode により分類することで複数のミッションで異なるUIを表示させることができます

func didUpdateUnclaimedAchievement(missionAchievement: MissionAchievementData) {
 
    // UIの表示/非表示設定を確認します
    guard RewardConfiguration.isUserSettingUIEnabled else {
      return
    }
 
 
    //  ノーティフィケーションタイプがカスタムであるかどうかを確認
    if missionAchievement.isCustom() {
      if missionAchievement.getAction() == "ExampleMission1ActionCode" {
        // ExampleMission1ActionCodeに対応するUIを表示させる
      } else {
        // 違うUIを表示させる
      }
    }
}

広告ポータルの実装

こちらの機能はSDKバージョン8.3.0以降になります。

広告ポータルを開く

openAdPortal(delegate: AdPortalDelegate)

Swift

RakutenReward.sharedInstance.openAdPortal(delegate: self)

Objective-C

[[RakutenReward sharedInstance] openAdPortalWithDelegate:self];

AdPortalDelegateについて

広告ポータルのイベントのコールバックを受け取ることができます

public protocol AdPortalDelegate {
    optional func didOpenAdPortal()
    optional func didFailOpenAdPortal(error: OpenAdPortalError)
    optional func didCloseAdPortal()
}

OpenAdPortalError

didFailOpenAdPortal メソッドでのエラータイプになります。

public enum OpenAdPortalError : Int  {

      case AppCodeInvalid

      case URLInvalid

}
ステータス 説明
AppCodeInvalid アプリキーが無効です
URLInvalid URLが無効です

実装例

Swift

extension ViewController: AdPortalDelegate {
    func didOpenAdPortal() {}
    func didFailOpenAdPortal(error: OpenAdPortalError) {
        switch error {
        case .AppCodeInvalid:
            break
        case .URLInvalid:
            break
        }
    }
     func didCloseAdPortal() {}
}

Objetive-C

[[RakutenReward sharedInstance] openAdPortalWithDelegate:self];
- (void)didOpenAdPortal {}
- (void)didFailOpenAdPortalWithError:(enum OpenAdPortalError)error {
    switch (error) {
        case OpenAdPortalErrorURLInvalid:
            break;
        case OpenAdPortalErrorAppCodeInvalid:
            break;
    }
}
- (void)didCloseAdPortal {}

その他の機能について

楽天会員のサインインページの表示 をコードから行う

Swift

RakutenReward.sharedInstance.openSignin()

Objective-C

[[RakutenReward sharedInstance] openSignin];

位置情報の設定について

楽天リワードでは広告の最適化のため位置情報の取得を行なっていますが、これを開発者様側の設定でオフにすることが 可能です。 ※こちらの機能はVer 6.0.2は無効となっております。(位置情報の取得はSDKでは行なっておりません)

Swift

RewardConfiguration.enableManualLocationPermissionRequest = true
RakutenReward.sharedInstance.startSession(appCode: "YOUR_APPLICATION_KEY")

Objective-C

[RewardConfiguration setEnableManualLocationPermissionRequest:YES];
[[RakutenReward sharedInstance] startSessionWithAppCode:@"YOUR_APPLICATION_KEY"];

これらのAPIはリワードSDKの初期化の前に呼び出す必要があります。

バージョン7以降のAPIについて

バージョン7以降のSDKでは、リワード機能のサポートをOS11以降に限定しております。
それに伴い、いくつかのAPIの呼び出しを11以降に限定しております。

@available(iOS 11, *) public class RewardPortalButton : UIView {}
@available(iOS 11, *) public class RewardPortalBarButtonItem : UIBarButtonItem {}
 
@objc public class MissionAchievementData: NSObject {
    @available(iOS 11,*) @objc public func claim() {}
}
 
@objc final public class RakutenReward : NSObject { 
@available(iOS 11, *)@objc public func logAction(actionCode: String)
@available(iOS 11, *) @objc public func openPortal()
@available(iOS 11, *) @objc public func openSignin()
@available(iOS 11, *) @objc public func doSignIn(username: String, password: String, delegate: RakutenRewardSDK.RakutenRewardSessionDelegate?)
@available(iOS 11,*) @objc public func cancelSignIn()
@available(iOS 11,*) @objc public func doSignOut(delegate:)
@available(iOS 11, *) @objc public func cancelSignOut()
}