始める前にSDKの前提条件
統合中に問題が発生しましたか? 以下の FAQ を参照してください。
Singular SDKの統合の 手順に従ってください:計画と前提条件。
これらのステップはSingular SDKを統合するための前提条件です。
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(その他のリンカーフラグ)で、その他のリンカーフラグを以下の項目で更新します:
(inherited) -ObjC -l "sqlite3.0" -l "z" -framework "AdSupport" -framework "Security" -framework "Singular" -framework "StoreKit" -framework "SystemConfiguration" -framework "WebKit" -framework "iAd" - 以下の手順に従って、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 (mark as Optional since it's only available for devices with iOS 14.3 and higher).
- Singularフレームワークの埋め込みと署名
- General > Frameworks, Libraries, and Embedded Contentに移動します。
- Singular Frameworkを"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に進み、ファイルの相対パスを追加します:
SDKを統合する
重要:
- Swiftを使用するには、Bridging Headerが必要です(上記のガイドを参照)。
- Swift Package Manager を使用して Singular SDK を追加した場合、上記で説明したようにBuild Settings >Other Linker Flagsを更新したことを確認してください。
Singular ライブラリをインポートする
SceneDelegate、AppDelegate、またはSingular が使用される任意のファイルで、Singular SDK の使用を開始するために Singular クラスライブラリをインポートします。
// If installed with Cocoapods or Swift Package Manager
import Singular
// If installed manually in Objective-C (New Framework)
#import <Singular/Singular.h>
// If installed manually in Objective-C (Legacy)
#import "Singular.h"
設定オブジェクトの作成
コードで Singular の機能を初期化する前に、Singular 設定オブジェクトを作成し、全ての設定オプションを設定する必要があります。このコードブロックは SceneDelegate に追加します(SceneDelegate を使用していない場合は、AppDelegate に追加します)。
以下のコード例では、コンフィギュレーションオブジェクトを作成し、マネージドモードで SKAdNetwork を有効にし、ATT レスポンスを待つタイムアウトを設定するなど、いくつかの一般的なコンフィギュレーションオプションを設定しています。
以下のセクションでは、各オプションの詳細とカスタマイズ方法について説明します。
例一般的なオプションを持つ設定オブジェクトの作成
func getConfig() -> SingularConfig? {
// Create the config object with the SDK Key and SDK Secret
guard let config = SingularConfig(apiKey: 'APIKEY', andSecret: 'SECRET') else {
return nil
}
// If you are using App Tracking Transparency:
// Set a 300 sec delay before initialization to wait for
// the user's ATT response.
// (Remove this if you are not displaying an ATT prompt!)
config.waitForTrackingAuthorizationWithTimeoutInterval = 300
// Support custom ESP domains
config.espDomains = ["links.your-website-domain.com"]
// Set a handler method for deep links
config.singularLinksHandler = { params in
self.handleDeeplink(params: params)
}
return config
}
- (SingularConfig *)getConfig {
NSLog(@"-- Scene Delegate getConfig");
// Create the config object with the SDK Key and SDK Secret
SingularConfig* config = [[SingularConfig alloc] initWithApiKey:APIKEY
andSecret:SECRET];
// If you are using App Tracking Transparency:
// Set a 300 sec delay before initialization to wait for
// the user's ATT response.
// (Remove this if you are not displaying an ATT prompt!)
config.waitForTrackingAuthorizationWithTimeoutInterval = 300;
// Support custom ESP domains
config.espDomains = @[@"links.your-website-domain.com"];
// Set a handler method for deep links
config.singularLinksHandler = ^(SingularLinkParams * params) {[self handleDeeplink:params];};
return config;
}
Note: Singular iOS SDKバージョン12.0.6から、SKAdNetworkはデフォルトで有効になっています。
古いバージョンのSDKを使用している場合は、設定オブジェクトを作成する際に以下のコードを使用してSKAdNetworkを有効にする必要があります:
// Enable SKAdNetwork in Managed Mode
config.skAdNetworkEnabled = true
// Enable SKAdNetwork in Managed Mode
config.skAdNetworkEnabled = YES;
SKAdNetworkオプションのカスタマイズ
SKAdNetworkは、エンドユーザのプライバシーを損なうことなくモバイルインストールの帰属を決定するためのAppleのフレームワークです。SKAdNetwork を使用すると、ユーザーの個人情報を共有することなく、アプリマーケティングキャンペーンのパフォーマンスを測定できます。
デフォルトでは、SKAdNetworkはマネージドモードで有効になっており、コンバージョン値はサーバーサイドからSingularによって直接管理されます。マネージドモードを使用する場合、SKAdNetworkを処理するためにアプリにコードを追加する必要はありません。
これにより、クライアント側のコードを変更することなく、Singularプラットフォームを通してコンバージョン値を設定・変更することができるため、最大限の柔軟性が得られます。
このサーバーサイドのマネージドモードは、SKAdNetworkのタイマーの処理にも役立ちます。SKAdNetworkでは、SKAdNetworkへの登録から24時間以内にコンバージョン値を更新することができます。コンバージョン値の更新を呼び出すと、タイマーはさらに24時間延長されます。そのため、コンバージョンイベントを選択する際は、その更新ウィンドウ内でイベントが発生するようにする必要があります。マネージドモードでは、アプリの新しいバージョンをリリースすることなく、いつでもコンバージョンイベントの設定を変更することができます。
マニュアルモードでSKAdNetworkを使用する(上級者向け)
アプリのコードを使用して自分でコンバージョン値を更新したい場合は、まずSingular ConfigでmanualSkanConversionManagementフラグを設定する必要があります。これにより、いくつかのSDKメソッドを使用して変換値を手動で取得、更新することができます。
マニュアルモードを有効にするには
func getConfig() -> SingularConfig? {
// Singular Config Options
guard let config = SingularConfig(apiKey: Constants.APIKEY,
andSecret: Constants.SECRET) else {
return nil
}
//...
config.manualSkanConversionManagement = true
//...
return config
}
- (SingularConfig *)getConfig {
// Singular Config Options
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); |
使用例 |
|
ATT同意の処理(初期化遅延の設定)
ATT(App Tracking Transparency)プロンプトの表示
iOS 14.5から、アプリは、デバイスのIDFAを含むトラッキング目的に役立ついくつかのユーザーデータにアクセスして共有する前に、(App Tracking Transparencyフレームワークを使用して)ユーザーの同意を求める必要があります。
Singularは、デバイスを識別し、インストールアトリビューションを実行するために、IDFAを取得することで大きなメリットを得ています(ただし、IDFAを取得せずにアトリビューションを実行する方法もあります)。IDFAを取得するために、ユーザーの同意を求めることを強く推奨します。
初期化を遅らせてATTの応答を待つ
デフォルトでは、Singular SDKは初期化時にユーザーセッションを送信します。新しいデバイスからセッションが送信されると、Singularのアトリビューションプロセスが即座にトリガーされます。したがって、Singular SDKが最初のセッションを送信する前に、同意を求め、IDFAを取得することが 不可欠です。
ユーザーセッションの開始を遅らせるには、Singular SDKを初期化し、ConfigオブジェクトにwatefForTrackingAuthorizationWithTimeoutIntervalオプションを指定します。このオプションは、2.2.Configuration オブジェクトの作成」のコードサンプルに含まれています。
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は、これらのイベントやその後に追跡されるイベントには使用できません。 |
Singular SDKの初期化
ヒント:先に進む前に、以下のステップが完了していることを確認してください!
- Singularライブラリを追加
- swiftを使用している場合:Swift Bridging Headerを作成する。
- Singular Configオブジェクトを作成するコードを追加
- ディープリンクハンドラを追加
- SKAdNetworkを有効にした
- ATTを表示する場合: waitForTrackingAuthorizationWithTimeoutIntervalを追加した
- アプリのビルドをテストし、成功(この段階でアプリはエラーなくビルドされるはずです)
アプリを開くたびにSingular SDKを初期化する必要があります。これはSingularのすべてのアトリビューション機能の前提条件であり、またSingularに新しいユーザーセッションを送信します(セッションはユーザーのリテンションを計算するために使用されます)。SDKは設定オブジェクトの作成で作成した設定オブジェクトを使って初期化されます。
初期化コードはどこに追加しますか?
アプリのすべてのエントリーポイントで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。
初期化コード例
// INITIALIZE THE SDK IN THE FOLLOWING SCENEDELEGATE FUNCTIONS]
// willConnectTo session
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
let userActivity = connectionOptions.userActivities.first
// Print IDFV to Console for use in Singular SDK Console
print(Date(), "-- Scene Delegate IDFV:",
UIDevice().identifierForVendor!.uuidString as Any)
//Initialize the Singular SDK here:
if let config = self.getConfig() {
config.userActivity = userActivity
Singular.start(config)
}
}
// continue userActivity
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
// Starts a new Singular session on continueUserActivity
if let config = self.getConfig() {
config.userActivity = userActivity
Singular.start(config)
}
}
//openURLContexts URLContexts
func scene(_ scene: UIScene, openURLContexts URLContexts:
Set<UIOpenURLContext>) {
// Starts a new Singular session on cold start from deeplink scheme
if let config = self.getConfig() {
config.openUrl = openurlString
Singular.start(config)
}
// Add custom code here to Redirect to non-Singular deep links
//...
}
// INITIALIZE THE SDK IN THE FOLLOWING WINDOWGROUP FUNCTIONS
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL(perform: { url in
openURL = url
// Initialize Singular from an openURL
if let config = self.getConfig() {
config.openUrl = url
Singular.start(config)
}
})
}
.onChange(of: scenePhase) { oldValue, phase in
// The SwiftUI ScenePhases replaces the old SceneDelegate lifecycle events
switch phase {
case .background:
print("App Scene: backgrounded")
case .inactive:
print("App Scene: inactive")
case .active:
print("App Scene: active")
// Initialize Singular
if let config = self.getConfig() {
Singular.start(config)
}
@unknown default:
print("App Scene: unknown")
}
}
}
// INITIALIZE THE SDK IN THE FOLLOWING SCENEDELEGATE FUNCTIONS
// willConnectToSession
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session
options:(UISceneConnectionOptions *)connectionOptions {
NSUserActivity* userActivity = [[[connectionOptions userActivities] allObjects]
firstObject];
// Print identifier for Vendor (IDFV) to Xcode Console for use in Singular SDK Console
NSLog(@"-- Scene Delegate IDFV: %@", [[[UIDevice currentDevice] identifierForVendor] UUIDString]);
// Start a new Singular session from a backgrounded app
SingularConfig *config = [self getConfig];
config.userActivity = userActivity;
[Singular start:config];
}
// continueUserActivity
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity{
// Starts a new Singular session from a backgrounded App
SingularConfig *config = [self getConfig];
config.userActivity = userActivity;
[Singular start:config];
}
// openURLContexts
- (void)scene:(UIScene *)scene openURLContexts:(nonnull NSSet *)URLContexts {
// Starts a new Singular session on cold start from deeplink scheme
SingularConfig *config = [self getConfig];
config.openUrl = url;
[Singular start:config];
// Add custom code here to Redirect to Non-Singular deep links
//...
}
// INITIALIZE THE SDK IN THE FOLLOWING APPDELEGATE FUNCTIONS
// didFinishLaunchingWithOptions
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Starts new session when user opens the app if session timeout passed/opened using Singular Link
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 {
// Starts a new session when the user opens the app using a Singular Link while it was in the background
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{
// Starts new session when user opens the app using a non-Singular link, like a traditional app scheme.
SingularConfig *config = [self getConfig];
config.openUrl = url;
[Singular start:config];
// Add custom code here to Redirect to non-Singular deep links
//...
return YES;
}
- 重要:AppDelegateはiOS 12.4以前でのみSingularを初期化します。
- もし12.4以上のiOSバージョンをターゲットにしているなら、SceneDelegateアクティビティを使い始めるべきだ。
// INITIALIZE THE SDK IN THE FOLLOWING APPDELEGATE FUNCTIONS
// didFinishLaunchingWithOptions
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) - Bool {
// Print IDFV to Console for use in Singular SDK Console
print(Date(), "-- Scene Delegate IDFV:", UIDevice().identifierForVendor!.uuidString as Any)
//Initialize the Singular SDK here:
if let config = self.getConfig() {
config.launchOptions = launchOptions
Singular.start(config)
}
return true
}
// continue userActivity
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([any UIUserActivityRestoring]?) - Void) - Bool {
//Initialize the Singular SDK here:
if let config = self.getConfig() {
config.userActivity = userActivity
Singular.start(config)
}
return true
}
// open url
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) - Bool {
//Initialize the Singular SDK here:
if let config = self.getConfig() {
config.openUrl = url
Singular.start(config)
}
return true
}
注意事項
- configオブジェクトを作成する際、正しいオプション(userActivityかopenUrl)を渡すように注意してください。下記のサンプルコードを参照し、必要であればサンプルアプリを参照してください。
- GDPR、CCPA、COPPAなど、ビジネスを行う地域で制定されているさまざまなプライバシー法を遵守することを忘れないでください。詳細については、SDKのオプトインとオプトアウトの実践を参照し、データプライバシー法の遵守に役立つSingular SDK関数を確認してください。
- SDKを初期化するには、SingularSDKキーとSDKシークレットが必要です。これらはSingularプラットフォームの「開発者ツール > SDK統合 > SDKキー」で入手できます。
よくある質問と問題
テストアプリのビルド中に問題やエラーが発生した場合は、このセクションを参照してください。
Xcode 15 では、ビルドで重要な役割を果たす"User Script Sandboxing"という新しいオプションがあります。 目的は、スクリプトがシステムに意図しない変更を加えるのを防ぎ、ビルドの安定性とセキュリティを強化することです。この機能を有効にすると、ビルドシステムはユーザースクリプトを制限して、宣言されていない入出力依存関係を許可しないようにします。これはSingular SDKにとって問題となります。Singular SDKは依存関係を動的にリンクするためにスクリプトを実行する必要があるからです。
この問題を解決するには
- ビルド設定 > ビルドオプションに移動します。
- User Script Sandboxing "を"No "に調整してください。
- Bridging Headerが作成されているか確認してください。
- Build Settings > Objective-C Bridging HeaderでBridging Headerファイルがリンクされていることを確認します。
グローバルプロパティは現在、テストコンソールには表示されません。将来的に追加される予定です。この機能を確認するには、ログのエクスポートを利用してください。
なぜロギングエラーが発生するのでしょうか?
以下の一般的なロギングエラーは無視できます:
- ALTER TABLE sessions ADD COLUMN singular_link TEXT DEFAULT NULL" の [logging] カラム名が重複しています: singular_link "
- ALTER TABLE sessions ADD COLUMN payload TEXT DEFAULT NULL "の[logging]重複したカラム名:payload。
- ALTER TABLE events ADD COLUMN sequence INTEGER DEFAULT -1" の [logging] カラム名: sequence が重複しています。
- ALTER TABLE events ADD COLUMN payload TEXT DEFAULT NULL "の[logging]カラム名の重複:payload。