iOS SDK - 基本的な統合


始める前にSDKの前提条件

統合中に問題が発生しましたか? 以下の FAQ を参照してください。

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

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


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(その他のリンカーフラグ)で、その他のリンカーフラグを以下の項目で更新します:

    (inherited) -ObjC -l "sqlite3.0" -l "z" -framework "AdSupport" -framework "Security" -framework "Singular" -framework "StoreKit" -framework "SystemConfiguration" -framework "WebKit" -framework "iAd"

    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 (mark as Optional since it's only
          available for devices with iOS 14.3 and higher).
  4. Singularフレームワークの埋め込みと署名
    • General > Frameworks, Libraries, and Embedded Contentに移動します。
    • Singular Frameworkを"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


SDKを統合する

重要:

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

Singular ライブラリをインポートする

SceneDelegateAppDelegate、または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 レスポンスを待つタイムアウトを設定するなど、いくつかの一般的なコンフィギュレーションオプションを設定しています。

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

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

SwiftObjective-C
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
      }

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

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

SwiftObjective-C
// Enable SKAdNetwork in Managed Mode


config.skAdNetworkEnabled = true

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

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

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

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

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

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

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

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

マニュアルモードを有効にするには

SwiftObjective-C
func getConfig() -> SingularConfig? {
     
     // Singular Config Options


     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
// Sending a Standard Event for Login


Singular.event(EVENT_SNG_LOGIN)
      
// Manually updating the conversion value to 7 after the Event


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? {
     // Singular Config Options


     guard let config = SingularConfig(apiKey: Constants.APIKEY,
       andSecret: Constants.SECRET) else {         
         return nil
         }     
     //...
     config.conversionValueUpdatedCallback = { conversionValue in
     // Here you have access to the latest conversion value


     }
     //...
     return config
}

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 オブジェクトの作成」のコードサンプルに含まれています。

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は、これらのイベントやその後に追跡されるイベントには使用できません。

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。

初期化コード例

iOS 13+の場合(Swift SceneDelegate)
// 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


    //...
}
iOS 13+ 用 (SwiftUI インターフェース)
// 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")
        }
    }
}
iOS 13+ 用 (Objective-C SceneDelegate)
// 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


  //...
}
古いiOSバージョン用 (Objective-C AppDelegate)
// 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;
}
古いiOSバージョン向け (Swift AppDelegate)
重要:
  • 重要: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キー」で入手できます。

よくある質問と問題

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

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

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

この問題を解決するには

  1. ビルド設定 > ビルドオプションに移動します。
  2. User Script Sandboxing ""No "に調整してください。
Singularという名前のモジュールがありません
  1. Bridging Headerが作成されているか確認してください。
  2. Build Settings > Objective-C Bridging HeaderでBridging Headerファイルがリンクされていることを確認します
Arm64"ビルドエラーが発生するのはなぜですか?

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

excluded_architectures_arm64.png

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

グローバルプロパティは現在、テストコンソールには表示されません。将来的に追加される予定です。この機能を確認するには、ログのエクスポートを利用してください。

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

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

  • 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。