コンテンツにスキップ

PrivacyControl

PrivacyControlを利用すると、アプリ実行中にエンドユーザの操作によって、FANSHIP サーバへのデータ送信、およびFANSHIP SDK の主要機能を停止することができます。

PrivacyControlは、以下の機能を提供します。

  • カスタマイズを前提とした利用許諾画面
  • データ送信と主要機能を停止・再開する機能

PrivacyControlを利用するには、 PopinfoConfiguration.mpopinfoPrivacyControlEnabledYES にする必要があります。

// PopinfoConfiguration.m 

// PrivacyControlを利用する場合
BOOL const popinfoPrivacyControlEnabled = NO; // ここをYESにする

許諾状態は PopinfoPrivacyControlDefinition.h で定義されています。

// PopinfoPrivacyControlDefinition.h

// PrivacyControl許諾ステータス
typedef NS_ENUM(int, PopinfoPrivacyControlStatus) {
    /// PrivacyContro許諾:未選択
    PopinfoPrivacyControlStatusNotDetermined = 0,
    /// PrivacyControl許諾:同意
    PopinfoPrivacyControlStatusAccepted,
    /// PrivacyControl許諾:同意しない
    PopinfoPrivacyControlStatusDenied,
} NS_SWIFT_NAME(PopinfoPrivacyControlStatus);

PopinfoPrivacyControlStatus は以下の仕様に従って初期化されます。

PopinfoID PopinfoPrivacyControlStatus
アクティベート前 PopinfoPrivacyControlStatusNotDetermined
アクティベート後 PopinfoPrivacyControlStatusAccepted

Info

ユーザー初回起動の時点で既にPrivacyControlが導入されている場合、
PopinfoID は未だアクティベートされていないため PopinfoPrivacyControlStatusNotDetermined で初期化されます。

アプリのアップデートによって初めてPrivacyControlが導入された場合、
PopinfoID は既にアクティベート済みとなるため PopinfoPrivacyControlStatusAccepted で初期化されます。

Warning

PrivacyControl導入後は、許諾状態が PopinfoPrivacyControlStatusAccepted の場合のみ、
FANSHIP サーバへのデータ送信、およびFANSHIP SDK の主要機能が有効となります。

また、自動的にオプトインダイアログ機能が有効となり、
初回起動時のプッシュ通知、位置情報取得に関する許諾処理が実施されなくなります。

利用許諾画面の表示

カスタマイズを前提とした利用許諾画面用のクラスとして PopinfoPrivacyControlViewController が用意されています。

実装例は以下の通りです。

class ViewController: UIViewController, PopinfoPrivacyControlViewControllerDelegate {

    private let privacyControlVC: PopinfoPrivacyControlViewController = PopinfoPrivacyControlViewController(nibName: "PopinfoPrivacyControlViewController", bundle: Bundle.main)

    override func viewDidLoad() {
        super.viewDidLoad()
        // PopinfoPrivacyControlViewControllerDelegateを設定
        privacyControlVC.delegate = self
        // 全画面で表示する
        privacyControlVC.modalPresentationStyle = .fullScreen
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // PrivacyControl利用許諾画面を表示
        showPrivacyControlVC()
    }

    private func showPrivacyControlVC() {
        // PrivacyControlを利用していない場合returnする
        guard PopinfoReceiver.privacyControlEnabled() else { return }

        // 現在のPrivacyControlステータスを確認
        switch PopinfoReceiver.getPrivacyControlStatus() {
        case .notDetermined:
            // 利用許諾画面を表示する。主に初回起動を想定
            present(privacyControlVC, animated: true)
        case .accepted:
            // 利用許諾画面が表示済みの場合、returnする
            guard privacyControlViewControllerNeverShown() else { return }
            // 利用許諾画面を表示する。主にアップデートによってPrivacyControlが導入されたケースを想定
            present(self.privacyControlVC, animated: true)
        default: break
        }
    }

    // 利用規約画面が表示されたことがあるかどうかを返す
    private func privacyControlViewControllerNeverShown() -> Bool {
        let ud = UserDefaults.standard
        ud.register(defaults: ["privacyControlViewControllerNeverShown" : true])
        return ud.bool(forKey: "privacyControlViewControllerNeverShown")
    }

    // MARK: PopinfoPrivacyControlViewControllerDelegate
    func popinfoPrivacyControlViewController(_ viewController: PopinfoPrivacyControlViewController, success: Bool, currentPrivacyControlStatus: PopinfoPrivacyControlStatus) {
        if success {
            // 利用規約表示後、ユーザ操作にてステータス変更が成功した時点で表示済みとする
            UserDefaults.standard.setValue(false, forKey: "privacyControlViewControllerNeverShown")
        }
        dismiss(animated: true) {
            // PrivacyControl利用許諾直後にプッシュ通知、位置情報取得の許諾ダイアログを表示したい場合はここに記述してください。
            // プッシュ通知の許諾ダイアログを表示
            // PopinfoReceiver.shared.requestPushNotificationAuthorization { granted, error in }
            // 位置情報取得の許諾ダイアログを表示
            // PopinfoReceiver.shared.requestLocationAuthorization()
        }
    }
}

データ送信と主要機能を停止・再開する機能

PopinfoReceiver.setPrivacyControlStatus(status: PopinfoPrivacyControlStatus, success: ((Bool) -> Void)?) を利用して、FANSHIP サーバへのデータ送信、およびFANSHIP SDK の主要機能を停止・再開することができます。

実装例は以下の通りです。

// PrivacyControl許諾ステータスを変更するためのアクションシートを表示する
private func privacyControlStatusChange() {
    let currentStatus = PopinfoReceiver.getPrivacyControlStatus()
    let actionSheet = UIAlertController(title: "PrivacyControlステータス変更: \(currentStatus.rawValue)", message: "", preferredStyle: .actionSheet)
    let notDetermined = UIAlertAction(title: "NotDetermined", style: .default) { action in
        PopinfoReceiver.setPrivacyControlStatus(.notDetermined) { success in
            let logText = "PrivacyControlステータス変更: .notDetermined: \(success)"
            print(logText)
        }
    }
    let accept = UIAlertAction(title: "Accept", style: .default) { action in
        PopinfoReceiver.setPrivacyControlStatus(.accepted) { success in
            let logText = "PrivacyControlステータス変更: .accepted: \(success)"
            print(logText)
        }
    }
    let deny = UIAlertAction(title: "Deny", style: .default) { action in
        PopinfoReceiver.setPrivacyControlStatus(.denied) { success in
            let logText = "PrivacyControlステータス変更: .denied: \(success)"
            print(logText)
        }
    }
    let cancel = UIAlertAction(title: "Cancel", style: .cancel)

    actionSheet.addAction(notDetermined)
    actionSheet.addAction(accept)
    actionSheet.addAction(deny)
    actionSheet.addAction(cancel)

    present(actionSheet, animated: true)
}

Warning

PopinfoIDのアクティベートが完了している場合、PopinfoPrivacyControlStatusの変更にはFANSHIP サーバとの通信を必要とします。FANSHIP サーバとの通信が失敗するなど、PopinfoPrivacyControlStatusの変更が行われなかった場合はsuccessが false となります。

主要機能停止時の詳細動作

PrivacyControl導入後、許諾状態が PopinfoPrivacyControlStatusAccepted 以外となった場合、FANSHIP サーバへのデータ送信、およびFANSHIP SDK の主要機能が停止しますが詳細は以下の通りです。

停止する機能 備考
プッシュ通知 配信対象から除外されます
コンテンツ配信(お知らせ) 新規取得のみ停止します
アプリ内メッセージ
イベントトラッキング
ユーザ属性設定
プッシュ通知の許諾ダイアログ
位置情報取得の許諾ダイアログ
ユーザID(PopinfoID) nilを返すようになります
位置情報更新
Wi-Fi検知
Beacon検知

ユーザーIDが確認できる画面の表示

ユーザーからIDの削除依頼時、または匿名化の依頼時に ユーザーIDが必要 となりますので
ユーザーIDを確認できる設定画面をご用意ください。