統合中に問題が発生した場合は、以下のFAQをご覧ください。
始める前にSDK の前提条件
Singular SDKの統合の手順に従ってください:計画と前提条件
これらのステップはSingular SDKを統合するための前提条件です。
1.SDK のインストール
CocoaPods、Swift Package Manager、または静的ライブラリを使用して Singular SDK をインストールできます。
- CocoaPods の最新バージョンをダウンロードしてインストールします。
-
ポッドファイルを作成するには、ターミナルでプロジェクトのルートフォルダーに移動し、次のように入力します:
pod init
-
Singular SDKの依存関係を追加するには、プロジェクトのPodfileに以下を追加します:
pod 'Singular-SDK'
例えば
-
ターミナルでプロジェクトのルートフォルダーに移動し、以下を実行します:
pod install
- この時点から、プロジェクトを開くために、.xcodeprojファイルの代わりに、Xcodeワークスペースファイル.xcworkspaceを開きます。
- 以下の指示に従って、Swift ブリッジヘッダを作成します。
-
Xcode で、File > Add Packagesに進み、Singular SDK GitHub リポジトリを入力します:
https://github.com/singular-labs/Singular-iOS-SDK
-
Singular SDKのバージョンを更新します:
- Add Packageボタンをクリックします。
-
Build Phases > Link Binary with Librariesに進み、AdServices.frameworkライブラリを追加します。 iOS 14.3以上のデバイスでのみ利用可能なので、必ずOptionalにマークしてください。
-
Build Settings (ビルド設定) > Linking (リンク) > Other Linker Flags (その他のリンカーフラグ) に移動し、その他のリンカーフラグを以下の項目で更新する:
- 以下の手順に従って、Swift ブリッジヘッダを作成します。
Singular Frameworkのダウンロードとインストールは、上記のCocoaPodsまたはSPMを使用しない場合にのみ必要です。
Singular SDK 12.3.2以下からのアップグレードですか?
以下の手順に従って、古いスタティックライブラリを削除してください。
- プロジェクトファイルに移動し、Singularスタティックライブラリを削除します。通常、Singular-iOS-sdk-v12.3.2のような名前のフォルダがあるはずです。そのフォルダを右クリックし、プロジェクトから削除します。
- 次のセクションに進み、新しいフレームワークをインストールします。
Singular Frameworkを初めて追加する
-
SDK Frameworkをダウンロードして解凍します。
あなたの実装に適したFrameworkを選択してください:
- Xcode 12以上の場合は、.xcframework [ここからダウンロード]]を使用してください。
- Xcode 11以下の場合は、.framework [ここからダウンロード]を使用してください。
-
解凍したフォルダをXcodeプロジェクトのフォルダに追加します:
Xcodeで、[Your App Name] > [Add Files To [Your Project Name]]を右クリックし、開いたダイアログで、[Options] > [Create Groups]を選択し、SDKを解凍したフォルダを追加します。
これで、Singularフレームワークがプロジェクト
。 -
必要なライブラリを追加します:
- 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以上のデバイスでのみ利用可能です。).
- Singularフレームワークの埋め込みと署名
- General > Framework, Libraries, and Embedded Contentに移動する。
- Singularフレームワークを "Embed & Sign "に調整する
CocoaPods または Swift Package Manager を使用して SDK をインストールした場合、Singular SDK から Obj-C ライブラリを使用するために、Swift 用の Bridging Header を作成する必要があります。
-
プロジェクトで、Header タイプの 新しいファイルを作成し、それをYourProjectName-Bridging-Header と名付けます。
-
ファイルを開き、以下を追加します:
#import <Singular/Singular.h>
例えば
-
Build Settings > Objective-C Bridging Headerに進み、ファイルの相対パスを追加します:
2.基本的な SDK インテグレーションのセットアップ
重要:
- Swift を使用するには、Bridging Header が必要です(上記のガイドを参照)。
- Swift Package Manager を使用して Singular SDK を追加した場合、上記で説明したようにBuild Settings >Other Linker Flagsを更新したことを確認してください。
2.1.Singular ライブラリのインポート
SceneDelegate、AppDelegate、または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 レスポンスを待つタイムアウトを設定するなど、いくつかの一般的なコンフィギュレーションオプションを設定しています。
以下のセクションでは、各オプションの詳細とカスタマイズ方法について説明します。
例一般的なオプションを持つ設定オブジェクトの作成
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
}
- (SingularConfig *)getConfig {
NSLog(@"-- Scene Delegate getConfig");
// SDKキーとSDKシークレットを使用して構成オブジェクトを作成します。
SingularConfig* config = [[SingularConfig alloc] initWithApiKey:APIKEY andSecret:SECRET];
/* ユーザーの ATT 応答を待機するために、初期化の前に 300 秒の遅延を設定します。 ATT プロンプトを表示しない場合は、これを削除してください。*/
config.waitForTrackingAuthorizationWithTimeoutInterval = 300;
// カスタム ESP ドメインのサポート
config.espDomains = @[@"links.your-website-domain.com"];
// ディープリンクのハンドラーメソッドを設定する
config.singularLinksHandler = ^(SingularLinkParams * params) {[self handleDeeplink:params];};
return config;
}
Note: Singular iOS SDK バージョン 12.0.6 から、SKAdNetwork はデフォルトで有効になっています。
まだ古いバージョンのSDKを使用している場合、設定オブジェクトを作成するときに次のコードを使用してSKAdNetworkを有効にする必要があります:
// 管理モードで SKAdNetwork を有効にする
config.skAdNetworkEnabled = true
// 管理モードで SKAdNetwork を有効にする
config.skAdNetworkEnabled = YES;
2.3.SKAdNetwork オプションのカスタマイズ
SKAdNetworkは、エンドユーザーのプライバシーを損なうことなく、モバイルインストールの帰属を決定するための Apple のフレームワークです。SKAdNetworkを使用すると、ユーザーの個人情報を共有することなく、アプリマーケティングキャンペーンのパフォーマンスを測定できます。
デフォルトでは、SKAdNetworkはマネージドモードで有効になっており、コンバージョン値はサーバーサイドからSingularによって直接管理されます。マネージドモードを使用する場合、SKAdNetworkを処理するためにアプリにコードを追加する必要はありません。
これにより、クライアント側のコードを変更することなく、Singularプラットフォームを通してコンバージョン値を設定・変更することができるため、最大限の柔軟性が得られます。
このサーバーサイドのマネージドモードは、SKAdNetworkのタイマーの処理にも役立ちます。SKAdNetworkでは、SKAdNetworkへの登録から24時間以内にコンバージョン値を更新することができます。コンバージョン値の更新を呼び出すと、タイマーはさらに24時間延長されます。そのため、コンバージョンイベントを選択する際は、その更新ウィンドウ内でイベントが発生するようにする必要があります。マネージドモードでは、アプリの新しいバージョンをリリースすることなく、いつでもコンバージョンイベントの設定を変更することができます。
マニュアルモードでSKAdNetworkを使用する(上級者向け)
アプリのコードを使用して自分でコンバージョン値を更新したい場合は、まずSingular ConfigでmanualSkanConversionManagementフラグを設定する必要があります。これにより、いくつかのSDKメソッドを使用して変換値を手動で取得、更新することができます。
手動モードを有効にするには
func getConfig() -> SingularConfig? {
// 単一構成オプション
guard let config = SingularConfig(apiKey: Constants.APIKEY,
andSecret: Constants.SECRET) else {
return nil
}
...
config.manualSkanConversionManagement = true
...
return config
}
- (SingularConfig *)getConfig {
// 単一構成オプション
SingularConfig* config = [[SingularConfig alloc] initWithApiKey:APIKEY
andSecret:SECRET];
...
config.manualSkanConversionManagement = YES;
...
return config;
}
変換値を更新する
マニュアルモードでは、変換値を更新するために、skanUpdateConversionValueメソッドを使う必要があります。アプリのライフサイクルの中で必要な場所で使用することができます。
注意:manualSkanConversionManagementを有効にしていない場合、skanUpdateConversionValueメソッドは機能しません。
skanUpdateConversionValue メソッド | |
---|---|
説明 | SKAdNetworkの変換値を手動で更新します。 |
シグネチャ | (BOOL)skanUpdateConversionValue:(NSInteger)conversionValue; |
使用例 |
|
他の SKAdNetwork メソッド:
現在の変換値を取得するには、skanGetConversionValueメソッドまたはconversionValueUpdatedCallbackを使用します。どちらもマネージドモードとマニュアルモードで動作します。
skanGetConversionValue メソッド | |
---|---|
説明 | Singular SDKによって追跡された現在のコンバージョン値を取得します。 |
シグネチャ | (NSNumber *)skanGetConversionValue; |
使用例 |
|
conversionValueUpdatedCallback コールバック | |
説明 | Singular SDK によって追跡された現在の変換値を取得します。 |
シグネチャ | void(^conversionValueUpdatedCallback)(NSInteger); |
使用例 |
|
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のコードサンプルにすでに含まれています。設定オブジェクトの作成
func getConfig() -> SingularConfig? {
guard let config = SingularConfig(apiKey: Constants.APIKEY,
andSecret: Constants.SECRET) else {
return nil
}
...
config.waitForTrackingAuthorizationWithTimeoutInterval = 300
...
return config
}
- (SingularConfig *)getConfig {
SingularConfig* config = [[SingularConfig alloc] initWithApiKey:APIKEY
andSecret:SECRET];
...
config.waitForTrackingAuthorizationWithTimeoutInterval = 300;
...
return config;
}
ヒント初期化遅延を設定すると、アプリの流れは次のようになります:
- アプリが開くと、Singular SDKはセッションとユーザーイベントの記録を開始しますが、Singularサーバーにはまだ送信しません。
- App Tracking Transparencyの同意が許可/拒否されるか、設定された時間が経過すると、SDKはセッションとキューに入ったイベントをSingularサーバーに送信します(IDFAの有無は問いません)。
- その後Singularは、IDFAが利用可能であればそれを利用してアトリビューションプロセスを開始します。
次の表は、この統合を使用したシナリオをまとめたものです:
シナリオ | 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には、ディープリンク先、パススルーパラメータ、リンクが延期されるかどうかが含まれます。
func handleDeeplink(params: SingularLinkParams?) {
// Singular Link からディープリンク データを取得する
let deeplink = params?.getDeepLink()
let passthrough = params?.getPassthrough()
let isDeferredDeeplink = params?.isDeferred()
let urlParams = params?.getURLParameters()
// ここにディープリンク処理コードを追加します
}
- (void)handleDeeplink:(SingularLinkParams*)params{
// Singular Link からディープリンク データを取得する
NSString* deeplink = [params getDeepLink];
NSString* passthrough = [params getPassthrough];
BOOL isDeferredDeeplink = [params isDeferred];
NSDictionary *urlParams = [params getURLParameters];
// ここにディープリンク処理コードを追加します
}
他のリンクオプション
Singular SDKはSingularによって提供されないユニバーサルリンクもサポートします。これはGoogle Adsや Facebookなどのディープリンクをサポートするパートナーのアトリビューションを測定するために必要です。
Singular iOS SDKバージョン12.0.3以上では、Singular以外のユニバーサルリンクがデフォルトでサポートされています。
旧バージョンのSDKでサードパーティのディープリンクをサポートするには:
- Singular iOS SDKの古いバージョンでは、Singular SDKが初期化されるたびに、すべての関連ドメイン(sng.linkを除く)をsupportedDomains設定オプション(Configオブジェクト内)に追加する必要があります。これにより、サードパーティのディープリンクの動作が可能になりますが、ディープリンクへのアトリビューションはできません。アトリビューションのためには、Singularトラッキングリンクを使用する必要があります。
- supportedDomainsの機能は、ユニバーサルリンクのためにアプリを設定し、現在ドメイン上で独自のAASAファイルをホストしていることを前提としています。
func getConfig() -> SingularConfig? {
// 単一構成オプション
guard let config = SingularConfig(apiKey: Constants.APIKEY,
andSecret: Constants.SECRET) else {
return nil
}
...
config.supportedDomains = ["subdomain.mywebsite.com","anothersubdomain.myotherwebsite.com"]
...
return config
}
- (SingularConfig *)getConfig {
// 単一構成オプション
SingularConfig* config = [[SingularConfig alloc] initWithApiKey:APIKEY
andSecret:SECRET];
...
config.supportedDomains = @[@"subdomain.mywebsite.com","anothersubdomain.myotherwebsite.com"];
...
return config;
}
Singular SDKはESP(Eメールサービスプロバイダ)によって提供されるユニバーサルリンクをサポートします。
ESPのドメインはHTTPS対応でなければなりません。AppleはiOSアプリがリダイレクトなしでHTTPS対応のエンドポイントからapple-app-site-associationファイルを取得することを要求しています。あなたのサイトのDNSでDNSコンフィギュレーションが必要な場合があるので、あなたのアプリのためにこのファイルをホストする方法をESPに確認してください。通常、ESPはHTTPSを有効にするために必要な手順を提供する。
ESP ドメインをサポートするには、Singular SDK が初期化されるたびに(config オブジェクト内の)espDomains設定オプションにカスタムトラッキングドメインを追加します。
func getConfig() -> SingularConfig? {
// 単一構成オプション
guard let config = SingularConfig(apiKey: Constants.APIKEY,
andSecret: Constants.SECRET) else {
return nil
}
...
config.espDomains = ["links.mywebsite.com"]
...
return config
}
- (SingularConfig *)getConfig {
// 単一構成オプション
SingularConfig* config = [[SingularConfig alloc] initWithApiKey:APIKEY
andSecret:SECRET];
...
config.espDomains = @[@"links.mywebsite.com"];
...
return config;
}
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。
初期化コード例
// 以下の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以外のディープリンクにリダイレクトする。
//...
}
// 以下の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("アプリシーン:不明")
}
}
}
// 以下の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];
// ここにカスタムコードを追加して、非Singular型ディープリンクにリダイレクトする
//...
}
// 以下の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; |
使用例 |
|
重要:この高度なエンタープライズ機能は例外的な場合にのみ利用可能です。実装する前にSingularのソリューションエンジニアにご相談ください。
Singularはサーバー間の統合により、追加のモバイルイベント追跡データを受け取ることができます。この機能を利用するには、ユーザーIDをSingularのモバイルデバイス追跡識別子にマッピングする必要があります。
注意:Singular SDKを初期化した後、またはユーザーIDを取得した後、できるだけ早くこのメソッドを呼び出してください。
setDeviceCustomUserId メソッド | |
---|---|
説明 | ログイン時と同じカスタムユーザーIDを設定し、Singularのトラッキング識別子にマッピングします。 |
シグネチャ | static void setDeviceCustomUserId(String customUserId) |
使用例 |
|
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; |
使用例 |
|
初期化後のグローバルプロパティの設定
アプリの実行中にいつでもグローバルプロパティを設定、解除、取得するには、以下のメソッドを使用します。
注意事項
- プロパティがまだ存在せず、他の5つのグローバルプロパティがすでに存在する場合、プロパティは追加されません。
- プロパティが既に設定されている場合、overrideExisting パラメータは、既存の値をオーバーライドするかどうかを決定します。
- このメソッドは、プロパティが正常に設定された場合は true を返し、そうでない場合は false を返します。
setGlobalProperty メソッド | |
---|---|
説明 | グローバル・プロパティを指定された値に設定します。 |
シグニチャ | (BOOL) setGlobalProperty:(NSString*)key andValue:(NSString*)value overrideExisting:(BOOL)overrideExisting |
使用例 |
|
getGlobalProperties メソッド | |
説明 | すべてのグローバルプロパティとそれらの現在の値を Map として取得します。 |
シグネチャ | NSDictionary*) getGlobalProperties |
使用例 |
|
unsetGlobalProperty メソッド | |
説明 | グローバルプロパティを削除します。 |
シグネチャ | (void) unsetGlobalProperty:(NSString*)key |
使用例 |
|
clearGlobalProperties メソッド | |
説明 | すべてのグローバルプロパティを削除します。 |
シグネチャ | (void) clearGlobalProperties |
使用例 |
|
2.9.セッションタイムアウトの変更 (オプション)
デフォルトでは、アプリがフォアグラウンドに戻る前に60秒以上バックグラウンドで実行された場合、SDKは新しいセッションを登録します。このタイムアウト値を変更するには、setSessionTimeoutメソッドを使用し、Configに追加します。
setSessionTimeoutメソッド | |
---|---|
説明 | セッションタイムアウト値を変更します。 |
シグネチャ | (void)setSessionTimeout:(int)timeout |
使用例 |
|
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 |
使用例 |
|
eventWithArgs メソッド | |
説明 | トラッキングのためにユーザーイベントを追加情報とともにSingularに送信します。 |
シグネチャ | (void)eventWithArgs:(NSString *)name, ... |
使用例 | 以下の例では、推奨される標準属性を持つコンテンツビューイベントを送信します。
|
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; |
使用例 |
|
代替の収益イベント報告
SingularはiapCompleteの使用を推奨していますが、あなたのアプリがApp Store IAPトラッキングを使用しない場合に備えて、Singularに収益イベントを報告するための2つの代替方法も提供しています。
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; |
使用例 |
|
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; |
使用例 |
|
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のドキュメントをご覧ください。
4.詳細オプション
4.1.ショートリファラーリンクの作成
注:この機能はSDKバージョン11.0.8+で利用可能です。
createReferrerShortLinkメソッドを使用して、ユーザーが友達とアプリを共有するための短縮共有リンクを生成します。リンクの作成時に、アプリのコードで参照元ユーザーの詳細を定義します。これにより、レポートでリファラーの属性を追跡できます。
短いリンクを作成するには
- このリンクは、以下のコードでベースリンクとして参照されます。
- リンクに動的に追加する任意のキャンペーンオーバーライドパラメータ(オプションのリストについては、トラッキングリンクパラメータを参照してください)。
- リンクを共有したユーザーをさかのぼって新規アプリのインストールを追跡するために、参照元ユーザーの名前とID。
以下の例のように、createReferrerShortLinkメソッドを使用してショートリンクを生成します。
createReferrerShortLink メソッド | |
---|---|
説明 | createReferrerShortLinkメソッドを使用して、ユーザーがアプリを友人と共有するための短縮共有リンクを生成します。 |
シグネチャ | (void)createReferrerShortLink:(NSString *)baseLink referrerName:(NSString *)referrerName referrerId:(NSString *)referrerId passthroughParams:(NSDictionary *)passthroughParams completionHandler:(void(^)(NSString *, NSError *))completionHandler; |
使用例 |
|
4.2.広告収入アトリビューションサポートの追加
SingularはGoogle AdMob、AppLovin、Unity LevelPlay (IronSource)、TradPlusなどのメディエーションプラットフォームと統合されており、広告収益のアトリビューションが可能です。また、Singularは一般的な広告収益SDKの統合により、他のメディエーションプラットフォームもサポートしています。
SingularSDKインテグレーションにコードスニペットを追加することで、メディエーションプラットフォームから広告収益アトリビューションデータを取得することができます。これにより、SKAdNetworkキャンペーンの広告収益データを取得することもできます。
メディエーション・プラットフォームからユーザーレベルの広告収入を得ることで、Singularはこのデータを受け入れることができるメディア・ソースに帰属広告収入を送り返し、AdROASキャンペーンを実施することができる。
SDKの実装に関する説明とコード・スニペットを参照してください。 [こちら].
4.3.アンインストールの追跡
注: アプリのアンインストールトラッキングを使用するには、アプリがプッシュ通知に対応している必要があります。APNS を実装するための Apple のガイドを参照してください。
アンインストール追跡を設定するには
- ガイド「iOS インストールトラッキングの設定」に従って、Singular でアプリを有効にします。
- アプリで、Apple Push Notification Service (APNS) から返されたデバイストークンを Singular に送信します。デバイストークンを Singular に渡すには、registerDeviceTokenForUninstallまたはregisterDeviceTokenメソッドを使用します。これはSingular SDKが初期化される前に行ってください。これは AppDelegate のdidRegisterForRemoteNotificationsWithDeviceTokenメソッドから呼び出す必要があります。
注意: 既存のプッシュ通知実装からすでにデバイストークンを取得している場合は、その値を使用できます。
APNSトークンは通常、ネイティブ形式のバイナリデータです。APNSから受け取ったトークンをそのまま渡します。アプリがトークンのデータ型を変更した場合は、16進文字列として渡してください。
registerDeviceTokenForUninstall メソッド | |
---|---|
説明 | APNS から返されたデバイス・トークンを渡します。 |
署名 | + (void)registerDeviceTokenForUninstall:(NSData*)deviceToken; |
使用例 |
|
4.4. Singular SDK JavaScript インターフェース
Singular は、アプリで Singular を呼び出すために使用できる JavaScript インターフェイスを提供します。
例えば、JavaScript インターフェースを設定すると、以下のように JavaScript コードから Singular にイベントを送信できます:
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に通知します。Limit Data Sharing(データ共有の制限)メソッドは、アプリがユーザーデータをサードパーティに送信するかどうかを制御するオプションを提供します。これは、ユーザーの好みやプライバシー要件に基づいてデータ共有を制限したい場合に便利です。 |
シグネチャ | (void)limitDataSharing:(BOOL)shouldLimitDataSharing; |
使用例 |
|
5.2 GDPR 準拠のための追加メソッド
Singular SDK は、GDPR ポリシーに準拠し、トラッキングに対するユーザーの同意または非同意について Singular に知らせるのに役立ついくつかのメソッドを提供します。
trackingOptIn メソッド | |
---|---|
説明 | トラッキングに対するユーザーの同意(オプトイン)をSingularに通知する。TrackingOptIn()メソッドは、「gdpr 」イベントをSingularサーバーに送信するために使用されます。このメソッドを呼び出さない場合、アプリはユーザーが同意したかのようにトラッキングを続けますが、特にGDPRオプトインとしてマークされることはありません。アプリがGDPR(一般データ保護規則)に準拠する必要がある場合は、ユーザーの同意が適切に記録されるように、この関数を呼び出す必要があります。 |
署名 | (void)trackingOptIn; |
使用例 |
|
stopAllTracking メソッド | |
説明 | このアプリでこのユーザーのすべてのトラッキング活動を停止します。 |
シグネチャ | (void)stopAllTracking; |
使用例 |
重要:このメソッドを呼び出すと、アプリの再起動の間であってもSDKが無効になります(状態は永続的です)。 これをオフにする唯一の方法は、resumeAllTrackingメソッドを呼び出すことです。
|
resumeAllTracking メソッド | |
説明 | このアプリでこのユーザーのトラッキング活動を再開します。 |
シグネチャ | (void)resumeAllTracking; |
使用例 |
|
isAllTrackingStopped メソッド | |
説明 | このアプリのこのユーザーのトラッキング活動のステータスをチェックします。 |
シグネチャ | (BOOL)isAllTrackingStopped; |
使用例 |
|
6.よくある質問と問題
テストアプリをビルドするときに問題やエラーが発生した場合は、このセクションを参照してください。
Xcode 15 では、ビルドで重要な役割を果たす"User Script Sandboxing" という新しいオプションがあります。その目的は、スクリプトがシステムに意図しない変更を加えるのを防ぎ、ビルドの安定性とセキュリティを強化することです。このオプションを有効にすると、ビルドシステムはユーザースクリプトを制限して、宣言されていない入出力依存関係を許可しないようにする。これはSingular SDKにとって問題となります。Singular SDKは依存関係を動的にリンクするためにスクリプトを実行する必要があるからです。
この問題を解決するには
- Build Settings > Build Options. に移動します。
- "User Script Sandboxing" を値"No"に調整する。
- ブリッジングヘッダーが作成されているか確認してください。
- ブリッジングヘッダーファイルがBuild Settings > Objective-C Bridging Header.にリンクされていることを確認する。
iOS Simulatorでは、Build Settings > Excluded Architectures でarm64を除外する必要がある場合があります。
Global Properties は現在 Testing Console には表示されません。 将来追加される予定です。この機能を確認するには、ログのエクスポートを使ってください。
このエラーは、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"