iOS SDK統合ガイド

 

統合中に問題が発生した場合は以下のFAQをご覧ください。

始める前にSDK の前提条件

Singular SDKの統合の手順に従ってください:計画と前提条件

これらのステップはSingular SDKを統合するための前提条件です。

1.SDK のインストール

CocoaPods、Swift Package Manager、または静的ライブラリを使用して Singular SDK をインストールできます。

CocoaPodsを使用した SDK のインストール
  1. CocoaPods の最新バージョンをダウンロードしてインストールします。
  2. ポッドファイルを作成するには、ターミナルでプロジェクトのルートフォルダーに移動し、次のように入力します:

    pod init
  3. Singular SDKの依存関係を追加するには、プロジェクトのPodfileに以下を追加します:

    pod 'Singular-SDK'

    例えば

    pod_for_swiftcocoapods.png

  4. ターミナルでプロジェクトのルートフォルダーに移動し、以下を実行します:

    pod install
  5. この時点から、プロジェクトを開くために、.xcodeprojファイルの代わりに、Xcodeワークスペースファイル.xcworkspaceを開きます。
  6. 以下の指示に従ってSwift ブリッジヘッダを作成します。
Swiftパッケージマネージャを使用してSDKをインストールする
  1. Xcode で、File > Add Packagesに進み、Singular SDK GitHub リポジトリを入力します:

    https://github.com/singular-labs/Singular-iOS-SDK

    update_sdk_version_1.png

  2. Singular SDKのバージョンを更新します:

    update_sdk_version_2.png

  3. Add Packageボタンをクリックします。
  4. Build Phases > Link Binary with Librariesに進み、AdServices.frameworkライブラリを追加します。 iOS 14.3以上のデバイスでのみ利用可能なので、必ずOptionalにマークしてください。

    link_binary_adservices.png

  5. Build Settings (ビルド設定) > Linking (リンク) > Other Linker Flags (その他のリンカーフラグ) に移動し、その他のリンカーフラグを以下の項目で更新する:

    frameworks.png

    other_linker_flags.png

  6. 以下の手順に従って、Swift ブリッジヘッダを作成します。
Singular SDKフレームワーク(静的ライブラリ)のインストール

Singular Frameworkのダウンロードとインストールは、上記のCocoaPodsまたはSPMを使用しない場合にのみ必要です。

Singular SDK 12.3.2以下からのアップグレードですか?

以下の手順に従って、古いスタティックライブラリを削除してください。

  1. プロジェクトファイルに移動し、Singularスタティックライブラリを削除します。通常、Singular-iOS-sdk-v12.3.2のような名前のフォルダがあるはずです。そのフォルダを右クリックし、プロジェクトから削除します。
  2. 次のセクションに進み、新しいフレームワークをインストールします。

Singular Frameworkを初めて追加する

  1. SDK Frameworkをダウンロードして解凍します。

    あなたの実装に適したFrameworkを選択してください:

  2. 解凍したフォルダをXcodeプロジェクトのフォルダに追加します:

    Xcodeで、[Your App Name] > [Add Files To [Your Project Name]]を右クリックし、開いたダイアログで、[Options] > [Create Groups]を選択し、SDKを解凍したフォルダを追加します。





    これで、Singularフレームワークがプロジェクト

  3. 必要なライブラリを追加します:

    • Xcodeで、Build Phases > Link Binary With Librariesを選択します。
    • クリックし、以下のライブラリを追加します:

      Libsqlite3.0.tbd
      SystemConfiguration.framework
      Security.framework
      Libz.tbd
      AdSupport.framework
      WebKit.framework
      StoreKit.framework
      AdServices.framework (オプションiOS14.3以上のデバイスでのみ利用可能です。).
  4. Singularフレームワークの埋め込みと署名
    • General > Framework, Libraries, and Embedded Contentに移動する。
    • Singularフレームワークを "Embed & Sign "に調整する

Swiftブリッジングヘッダーの追加

CocoaPods または Swift Package Manager を使用して SDK をインストールした場合、Singular SDK から Obj-C ライブラリを使用するために、Swift 用の Bridging Header を作成する必要があります。

  1. プロジェクトで、Header タイプの 新しいファイルを作成し、それをYourProjectName-Bridging-Header と名付けます。

    new_header_file.png

  2. ファイルを開き、以下を追加します:

    #import <Singular/Singular.h>

    例えば

    swift_cocoapods_import_singular.png

  3. Build Settings > Objective-C Bridging Headerに進み、ファイルの相対パスを追加します:

    objective_c_bridging_header.png

2.基本的な SDK インテグレーションのセットアップ

重要

  • Swift を使用するには、Bridging Header が必要です(上記のガイドを参照)。
  • Swift Package Manager を使用して Singular SDK を追加した場合、上記で説明したようにBuild Settings >Other Linker Flagsを更新したことを確認してください。

2.1.Singular ライブラリのインポート

SceneDelegateAppDelegate、またはSingular が使用される任意のファイルで、Singular SDK の使用を開始するために Singular クラスライブラリをインポートします。

// Cocoapods または Swift Package Manager とともにインストールされている場合
import Singular

// Objective-C(新フレームワーク)を手動でインストールした場合
#import <Singular/Singular.h>

// Objective-C(レガシー)を手動でインストールした場合
#import "Singular.h"

2.2.設定オブジェクトの作成

コードでSingularの機能を初期化する前に、Singular設定オブジェクトを作成し、すべての設定オプションを設定する必要があります。このコードブロックは、SceneDelegate に追加します(SceneDelegate を使用していない場合は、AppDelegate に追加します)。

以下のコード例では、コンフィギュレーションオブジェクトを作成し、マネージドモードで SKAdNetwork を有効にし、ATT レスポンスを待つタイムアウトを設定するなど、いくつかの一般的なコンフィギュレーションオプションを設定しています。

以下のセクションでは、各オプションの詳細とカスタマイズ方法について説明します。

例一般的なオプションを持つ設定オブジェクトの作成

SwiftObjective-C
func getConfig() -> SingularConfig? {
          print(Date(), "-- Scene Delegate getConfig")
          // SDKキーとSDKシークレットを使用して構成オブジェクトを作成します。
          guard let config = SingularConfig(apiKey: Constants.APIKEY, andSecret:
          Constants.SECRET) else {
              return nil
          }
              
          /* ユーザーの ATT 応答を待機するために、初期化の前に 300 秒の遅延を設定します。 ATT プロンプトを表示しない場合は、これを削除してください。*/
          config.waitForTrackingAuthorizationWithTimeoutInterval = 300
              
          // カスタム ESP ドメインのサポート
          config.espDomains = ["links.your-website-domain.com"]
              
          // ディープリンクのハンドラーメソッドを設定する
          config.singularLinksHandler = { params in
              self.handleDeeplink(params: params)
          }
              
          return config
      }

Note: Singular iOS SDK バージョン 12.0.6 から、SKAdNetwork はデフォルトで有効になっています。

まだ古いバージョンのSDKを使用している場合、設定オブジェクトを作成するときに次のコードを使用してSKAdNetworkを有効にする必要があります:

SwiftObjective-C
// 管理モードで SKAdNetwork を有効にする
config.skAdNetworkEnabled = true

2.3.SKAdNetwork オプションのカスタマイズ

SKAdNetworkは、エンドユーザーのプライバシーを損なうことなく、モバイルインストールの帰属を決定するための Apple のフレームワークです。SKAdNetworkを使用すると、ユーザーの個人情報を共有することなく、アプリマーケティングキャンペーンのパフォーマンスを測定できます。

デフォルトでは、SKAdNetworkはマネージドモードで有効になっており、コンバージョン値はサーバーサイドからSingularによって直接管理されます。マネージドモードを使用する場合、SKAdNetworkを処理するためにアプリにコードを追加する必要はありません。

これにより、クライアント側のコードを変更することなく、Singularプラットフォームを通してコンバージョン値を設定・変更することができるため、最大限の柔軟性が得られます。

このサーバーサイドのマネージドモードは、SKAdNetworkのタイマーの処理にも役立ちます。SKAdNetworkでは、SKAdNetworkへの登録から24時間以内にコンバージョン値を更新することができます。コンバージョン値の更新を呼び出すと、タイマーはさらに24時間延長されます。そのため、コンバージョンイベントを選択する際は、その更新ウィンドウ内でイベントが発生するようにする必要があります。マネージドモードでは、アプリの新しいバージョンをリリースすることなく、いつでもコンバージョンイベントの設定を変更することができます。

マニュアルモードでSKAdNetworkを使用する(上級者向け)

マニュアルモードでSKAdNetworkを使用する方法について説明します。

アプリのコードを使用して自分でコンバージョン値を更新したい場合は、まずSingular ConfigでmanualSkanConversionManagementフラグを設定する必要があります。これにより、いくつかのSDKメソッドを使用して変換値を手動で取得、更新することができます。

手動モードを有効にするには

SwiftObjective-C
func getConfig() -> SingularConfig? {
          // 単一構成オプション
          guard let config = SingularConfig(apiKey: Constants.APIKEY,
                  andSecret: Constants.SECRET) else {
              return nil
          }
          ...
          config.manualSkanConversionManagement = true
          ...
          return config
      }

変換値を更新する

マニュアルモードでは、変換値を更新するために、skanUpdateConversionValueメソッドを使う必要があります。アプリのライフサイクルの中で必要な場所で使用することができます。

注意:manualSkanConversionManagementを有効にしていない場合、skanUpdateConversionValueメソッドは機能しません。

skanUpdateConversionValue メソッド
説明 SKAdNetworkの変換値を手動で更新します。
シグネチャ (BOOL)skanUpdateConversionValue:(NSInteger)conversionValue;
使用例
SwiftObjective-C
// ログイン用の標準イベントの送信
    Singular.event(EVENT_SNG_LOGIN)
      
    // イベント後にコンバージョン値を手動で 7 に更新する
    Singular.skanUpdateConversionValue(7)

他の SKAdNetwork メソッド

現在の変換値を取得するには、skanGetConversionValueメソッドまたはconversionValueUpdatedCallbackを使用します。どちらもマネージドモードとマニュアルモードで動作します。

skanGetConversionValue メソッド
説明 Singular SDKによって追跡された現在のコンバージョン値を取得します。
シグネチャ (NSNumber *)skanGetConversionValue;
使用例
SwiftObjective-C
let conversionValue = Singular.skanGetConversionValue()
conversionValueUpdatedCallback コールバック
説明 Singular SDK によって追跡された現在の変換値を取得します。
シグネチャ void(^conversionValueUpdatedCallback)(NSInteger);
使用例
SwiftObjective-C
func getConfig() -> SingularConfig? {
          // 単一構成オプション
          guard let config = SingularConfig(apiKey: Constants.APIKEY,
              andSecret: Constants.SECRET)
          else {         
              return nil     
          }     
          ...     
          config.conversionValueUpdatedCallback = { conversionValue in
              // ここで最新のコンバージョン値にアクセスできます
          }
          ...
          return config
      } 

2.4.ATT同意の処理 (初期化遅延の設定)

ATT (App Tracking Transparency) プロンプトの表示

iOS 14.5から、アプリは、デバイスのIDFAを含む追跡目的に役立ついくつかのユーザーデータにアクセスして共有する前に、(App Tracking Transparencyフレームワークを使用して)ユーザーの同意を求める必要があります。

Singularは、デバイスを識別し、インストールのアトリビューションを実行するために、IDFAを持つことで非常にメリットがあります(ただし、IDFAなしでアトリビューションを実行する方法もあります)。IDFAを取得するために、ユーザーの同意を求めることを強くお勧めします。

初期化を遅らせてATTの応答を待つ

デフォルトでは、Singular SDKは初期化時にユーザーセッションを送信します。新しいデバイスからセッションが送信されると、Singularのアトリビューションプロセスが即座に開始されます。 このプロセスは、その時点でSingularが利用可能なデータのみに基づいて実行されます。 したがって、Singular SDKが最初のセッションを送信する 前に同意を求め、IDFAを取得することが不可欠です。

ユーザーセッションの開始を遅らせるには、Singular SDKを初期化し、ConfigオブジェクトにwatefForTrackingAuthorizationWithTimeoutIntervalオプションを指定します。 このオプションは、2.2のコードサンプルにすでに含まれています。設定オブジェクトの作成

SwiftObjective-C
func getConfig() -> SingularConfig? {
          guard let config = SingularConfig(apiKey: Constants.APIKEY,
              andSecret: Constants.SECRET) else {
              return nil
          }
          ...
          config.waitForTrackingAuthorizationWithTimeoutInterval = 300
          ...
          return config
      }

ヒント初期化遅延を設定すると、アプリの流れは次のようになります:

  1. アプリが開くと、Singular SDKはセッションとユーザーイベントの記録を開始しますが、Singularサーバーにはまだ送信しません。
  2. App Tracking Transparencyの同意が許可/拒否されるか、設定された時間が経過すると、SDKはセッションとキューに入ったイベントをSingularサーバーに送信します(IDFAの有無は問いません)。
  3. その後Singularは、IDFAが利用可能であればそれを利用してアトリビューションプロセスを開始します。
可能なすべてのATTシナリオについて学ぶ

次の表は、この統合を使用したシナリオをまとめたものです:

シナリオ IDFAの利用可能性
ユーザーが同意ダイアログを表示し、設定された時間が経過する前に同意する。 IDFAが利用可能
ユーザーが同意ダイアログを表示し、設定時間が経過する前に同意を拒否する。 IDFAが利用できない
設定時間が経過し、同意ダイアログが表示され、同意する。 IDFA は、同意の後に報告されるユーザーイベントでのみ利用可能である。
設定時間が経過し、同意ダイアログが表示され、同意が拒否される。 IDFA は利用できない
ユーザが同意ダイアログを表示し、アクションを起こさずにアプリを終了し、設定時間が経過した後にアプリを開いて同意を与えた。 アプリが再び開かれると、キューに入れられたイベントがSingularサーバーに送信されます。IDFAはこれらのイベントでは使用できません。同意が付与された後に追跡されるイベントには、IDFAが関連付けられます。
ユーザーは同意ダイアログを表示され、アクションを起こさずにアプリを終了し、後でアプリを開いて同意を拒否します。 キューに入れられたイベントは、アプリが再び開かれたときにSingularサーバーに送信されます。IDFAは、これらのイベントやその後に追跡されるイベントには使用できない。

2.5.ディープリンクの処理

アプリがインストールされたデバイスでユーザーがディープリンクをクリックすると、アプリが開き、特定の商品や体験が表示されます。

Singularのトラッキングリンクには、ディープリンク機能だけでなく、ディファードディープリンク機能を含めることができます(詳しくはディープリンクFAQと Singular Links FAQをご覧ください)。

前のステップで実装したSingular SDK Configは、コールバック関数("handleDeeplink")を参照します。handleDeeplink」関数は、Singular SDKでディープリンクと ディファードディープリンクのサポートを有効にするために必要です。

ディープリンクを実装するための前提条件

以下の手順を完了していることを確認してください:

  • Singular Links Prerequisitesの指示に従ってください。
  • Xcode のSigning & Capabilities > Associated Domains に Singular Custom Subdomain を追加します。
  • 情報(Info) >URLタイプ(URL Types)で、アプリのスキームをURLタイプに追加します。
  • Singular プラットフォームのAppsページに Apple DeveloperTeam IDスキームを追加しました。

注意事項

  • アプリがすでにiOSユニバーサルリンクを使用するように設定されている場合、ユニバーサルリンクドメインは関連付けられたドメインにすでに存在し、残すことができます。このドメインは、次のセクションで説明するように、Supported Domains設定オプションに追加する必要があります。
  • また、Singularカスタムリンクドメインも含める必要があります。これは、Singularがマーケティングキャンペーンからのアトリビュートをトラッキングし、これらのキャンペーンからのディープリンクを処理できるようにするためです。

ハンドラのコールバックメソッドの作成

以下のコード例では、handleDeeplinkというコールバックメソッドを作成しています (このメソッドは上記の Config コードサンプルで参照されています)。

ブロックシグネチャはvoid(^)(SingularLinkParams*) です。SingularLinkParamsには、ディープリンク先パススルーパラメータ、リンクが延期されるかどうかが含まれます。

SwiftObjective-C
func handleDeeplink(params: SingularLinkParams?) {
          // Singular Link からディープリンク データを取得する
          let deeplink = params?.getDeepLink()
          let passthrough = params?.getPassthrough()
          let isDeferredDeeplink = params?.isDeferred()
          let urlParams = params?.getURLParameters()
          // ここにディープリンク処理コードを追加します
      }

他のリンクオプション

2.6.Singularの初期化

ヒント: 先に進む前に、以下のステップが完了していることを確認してください!

  • Singular ライブラリの追加
  • swiftを使用している場合:Swift Bridging Headerを作成
  • Singular Configオブジェクトを作成するコードを追加
  • ディープリンクハンドラを追加
  • SKAdNetworkを有効にした
  • ATTを表示する場合: waitForTrackingAuthorizationWithTimeoutIntervalを追加しました。
  • アプリのビルドをテストし、成功(この段階では、アプリはエラーなしでビルドされるはずです

アプリを開くたびにSingular SDKを初期化する必要があります。 これはSingularのすべてのアトリビューション機能の前提条件であり、またSingularに新しいユーザーセッションを送信します(セッションはユーザーのリテンションを計算するために使用されます)。 SDKは2.2.設定オブジェクトの作成

初期化コードはどこに追加しますか?

アプリの各エントリーポイントでSingular SDKを初期化する必要があります:

  • SceneDelegateまたはAppDelegateなしでSwiftUIインターフェイスを使用しているiOS 13+の場合、以下のContentView().onOpenURL()と.onChange(of: scenePhase)でSingular SDKを初期化する(例として以下のコードを参照)。

  • iOS 13+の場合、以下のSceneDelegate関数でSingular SDKを初期化します: willConnectTo session, continue userActivity, openURLContexts URLContexts。

  • SceneDelegateをサポートしていない古いバージョンのiOSでは、以下のAppDelegate関数でSDKを初期化します: didFinishLaunchingWithOptions、 continueUserActivity、 openURL。

初期化コード例

iOS 13+ 用 (Swift SceneDelegate)
// 以下のscenedelegate関数でsdkを初期化する。
// willConnectTo session
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { let userActivity = connectionOptions.userActivities.first // Singular SDKコンソールで使用するために、IDFVをコンソールに印刷する。 print(Date(), "-- Scene Delegate IDFV:", UIDevice().identifierForVendor!.uuidString as Any)
// ここでSingular SDKを初期化します: if let config = self.getConfig() { config.userActivity = userActivity Singular.start(config) } } // continue userActivity func scene(_ scene: UIScene, continue userActivity: NSUserActivity) { // continueUserActivityで新しいSingularセッションを開始する。 if let config = self.getConfig() { config.userActivity = userActivity Singular.start(config) } } //openURLContexts URLContexts func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { // コールドスタート時にディープリンクスキームから新しいSingularセッションを開始する。 if let config = self.getConfig() { config.openUrl = openurlString Singular.start(config) }
// ここにカスタムコードを追加して、Singular以外のディープリンクにリダイレクトする。 //... }
iOS 13+ 用 (SwiftUI インターフェース)
// 以下のwindowgroup関数でsdkを初期化する。
var body: some Scene { WindowGroup { ContentView() .onOpenURL(perform: { url in openURL = url // openURLからSingularを初期化する if let config = self.getConfig() { config.openUrl = url Singular.start(config) } }) } .onChange(of: scenePhase) { oldValue, phase in // SwiftUI ScenePhases は古い SceneDelegate ライフサイクルイベントを置き換えます。 switch phase { case .background: print("アプリシーン:バックグラウンド") case .inactive: print("アプリシーン:非アクティブ") case .active: print("アプリシーン:アクティブ") // シングラーの初期化 if let config = self.getConfig() { Singular.start(config) } @unknown default: print("アプリシーン:不明") } } }
iOS 13+ 用 (Objective-C SceneDelegate)
// 以下のscenedelegate関数でsdkを初期化する。
     
// willConnectToSession
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session
options:(UISceneConnectionOptions *)connectionOptions { NSUserActivity* userActivity = [[[connectionOptions userActivities] allObjects]
firstObject]; // Singular SDK コンソールで使用するために、ベンダーの識別子(IDFV)を Xcode コンソールに印刷します。 NSLog(@"-- Scene Delegate IDFV: %@", [[[UIDevice currentDevice] identifierForVendor] UUIDString]);
// バックグラウンドのアプリから新しいSingularセッションを開始する SingularConfig *config = [self getConfig]; config.userActivity = userActivity; [Singular start:config]; } // continueUserActivity
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity{ // バックグラウンドのアプリから新しいSingularセッションを開始する SingularConfig *config = [self getConfig]; config.userActivity = userActivity; [Singular start:config]; } // openURLContexts
- (void)scene:(UIScene *)scene openURLContexts:(nonnull NSSet *)URLContexts { // コールドスタート時にディープリンクスキームから新しいSingularセッションを開始する。 SingularConfig *config = [self getConfig]; config.openUrl = url; [Singular start:config]; // ここにカスタムコードを追加して、非特異型ディープリンクにリダイレクトする //... }
古いiOSバージョン用 (Objective-C AppDelegate)
// 以下のappdelegate関数でsdkを初期化する。
    
// didFinishLaunchingWithOptions
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // セッションのタイムアウトが過ぎた場合、またはシングラーリンクを使用して開いた場合、ユーザーがアプリを開いたときに新しいセッションを開始する。 SingularConfig *config = [self getConfig]; config.launchOptions = launchOptions; [Singular start:config]; return YES; } // continueUserActivity
- (BOOL)application:(UIApplication *)application
continueUserActivity:(NSUserActivity *)userActivity
restorationHandler:(void (^)(NSArray<id> *restorableObjects))restorationHandler { // ユーザーがバックグラウンドでSingular Linkを使ってアプリを開くと、新しいセッションを開始する。 SingularConfig *config = [self getConfig]; config.userActivity = userActivity; [Singular start:config]; return YES; } // openURL
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options{ // 従来のアプリのスキームのように、ユーザーがSingular以外のリンクを使用してアプリを開くと、新しいセッションが開始されます。 SingularConfig *config = [self getConfig]; config.openUrl = url; [Singular start:config]; // ここにカスタムコードを追加して、Singular以外のディープリンクにリダイレクトする。 //... return YES; }

注意事項

  • configオブジェクトを作成するときは、正しいオプション(userActivityまたはopenUrl)を渡すように注意してください。以下のサンプルコードを参照し、必要に応じてサンプルアプリを参照してください。
  • GDPR、CCPA、COPPAなど、ビジネスを行う地域で制定されているさまざまなプライバシー法を遵守することを忘れないでください。詳細については、SDKのオプトインとオプトアウトの実践を参照し、データプライバシー法の遵守に役立つSingular SDK関数を確認してください。
  • SDKを初期化するには、Singular SDK KeyとSDK Secretが必要です。これらはSingularプラットフォームの "Developer Tools > SDK Integration > SDK Keys "から入手できます。

2.7.ユーザーIDをSingularに送信する(オプション)

Singular SDKのメソッドを使用して、内部ユーザーIDをSingularに送信することができます。

注意: Singularのクロスデバイスソリューションをご利用の場合は、すべてのプラットフォームでユーザーIDを収集する必要があります。

  • ユーザーIDはどのような識別子でもかまいませんが、PII(個人を特定できる情報)を公開するべきではありません。 例えば、ユーザーのメールアドレス、ユーザー名、電話番号は使用しないでください。Singularは、お客様のファーストパーティデータにのみユニークなハッシュ値を使用することを推奨します。
  • Singularに渡すユーザーIDは、すべてのプラットフォーム(ウェブ/モバイル/PC/コンソール/オフライン)で同じ内部ユーザーIDを使用する必要があります。
  • Singularはユーザーレベルのエクスポート、ETL、内部BIポストバック(設定されている場合)にユーザーIDを含めます。ユーザーIDはファーストパーティデータであり、Singularが他者と共有することはありません。
  • ユーザーIDの値は、Singular SDKメソッドで設定されると、unsetCustomUserId メソッドで設定が解除されるまで、またはアプリがアンインストールされるまで保持されます。アプリを終了または再起動しても、ユーザーIDはアンセットされません。

ユーザーIDを設定するには、setCustomUserId メソッドを使用します。設定を解除するには(ユーザがアカウントから「ログアウト」した場合など)、unsetCustomUserId を呼び出してください。

注:複数のユーザが1つのデバイスを使用する場合、ログインとログアウトのたびにユーザIDを設定および解除するログアウトフローを実装することを推奨します。

アプリを開いたときにユーザーIDがすでに分かっている場合は、Singular SDKを初期化する前にsetCustomUserId 。こうすることで、Singularは最初のセッションからユーザーIDを持つことができます。しかし、ユーザーIDは通常、ユーザーが登録するかログインを実行するまで使用できません。その場合は、登録フローが完了した後にsetCustomUserId

setCustomUserId および unsetCustomUserId メソッド
説明 ユーザー ID を設定および解除します。
シグネチャ (void)setCustomUserId:(NSString*)customUserId
(void)unsetCustomUserId;
使用例
SwiftObjective-C
setCustomUserId("custom_user_id")
unsetCustomUserId()
オプションカスタムユーザーIDデバイスマッピング

重要:この高度なエンタープライズ機能は例外的な場合にのみ利用可能です。実装する前にSingularのソリューションエンジニアにご相談ください。

Singularはサーバー間の統合により、追加のモバイルイベント追跡データを受け取ることができます。この機能を利用するには、ユーザーIDをSingularのモバイルデバイス追跡識別子にマッピングする必要があります。

注意:Singular SDKを初期化した後、またはユーザーIDを取得した後、できるだけ早くこのメソッドを呼び出してください。

setDeviceCustomUserId メソッド
説明 ログイン時と同じカスタムユーザーIDを設定し、Singularのトラッキング識別子にマッピングします。
シグネチャ static void setDeviceCustomUserId(String customUserId)
使用例
SwiftObjective-C
setDeviceCustomUserId("custom_user_id")

2.8.グローバルプロパティの実装 (オプション)

Singular SDK では、アプリから送信されるすべてのセッションとイベントと一緒に Singular サーバーに送信されるカスタムプロパティを定義できます。これらのプロパティは、ユーザーやアプリのモード/ステータスなど、あらゆる情報を表すことができます。

グローバルプロパティは5つまで定義できます。これらのグローバルプロパティは、アプリが実行される間、あなたが設定を解除するか、ユーザーがアプリをアンインストールするまで(あなたが設定した最新の値で)保持されます。

使用例

グローバル・プロパティの使用例としては、以下のようなものがあります:

  • サードパーティのSDKから識別子を渡し、それをSingularからサードパーティへのポストバックでマッチングの目的で使用します。
  • ゲームアプリでは、"Level "というプロパティを定義し、初期値を "0 "に設定することができます。アプリから送信されるすべてのセッションとイベントは、"Level": "0 "で送信されます。ユーザーがレベルアップすると、プロパティは "1 "にリセットされます。

注意事項

  • グローバルプロパティは現在、Singularのユーザーレベルのイベントログ(属性ログのエクスポートを参照)とポストバックに反映されます。Singularの集計レポート(レポートページまたはレポートAPI)でのグローバルプロパティのサポートは将来追加される予定です。この機能についてご質問がある場合、またはグローバルプロパティサポートのアップデートにご興味がある場合は、Singularカスタマーサクセスマネージャーまでお問い合わせください。
  • 各プロパティ名と値の長さは200文字までです。それ以上のプロパティ名や値を渡すと、200文字に切り詰められます。

コンフィグオブジェクトによるグローバルプロパティの設定

SDKを初期化する前にグローバル・プロパティを設定するには、ConfigオブジェクトのsetGlobalPropertyメソッドを使用します。

グローバル・プロパティとその値はアプリの実行間で持続するため、設定するプロパティがすでに別の値に設定されている可能性があることに注意してください。既存のプロパティを新しい値で上書きするかどうかをSDKに指示するには、overrideExistingパラメータを使用します。

setGlobalProperty メソッド
説明 グローバル プロパティを設定します。
シグネチャ (void)setGlobalProperty:(NSString*)key withValue:(NSString*)value overrideExisting:(BOOL)overrideExisiting;
使用例
SwiftObjective-C
 func getConfig() -> SingularConfig? {         
              /* (オプション) グローバル プロパティに設定するサードパーティの識別子を取得します。 サードパーティ SDK が Singular に識別子を提供している場合は、Singular の前にそれぞれの SDK を初期化する必要があります。*/
              let thirdPartyKey = "anonymousID"     
              let thirdPartyID = "2ed20738-059d-42b5-ab80-5aa0c530e3e1"     
          
              // 単一構成オプション     
              guard let config = SingularConfig(apiKey: Constants.APIKEY, 
                  andSecret: Constants.SECRET)
              else {         
                  return nil
              }     
              ...     
              // Singular Global Properties 機能を使用してサードパーティ ID を取得する
              config.setGlobalProperty(thirdPartyKey, withValue:
                  thirdPartyID, overrideExisting: true)     
              ...
              return config 
          }

初期化後のグローバルプロパティの設定

アプリの実行中にいつでもグローバルプロパティを設定、解除、取得するには、以下のメソッドを使用します。

注意事項

  • プロパティがまだ存在せず、他の5つのグローバルプロパティがすでに存在する場合、プロパティは追加されません。
  • プロパティが既に設定されている場合、overrideExisting パラメータは、既存の値をオーバーライドするかどうかを決定します。
  • このメソッドは、プロパティが正常に設定された場合は true を返し、そうでない場合は false を返します。
setGlobalProperty メソッド
説明 グローバル・プロパティを指定された値に設定します。
シグニチャ (BOOL) setGlobalProperty:(NSString*)key andValue:(NSString*)value overrideExisting:(BOOL)overrideExisting
使用例
SwiftObjective-C
var result = Singular.setGlobalProperty("propertyName",
              andValue: "propertyValue", overrideExisting: true)
getGlobalProperties メソッド
説明 すべてのグローバルプロパティとそれらの現在の値を Map として取得します。
シグネチャ NSDictionary*) getGlobalProperties
使用例
SwiftObjective-C
var globalProperties = Singular.getGlobalProperties()
unsetGlobalProperty メソッド
説明 グローバルプロパティを削除します。
シグネチャ (void) unsetGlobalProperty:(NSString*)key
使用例
SwiftObjective-C
Singular.unsetGlobalProperty("propertyName")
clearGlobalProperties メソッド
説明 すべてのグローバルプロパティを削除します。
シグネチャ (void) clearGlobalProperties
使用例
SwiftObjective-C
Singular.clearGlobalProperties()

2.9.セッションタイムアウトの変更 (オプション)

デフォルトでは、アプリがフォアグラウンドに戻る前に60秒以上バックグラウンドで実行された場合、SDKは新しいセッションを登録します。このタイムアウト値を変更するには、setSessionTimeoutメソッドを使用し、Configに追加します。

setSessionTimeoutメソッド
説明 セッションタイムアウト値を変更します。
シグネチャ (void)setSessionTimeout:(int)timeout
使用例
SwiftObjective-C
 func getConfig() -> SingularConfig? {       
              // 単一構成オプション     
              guard let config = SingularConfig(apiKey: Constants.APIKEY, andSecret:
                  Constants.SECRET) else {         
                  return nil     
              }     
              ...     
              Singular.setSessionTimeout(120)      
              ...     
              return config
          } 

3.イベントと収益のトラッキング

: ユーザーイベントの計画の詳細については SDKの計画と前提条件のガイドの「アプリはユーザーイベントを追跡しますか?
」を参照してください。

注意:アプリ内で Singular SDK メソッドを使用して、すべてのアプリ内イベントを Singular サーバーに送信することをお勧めします。他のプロバイダーや内部サーバーからSingularにイベントを送信する場合は、以下のハイブリッドイベント追跡のセクションを参照してください。

3.1. イベントのトラッキング(非収入)

Singularはアプリ内イベントのデータを収集し、キャンペーンのパフォーマンス分析やKPIの測定に役立てることができます。例えば、ゲームアプリでユーザーのログイン、登録、チュートリアルの完了、レベルアップなどのデータを収集したい場合があります。

Singularに送信されるイベントのリスト(付随する属性付き)は、マーケティングのKPIに基づいてUA/マーケティング/ビジネスチームが編集する必要があります。

ユーザーイベントの計画の詳細については、SDKの計画と前提条件ガイドの「アプリはユーザーイベントを追跡しますか?

コード内で、eventまたはeventWithArgsメソッドを使用して標準イベントをSingularに送信します。

注:標準イベントの場合、 iOS SDK List of Standard Events and Attributesに表示されているイベントのiOS名を使用します(例:EVENT_SNG_LOGIN)。

カスタムイベント(Singularの標準イベントにはない、あなたの組織が測定したいイベント)の場合は、任意のカスタム名(最大32文字)を使用してください。最適化のためにSingularからイベントを受け取る可能性のある広告ネットワークパートナーとの互換性のために、英語の名前を使用することをお勧めします。

イベントメソッド
説明 トラッキング用のユーザーイベントをSingularに送信します。
シグネチャ (void)event:(NSString *)name
使用例
SwiftObjective-C
Singular.event(EVENT_SNG_LOGIN);
eventWithArgs メソッド
説明 トラッキングのためにユーザーイベントを追加情報とともにSingularに送信します。
シグネチャ (void)eventWithArgs:(NSString *)name, ...
使用例 以下の例では、推奨される標準属性を持つコンテンツビューイベントを送信します。
SwiftObjective-C
dic[ATTRIBUTE_SNG_ATTR_CONTENT_TYPE] = "PrivacyController"
          dic[ATTRIBUTE_SNG_ATTR_CONTENT_ID] = "0"
          dic[ATTRIBUTE_SNG_ATTR_CONTENT] = "GDPR and CCPA Opt-Out Options"
          Singular.event(EVENT_SNG_CONTENT_VIEW, withArgs: dic)

3.2.収益のトラッキング

Singularは、キャンペーンのパフォーマンスとROIを分析するために、アプリを通して得た収益に関するデータを収集することができます。Singularはレポート、ログエクスポート、ポストバックでデータを利用できるようにします。

ご注意:アプリがApp StoreのIAPトラッキングをサポートしている場合は、この方法をお勧めします。App StoreのIAPを使用していない場合は、以下の代替方法をご覧ください。

IAPトラッキングで収益を報告する(推奨)

収益イベントをSingularに報告するには、iapCompleteSDKメソッドを使用します。このメソッドはIAP(Appleのアプリ内課金)の収益イベントをSingularに送信します:

  • Singularがレポートを充実させるために使用するトランザクションの詳細。
  • トランザクションレシート:トランザクションを検証し、不正行為を分析または防止するために使用できます。

注意事項

  • iapCompleteを使用する場合、イベントにSKPaymentTransaction オブジェクトを 含める 必要があります。
  • 異なる通貨で報告された収益は、Singularアカウントで設定された組織の優先通貨に自動変換されます。
iapComplete メソッド
説明 トランザクションレシートと共に収益イベントをSingularに送信します。
署名 (void)iapComplete:(id)transaction (void)iapComplete:(id)transaction withName:(NSString *)name;
使用例
SwiftObjective-C
// *** SKPaymentTransaction* トランザクション オブジェクトを取得する ***
          let transaction:SKPaymentTransaction = ...
          
          // カスタム イベント名を指定せずにトランザクション イベントを Singular に送信する
          Singular.iapComplete(transaction)
          
          // カスタム イベント名を使用してトランザクション イベントを Singular に送信する
          Singular.iapComplete(transaction, withName:"MyCustomRevenue")

代替の収益イベント報告

SingularはiapCompleteの使用を推奨していますが、あなたのアプリがApp Store IAPトラッキングを使用しない場合に備えて、Singularに収益イベントを報告するための2つの代替方法も提供しています。

RevenueメソッドとCustomRevenueメソッド

RevenueメソッドとCustomRevenueメソッドでは、トランザクションの金額と通貨を手動で指定できます。customRevenueメソッドでは, カスタムイベント名を渡すこともできます.

これらのメソッドを使用した場合、Singular はトランザクションのレシートを取得せず、トランザクションを検証できないことに注意してください。

注意:通貨はISO 4217 の 3 文字の通貨コードで指定します (例: "USD"、"EUR"、"INR")。

収益 メソッド
説明 収益金額と通貨、オプションの追加詳細を含む収益イベントをSingularに送信します。
シグネチャ

(void)revenue:(NSString *)currency amount:(double)amount;

(void)revenue:(NSString *)currency amount:(double)amount productSKU:(NSString *)productSKU productName:(NSString *)productName productCategory:(NSString *)productCategory productQuantity:(int)productQuantity productPrice:(double)productPrice;

(void)revenue:(NSString *)currency amount:(double)amount withAttributes:(NSDictionary*)attributes;

使用例
SwiftObjective-C
// 製品の詳細が記載されていない収益
          Singular.revenue("USD",amount:1.99)
          
          // 製品の詳細を含む収益
          Singular.revenue("EUR",amount:5.00, productSKU:"SKU1928375", 
              productName:"Reservation Fee",productCategory:"Fee", productQuantity:1, productPrice:5.00)
          
          // 辞書内の属性を含む収益イベントを送信する
          var dic: [AnyHashable : Any] = [:]
          dic[ATTRIBUTE_SNG_ATTR_ITEM_DESCRIPTION] = "100% Organic Cotton Mixed Plaid Flannel Shirt"
          dic[ATTRIBUTE_SNG_ATTR_ITEM_PRICE] = "$69.95"
          dic[ATTRIBUTE_SNG_ATTR_RATING] = "5 Star"
          dic[ATTRIBUTE_SNG_ATTR_SEARCH_STRING] = "Flannel Shirt"
          Singular.revenue("USD", amount: 19.95, withAttributes: dic)
customRevenue メソッド
説明 イベント名、収益額、通貨、オプションの追加詳細を持つ収益イベントを Singular に送信します。
シグネチャ

(void)customRevenue:(NSString *)eventName currency:(NSString *)currency amount:(double)amount;

(void)customRevenue:(NSString *)eventName currency:(NSString *)currency amount:(double)amount productSKU:(NSString *)productSKU productName:(NSString *)productName productCategory:(productQuantity:(int)productQuantity productPrice:(double)productPrice;

(void)customRevenue:(NSString*)eventname currency:(NSString *)currency amount:(double)amount withAttributes:(NSDictionary*)attributes;

使用例
SwiftObjective-C
// カスタム名が付けられ、商品の詳細が記載されていない収益
          Singular.customRevenue("MyCustomRevenue", currency:"USD", amount:1.99)
          
          // カスタム名と製品詳細を使用した収益
          Singular.customRevenue("MyCustomRevenue", currency:"EUR", amount:5.00, productSKU:"SKU1928375",
              productName:"Reservation Fee", productCategory:"Fee", 
              productQuantity:1, productPrice:5.00)
          
          // 辞書内の属性を含むカスタム収益イベントを送信する
          var dic: [AnyHashable : Any] = [:]
          dic[ATTRIBUTE_SNG_ATTR_ITEM_DESCRIPTION] = "100% Organic Cotton Mixed Plaid Flannel Shirt"
          dic[ATTRIBUTE_SNG_ATTR_ITEM_PRICE] = "$69.95"
          dic[ATTRIBUTE_SNG_ATTR_RATING] = "5 Star"
          dic[ATTRIBUTE_SNG_ATTR_SEARCH_STRING] = "Flannel Shirt"
          Singular.customRevenue("CustomRevenueWithArgsDic", currency: "USD",
              amount: 44.99, withAttributes: dic)

3.3.ハイブリッドイベントトラッキング(上級者向け)

Singularでは、アプリに統合されたSingular SDKを通してすべてのイベントと収益を送信することを推奨しています。ただし、Singularは他のソースからイベントと収益を収集することもできます。

Singular SDKから送信されないイベントは、Singularのサーバー間イベントドキュメンテーション要件に準拠し、イベントの属性を正しく設定するために一致するデバイス識別子を提供する必要があります。

重要です

Server-to-Server イベントリクエストで使用されるデバイス識別子がSingularで一致しない場合、不一致が発生します。以下の可能性に注意してください:

  • イベントリクエストがSingular SDKがアプリセッションからデバイス識別子を記録する「前」に受信された場合、そのイベントリクエストは未知のデバイスの「最初のセッション」とみなされ、Singularはそのデバイスをオーガニックアトリビューションとしてアトリビュートします。
  • もしSingular SDKがデバイス識別子を記録していたとしても、Singular SDKの識別子がServer-to-Server Eventリクエストで指定されたデバイス識別子と異なる場合、イベントの帰属は正しくありません。

ハイブリッドイベント追跡ガイド

内部サーバーからのイベント送信

Singularはお客様のサーバーから収益に関するデータを収集し、キャンペーンのパフォーマンスやROIの分析に役立てることができます。

要件

  • アプリ内登録またはログインイベントから、デバイス識別子を取得して渡し、このデータをユーザーIDと共にサーバーに保存します。デバイス識別子はユーザーによって変更される可能性があるため、ユーザーがアプリセッションを生成する際には必ず識別子を更新してください。これにより、サーバー側イベントが正しいデバイスに帰属することが保証されます。
  • サーバー側イベントはプラットフォーム固有であるため、デバイスプラットフォームに一致するデバイス識別子(iOSデバイスのIDFAまたはIDFVなど)のみを使用して送信する必要があります。
  • Singular 内部 BI ポストバック メカニズムを使用して、内部エンドポイントにリアルタイムでイベントをプッシュすると、サーバー側でデータセットを更新できます。内部BI ポストバック FAQ を参照してください。
  • 詳細については、『サーバー間統合』ガイドの「収益の追跡」セクションを参照してください。
収益プロバイダからのイベントの送信
RevenueCatや adaptyのようなサードパーティプロバイダーは、Singularに購入収益や購読収益を提供することができます。

これらのパートナーを有効にする方法の詳細については、以下のリンクを参照してください。

  • 詳しくは RevenueCatのドキュメントをご覧ください。
  • 詳細は adaptyのドキュメントをご覧ください。
セグメントからのイベント送信

SingularSDKと並行してSegmentからSingularにイベントを送信するには、Segmentに"Cloud-Mode "Destinationを追加する必要があります。こちらのガイドに従ってください。

4.詳細オプション

4.1.ショートリファラーリンクの作成

注:この機能はSDKバージョン11.0.8+で利用可能です。

createReferrerShortLinkメソッドを使用して、ユーザーが友達とアプリを共有するための短縮共有リンクを生成します。リンクの作成時に、アプリのコードで参照元ユーザーの詳細を定義します。これにより、レポートでリファラーの属性を追跡できます。

短いリンクを作成するには

  1. このリンクは、以下のコードでベースリンクとして参照されます。
  2. リンクに動的に追加する任意のキャンペーンオーバーライドパラメータ(オプションのリストについては、トラッキングリンクパラメータを参照してください)。
  3. リンクを共有したユーザーをさかのぼって新規アプリのインストールを追跡するために、参照元ユーザーの名前とID。

以下の例のように、createReferrerShortLinkメソッドを使用してショートリンクを生成します。

createReferrerShortLink メソッド
説明 createReferrerShortLinkメソッドを使用して、ユーザーがアプリを友人と共有するための短縮共有リンクを生成します。
シグネチャ (void)createReferrerShortLink:(NSString *)baseLink referrerName:(NSString *)referrerName referrerId:(NSString *)referrerId passthroughParams:(NSDictionary *)passthroughParams completionHandler:(void(^)(NSString *, NSError *))completionHandler;
使用例
SwiftObjective-C
// 1. リファラーショートリンクの変数を定義する
                
        // ベース リンクとして使用する Singular トラッキング リンクを定義します。
        let referrerBaseLink = "https://yourdomain.sng.link/Csfge/aknl?_dl=myscheme%3A%2F%2Fmydeeplink/referrer&_smtype=3";
        
        // 紹介者IDと名前を追加します
        let referrerID = referrerIDField.text;
        let referrerName = referrerNameField.text;
        
        // パススルーパラメータをカスタマイズする
        let passthroughParams = [
            "channel": "sms"
        ]
            
        // 2. Referrer ShortLink を呼び出してショートリンクを取得し、ソーシャル メディアで共有します
        Singular.createReferrerShortLink(referrerBaseLink, referrerName: referrerName, 
            referrerId: referrerID, passthroughParams: passthroughParams, completionHandler: {(shortLink, error) in
            if error != nil {
                // エラーの原因に基づいて、関数に渡されたパラメータを再試行/中止/変更するロジック
            }
            if (shortLink != nil || shortLink != "") {
                // ここに共有ロジックを追加します。
                ....
            }
        })

4.2.広告収入アトリビューションサポートの追加

注:SDKバージョン11.0.0から、Singular SDKを通して広告収益アトリビューションを設定するオプションが追加されました。アプリのSingular SDKをアップデートしなくても、APIコールを使って広告収益アトリビューションを設定することができます。ただし、SKAdNetworkキャンペーンの広告収益を測定したい場合は、SDKを通じて広告収益アトリビューションを設定する必要があります。

Singular SDKに広告収益アトリビューションサポートを追加するには:

  1. 最新バージョンのSingular SDKを使用していることを確認してください。
  2. 広告収益データに使用するメディエーションプラットフォームに応じて、適切なコードスニペットをSingular SDKインテグレーションに追加します。

注:通貨を3文字のISO 4217通貨コード(例:「USD」、「EUR」、「INR」)で渡します。

AdMob
  1. : この機能はAdmobアカウントで有効にする必要があります。

    を参照してください。https://support.google.com/admob/answer/11322405#getstarted

SwiftObjective-C
var rewardedAd: GADRewardedAd?
GADRewardedAd.load(withAdUnitID: "AD_UNIT_ID", request: request) { 
[weak self] ad, error in guard let self = self else { return } if let error = error { print("報酬付き広告がエラーで読み込めませんでした。: \(error.localizedDescription)") return } self.rewardedAd = ad self.rewardedAd?.paidEventHandler = { adValue in let impressionData = adValue let data = SingularAdData(
adPlatform: "Admob", currency: impressionData.currencyCode, revenue: impressionData.value) }
}
AppLovinMax
  1. AppLovin MAXのイベントから受け取ったオブジェクトを取得するdidReceivedMessage
SwiftObjective-C
if let message = message {
   let data = SingularAdData(
adPlatform: "AppLovin", currency: "USD", revenue: message.data["revenue"] as? Double ?? 0.0) Singular.adRevenue(data) }
IronSource
  1. IronSourceのイベント(impressionDataDidSucceed)から受け取ったオブジェクトを取得する。
  2. IronSourceのARM SDK Postbacksフラグがオンになっていることを確認してください。
  3. を参照してください。https://developers.is.com/ironsource-mobile/general/ad-revenue-measurement-postbacks/#step-1
SwiftObjective-C
if let impressionData = impressionData {
   let data = SingularAdData(
adPlatform: "IronSource", currency: "USD", revenue: impressionData.revenue) Singular.adRevenue(data) }
TradPlus
  1. impressionDelegate を設定する
  2. TradPlusAdImpression コールバックに Singular を追加する
SwiftObjective-C
TradPlus.sharedInstance().impressionDelegate = self

func tradPlusAdImpression(_ adInfo: [AnyHashable: Any]?) { guard let adInfo = adInfo else { return } let currency = "USD" if let ecpm = adInfo["ecpm"] as? Float { let revenue = CGFloat(ecpm) / 1000.0 let data = SingularAdData(adPlatform: "TradPlus", currency: currency, revenue: revenue) Singular.adRevenue(data) }
}
その他
  1. 関連するデータでSingularAdData オブジェクトを初期化する
  2. データをSingularに報告する
SwiftObjective-C
let data = SingularAdData(
adPlatform: "あなたの広告プラットフォーム", currency: "通貨コード", revenue: 9.90) Singular.adRevenue(data)

4.3.アンインストールの追跡

: アンインストールの追跡は、エンタープライズのお客様のみご利用いただけます。また、アンインストールの追跡には、アプリがプッシュ通知をサポートしている必要があります。APNS を実装するための Apple のガイドを参照してください。

アンインストール追跡を設定するには

  1. ガイド「iOS インストールトラッキングの設定」に従って、Singular でアプリを有効にします。
  2. アプリで、Apple Push Notification Service (APNS) から返されたデバイストークンを Singular に送信します。デバイストークンを Singular に渡すには、registerDeviceTokenForUninstallまたはregisterDeviceTokenメソッドを使用します。これはSingular SDKが初期化される前に行ってください。これは AppDelegate のdidRegisterForRemoteNotificationsWithDeviceTokenメソッドから呼び出す必要があります。

注意: 既存のプッシュ通知実装からすでにデバイストークンを取得している場合は、その値を使用できます。

APNSトークンは通常、ネイティブ形式のバイナリデータです。APNSから受け取ったトークンをそのまま渡します。アプリがトークンのデータ型を変更した場合は、16進文字列として渡してください。

registerDeviceTokenForUninstall メソッド
説明 APNS から返されたデバイス・トークンを渡します。
署名 + (void)registerDeviceTokenForUninstall:(NSData*)deviceToken;
使用例
SwiftObjective-C
func application(_ application: UIApplication, 
        didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // アンインストール追跡のために deviceToken を Singular に送信します     
        Singular.registerDeviceToken(forUninstall: deviceToken) 
    } 

4.4. Singular SDK JavaScript インターフェース

Singular は、アプリで Singular を呼び出すために使用できる JavaScript インターフェイスを提供します。

例えば、JavaScript インターフェースを設定すると、以下のように JavaScript コードから Singular にイベントを送信できます:

JavaScript
Singular.event('event');
Singular.event('test', JSON.stringify({"a1":"bar", "a2":"boo", "a3":"baz"}));

JavaScriptでサポートされているメソッド

このインターフェースは以下のSDKメソッドをサポートしています:

  • setCustomUserID
  • unsetCustomUserID
  • イベント
  • 収益

JavaScriptインターフェースを有効にする

注意:iOS 8.0+から、Appleはアプリにウェブコンテンツを追加するためにWKWebViewを使用することを推奨しています。UIWebViewや WebViewは使用しないでください。詳しくはAppleのWKWebViewのドキュメントを参照してください。

WKWebView を使用するときに JavaScript インタフェースを有効にするには、WKNavigationDelegateプロトコルのwebView メソッドにいくつかのコードを追加する必要があります(このプロトコルは、Web ビューがナビゲーション要求を処理するときにトリガされるカスタムビヘイビアを実装するのに役立ちます)。

スウィフト
extension ViewController: WKNavigationDelegate { 
    func webView(_: WKWebView, decidePolicyFor: WKNavigationAction, 
      decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { 
      // 単数ハンドラ
      let js = "typeof(Singular)" 
       webView.evaluateJavaScript(js) { (result, error) -> Void in 
         if let resultString = result as? String { 
           if resultString.isEqual("undefined") { 
             do { 
               let contents = try String(contentsOfFile: 
               Bundle.main.path(forResource: "Singular", ofType: "js")!) 
               self.webView.evaluateJavaScript(contents, completionHandler: nil) 
             } catch { } 
           }
           else { 
             print(decidePolicyFor.request) 
             Singular.processJSRequestWK(self.webView, withURL:decidePolicyFor.request) 
           } 
         }  
       } 
       // コードの残りの部分はここに入れます  
    }
  }

5.データプライバシー法の遵守

Singularは、GDPRやCCPA(カリフォルニア州消費者プライバシー法)などの消費者プライバシー法を遵守している可能性のあるパートナーと協力するために、プライバシー保護機能を提供します。 これらのパートナーは、エンドユーザーが個人情報の共有に同意した場合に通知されることを望んでいます。

5.1. データ共有の制限

ユーザーに情報共有の同意を求める方法を実装している場合は、limitDataSharingメソッドを使用してユーザーの選択をSingularに通知します:

  • limitDataSharing:NOを使用して、ユーザーが情報の共有に同意した (オプトインした) ことを示します。
  • ユーザーが同意しなかった場合はlimitDataSharing:YES を使用します。

Singularは「ユーザープライバシーのポストバック」においてLimitDataSharingを使用し、関連法規を遵守するためにこの情報を必要とするパートナーに情報を提供します。詳しくは「ユーザーのプライバシーとデータ共有の制限」をご覧ください。

注:このメソッドの使用は任意ですが、ユーザーがオプトインしたことが特に通知された場合に限り、パートナーがSingularと共有する属性情報がある場合があります。

limitDataSharing メソッド
説明 個人データの共有に関するユーザーの同意(オプトイン)をSingularに通知します。
シグネチャ (void)limitDataSharing:(BOOL)shouldLimitDataSharing;
使用例
SwiftObjective-C
// ユーザーが共有を選択しました
data Singular.limitDataSharing(false) 

5.2 GDPR 準拠のための追加メソッド

Singular SDK は、GDPR ポリシーに準拠し、トラッキングに対するユーザーの同意または非同意について Singular に知らせるのに役立ついくつかのメソッドを提供します。

trackingOptIn メソッド
説明 トラッキングに対するユーザーの同意(オプトイン)をSingularに通知します。
署名 (void)trackingOptIn;
使用例
SwiftObjective-C
Singular.trackingOptIn() 
stopAllTracking メソッド
説明 このアプリでこのユーザーのすべてのトラッキング活動を停止します。
シグネチャ (void)stopAllTracking;
使用例

重要:このメソッドを呼び出すと、アプリの再起動の間であってもSDKが無効になります(状態は永続的です)。 これをオフにする唯一の方法は、resumeAllTrackingメソッドを呼び出すことです。

SwiftObjective-C
Singular.stopAllTracking() 
resumeAllTracking メソッド
説明 このアプリでこのユーザーのトラッキング活動を再開します。
シグネチャ (void)resumeAllTracking;
使用例
SwiftObjective-C
Singular.resumeAllTracking() 
isAllTrackingStopped メソッド
説明 このアプリのこのユーザーのトラッキング活動のステータスをチェックします。
シグネチャ (BOOL)isAllTrackingStopped;
使用例
SwiftObjective-C
Singular.isAllTrackingStopped()
      // true/falseを返します

6.よくある質問と問題

テストアプリをビルドするときに問題やエラーが発生した場合は、このセクションを参照してください。

"Sandbox: rsync.samba(15813) deny(1) file-read-data..." エラーが発生するのはなぜですか?

Xcode 15 では、ビルドで重要な役割を果たす"User Script Sandboxing" という新しいオプションがあります。その目的は、スクリプトがシステムに意図しない変更を加えるのを防ぎ、ビルドの安定性とセキュリティを強化することです。このオプションを有効にすると、ビルドシステムはユーザースクリプトを制限して、宣言されていない入出力依存関係を許可しないようにする。これはSingular SDKにとって問題となります。Singular SDKは依存関係を動的にリンクするためにスクリプトを実行する必要があるからです。

この問題を解決するには

  1. Build Settings > Build Options. に移動します。
  2. "User Script Sandboxing" を値"No"に調整する。
"No module named Singular" エラーが発生するのはなぜですか?
  1. ブリッジングヘッダーが作成されているか確認してください。
  2. ブリッジングヘッダーファイルがBuild Settings > Objective-C Bridging Header.にリンクされていることを確認する。
"Arm64" ビルドエラーが発生するのはなぜですか?

iOS Simulatorでは、Build Settings > Excluded Architectures でarm64を除外する必要がある場合があります。

excluded_architectures_arm64.png

グローバル・プロパティを実装しました。テストコンソールで表示されないのはなぜですか?

Global Properties は現在 Testing Console には表示されません。 将来追加される予定です。この機能を確認するには、ログのエクスポートを使ってください。

Xcode コンソールで以下のエラーが発生するのはなぜですか?"SKAdNetwork: 変換値の更新中にエラーが発生しました:Error Domain=SKANErrorDomain Code=10"?

このエラーは、SKAdNetworkがキャンペーンからのインプレッションを見ていないときに予想されるものなので、無視してもかまいません(この質問に対するAppleの回答を参照してください)。

なぜロギングエラーが発生するのですか?

以下の一般的なロギングエラーは無視できます:

  • [logging] duplicate column name: singular_link in "ALTER TABLE sessions ADD COLUMN singular_link TEXT DEFAULT NULL"
  • [logging] duplicate column name: payload in "ALTER TABLE sessions ADD COLUMN payload TEXT DEFAULT NULL"
  • [logging] duplicate column name: sequence in "ALTER TABLE events ADD COLUMN sequence INTEGER DEFAULT -1"
  • [logging] duplicate column name: payload in "ALTER TABLE events ADD COLUMN payload TEXT DEFAULT NULL"