iOS SDK - 기본 통합


시작하기 전에 SDK 전제 조건

연동하는 동안 문제가 발생했나요? 아래 FAQ를 참조하세요.

Singular SDK 연동하기의 단계를 따르세요 :계획 및 사전 요구 사항의 단계를 따르세요.

이 단계는 모든 Singular SDK 연동을 위한 전제 조건입니다.


SDK 설치하기

CocoaPods, Swift 패키지 관리자 또는 스태틱 라이브러리를 사용하여 Singular SDK를 설치할 수 있습니다.

CocoaPods를사용하여 SDK 설치하기
  1. 최신 버전의 CocoaPods를다운로드하여 설치합니다.
  2. 포드파일을 생성하려면 터미널에서 프로젝트 루트 폴더로 이동하여 다음을 입력합니다:

    pod init
  3. Singular SDK 종속성을 추가하려면 프로젝트의 포드파일에 다음을 추가합니다:

    pod 'Singular-SDK'

    예를 들어

    pod_for_swiftcocoapods.png

  4. 터미널에서 프로젝트 루트 폴더로 이동하여 실행합니다:

    pod install
  5. 이 시점부터는 .xcodeproj 파일 대신 Xcode 워크스페이스 파일 .xcworkspace를 열어 프로젝트를 엽니다.
  6. 아래 지침에 따라 Swift 브리징 헤더를 생성합니다.
Swift 패키지 관리자를사용하여 SDK 설치하기
  1. Xcode에서 파일 > 패키지 추가로 이동하여 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. 패키지 추가 버튼을 클릭합니다.
  4. 빌드 단계 > 라이브러리와 바이너리 연결로 이동하여 AdServices.framework 라이브러리를 추가합니다. iOS 14.3 이상의 기기에서만 사용할 수 있으므로 선택 사항으로 표시해야 합니다.

    link_binary_adservices.png

  5. 빌드 설정 > 연동 > 기타 링커 플래그로 이동하여 다음 항목으로 기타 링커 플래그를 업데이트합니다:

    (상속됨) -ObjC -l"sqlite3.0" -l"z" -프레임워크 "AdSupport" -프레임워크 "Security" -프레임워크 "Singular" -프레임워크 "StoreKit" -프레임워크 "SystemConfiguration" -프레임워크 "WebKit" -프레임워크 "iAd"

    frameworks.png

    other_linker_flags.png

  6. 아래 지침에 따라 Swift 브리징 헤더를 생성합니다.
Singular SDK 프레임워크 (정적 라이브러리) 설치하기

Singular 프레임워크 다운로드 및 설치는 위의 코코아팟 또는 SPM 방법을 사용하지 않는 경우에만 필요합니다.

Singular SDK 12.3.2 이하에서 업그레이드하시나요?

아래 단계에 따라 이전 스태틱 라이브러리를 제거하세요.

  1. 프로젝트 파일로 이동하여 Singular 스태틱 라이브러리를 제거합니다. 일반적으로 Singular-iOS-sdk-v12.3.2와 같은 이름의 폴더가 있을 것입니다. 폴더를 마우스 오른쪽 버튼으로 클릭하고 프로젝트에서 삭제합니다.
  2. 다음 섹션으로 진행하여 새 프레임워크를 설치합니다.

처음으로 Singular 프레임워크 추가하기

  1. SDK 프레임워크를 다운로드하여 압축을 풉니다.

    구현에 적합한 프레임워크를 선택합니다:

  2. 압축을 푼 폴더를 Xcode 프로젝트의 폴더에 추가합니다:

    Xcode에서 앱 이름 > [프로젝트 이름]에 파일 추가를 마우스 오른쪽 버튼으로 클릭합니다. 대화 상자가 열리면 옵션 > 그룹 생성을 선택하고 SDK의 압축을 푼 폴더를 추가합니다.





    이제 Singular 프레임워크가 프로젝트에 있어야 합니다.

  3. 필요한 라이브러리를 추가합니다:

    • Xcode에서 빌드 단계 > 라이브러리와 바이너리 링크를 선택합니다.
    • 클릭하고 다음 라이브러리를 추가합니다:

      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 프레임워크 임베드 및 서명
    • 일반 > 프레임워크, 라이브러리 및 임베디드 콘텐츠로이동합니다.
    • Singular 프레임워크를"임베드 및 서명"으로 조정합니다.

Swift 브리징 헤더추가하기

코코아팟 또는 Swift 패키지 관리자를 사용하여 SDK를 설치한 경우, Singular SDK의 Obj-C 라이브러리를 사용하려면 Swift용 브리징 헤더를 생성해야 합니다.

  1. 프로젝트에서 Header 유형의 새 파일을 생성하고 이름을 YourProjectName-Bridging-Header로 지정합니다.

    new_header_file.png

  2. 파일을 열고 다음을 추가합니다:

    #import <Singular/Singular.h>

    예를 들어

    swift_cocoapods_import_singular.png

  3. 빌드 설정 > Objective-C 브리징 헤더로 이동하여 파일의 상대 경로를 추가합니다:

    objective_c_bridging_header.png


SDK 연동

중요:

  • Swift를 사용하려면 브리징 헤더가 있어야 합니다(위 가이드 참조).
  • Swift 패키지 관리자를 사용하여 Singular SDK를 추가한 경우 위에서 설명한 대로 빌드 설정 > 기타 링커 플래그를 업데이트했는지 확인하세요.

Singular 라이브러리 임포트하기

SceneDelegate, AppDelegate 또는 Singular가 사용될 파일에서 Singular 클래스 라이브러리를 임포트하여 Singular SDK 사용을 시작하세요.

// 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
      }

참고: 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에 등록한 시점부터 24시간 이내에 전환 값을 업데이트할 수 있습니다. 전환 값을 업데이트하기 위해 호출하면 타이머가 24시간 더 연장됩니다. 따라서 전환 이벤트를 선택할 때 해당 업데이트 기간 내에 이벤트가 발생하는지 확인해야 합니다. 관리 모드에서는 앱의 새 버전을 릴리스하지 않고도 언제든지 전환 이벤트 구성을 변경할 수 있습니다.

수동 모드에서 SKAdNetwork 사용(고급)

수동 모드에서 SKAdNetwork를 사용하는 방법을 알아보세요.

앱 코드를 사용하여 직접 전환 값을 업데이트하려면, 먼저 Singular 컨피그에서 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 메서드를 사용해야 합니다. 앱의 라이프사이클에서 필요할 때마다 사용할 수 있습니다.

참고: 수동스캔컨버젼관리를 활성화하지 않은 경우 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()
전환 값 업데이트 콜백 콜백
설명 Singular SDK가 추적한 현재 전환 값을 가져옵니다.
시그니처 void(^전환값업데이트콜백)(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(앱 추적 투명성) 프롬프트 표시하기

iOS 14.5부터 앱은 추적 목적에 도움이 되는 일부 사용자 데이터에 액세스하고 공유하기 전에 ( 앱 추적 투명성 프레임워크를 사용하여) 사용자 동의를 요청해야 합니다(디바이스의 IDFA 포함).

Singular는 IDFA를 통해 디바이스를 식별하고 인스톨 어트리뷰션을 수행함으로써 큰 이점을 얻을 수 있습니다( IDFA 없이 어트리뷰션을 수행하는 방법도 있지만). IDFA를 얻기 위해 사용자의 동의를 구할 것을 강력히 권장합니다.

ATT 응답을 기다리기 위해 초기화 지연하기

기본적으로 Singular SDK는 사용자 세션이 초기화될 때 이를 전송합니다. 새 디바이스에서 세션이 전송되면 즉시 Singular의 어트리뷰션 프로세스가 트리거되며, 이 프로세스는 해당 시점에 Singular에서 사용할 수 있는 데이터만을 기반으로 수행됩니다. 따라서 Singular SDK가 첫 번째 세션을 전송하기 전에 동의를 요청하고 IDFA를 검색하는 것이 필수적입니다.

사용자 세션의 실행을 지연시키려면 구성 객체에서 waitForTrackingAuthorizationWithTimeoutInterval 옵션을 사용하여 Singular SDK를 초기화하세요. 이 옵션은 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. 앱 추적 투명성 동의가 승인/거부되거나 설정된 시간이 경과하면, SDK는 세션과 대기열에 있는 모든 이벤트를 (IDFA를 사용하거나 사용하지 않고) Singular 서버로 보냅니다.
  3. 그러면 Singular는 사용 가능한 경우 IDFA를 활용하여 어트리뷰션 프로세스를 시작합니다.
가능한 모든 ATT 시나리오에 대해 알아보기

다음 표에는 이 연동을 사용하여 가능한 시나리오가 요약되어 있습니다:

시나리오 IDFA 사용 가능 여부
사용자가 동의 대화 상자를 보고 설정된 시간이 경과하기 전에 동의를 합니다. IDFA를 사용할 수 있음
사용자가 동의 대화 상자를 보고 설정된 시간이 경과하기 전에 동의를 거부합니다. IDFA를 사용할 수 없음
설정된 시간이 만료된 후 사용자에게 동의 대화 상자가 표시되고 동의를 허용합니다. 동의를 받은 후에 보고된 사용자 이벤트에 대해서만 IDFA를 사용할 수 있습니다.
설정된 시간이 만료되면 사용자에게 동의 대화 상자가 표시되고 동의를 거부합니다. IDFA를 사용할 수 없는 경우
사용자에게 동의 대화 상자가 표시되고 아무런 조치 없이 앱을 종료한 다음 설정된 시간이 만료된 후 앱을 열고 동의를 부여합니다. 대기 중인 모든 이벤트는 앱이 다시 열릴 때 Singular 서버로 전송됩니다. 이러한 이벤트에는 IDFA를 사용할 수 없습니다. 동의가 부여된 후 추적된 모든 이벤트에는 IDFA가 연결됩니다.
사용자에게 동의 대화 상자가 표시되고 아무 조치 없이 앱을 종료한 후 나중에 앱을 열고 동의를 거부합니다. 대기 중인 모든 이벤트는 앱이 다시 열리면 Singular 서버로 전송됩니다. 이러한 이벤트 또는 이후 추적된 이벤트에 대해서는 IDFA를 사용할 수 없습니다.

Singular SDK 초기화하기

팁: 계속 진행하기 전에 아래 단계를 완료했는지 확인하세요!

  • Singular 라이브러리 추가
  • 스위프트를 사용하는 경우: 스위프트 브리징 헤더 생성
  • Singular 구성 객체를 생성하는 코드 추가
  • 딥링크 핸들러 추가
  • 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 세션, 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)
중요:
  • 앱디렉티브는 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
}

참고:

  • 구성 개체를 만들 때 올바른 옵션(userActivity 또는 openUrl)을 전달하도록 주의하세요. 아래 샘플 코드를 참조하고 필요한 경우 샘플 앱을 참조하세요.
  • 비즈니스를 운영하는 지역에서 제정된 GDPR, CCPA, COPPA 등 다양한 개인정보 보호법을 준수해야 한다는 점을 잊지 마세요. 자세한 내용은 SDK 옵트인 및 옵트아웃 사례를 참조하고 데이터 개인정보 보호법을 준수하는 데 도움이 되는 Singular SDK 기능을 검토하세요.
  • SDK를 초기화하려면 Singular SDK 키와 SDK 시크릿이 필요합니다. Singular 플랫폼의"개발자 도구 > SDK 연동 > SDK 키"에서 얻을 수 있습니다.

자주 묻는 질문 및 문제

테스트 앱을 빌드할 때 문제나 오류가 발생하면 이 섹션을 참조하세요.

"샌드박스: rsync.samba(15813) 거부(1) 파일 읽기 데이터..." 오류가 발생하는 이유는 무엇인가요?

Xcode 15에는 빌드에서 중요한 역할을 하는 "사용자 Script 샌드박싱 "이라는 새로운 옵션이 있습니다. Script가 시스템을 의도하지 않게 변경하는 것을 방지하여 빌드의 안정성과 보안을 강화하는 것이 목적입니다. 이 기능을 활성화하면 빌드 시스템에서 사용자 Script가 선언되지 않은 입력/출력 종속성을 허용하지 않도록 제한합니다. 이는 종속성을 동적으로 연결하기 위해 Script를 실행해야 하는 Singular SDK에 문제가 됩니다.

문제를 해결하려면 다음과 같이 하세요:

  1. 빌드 설정 > 빌드 옵션으로이동합니다.
  2. "사용자 Script 샌드박싱""아니요" 값으로 조정합니다.
"Singular라는 이름의 모듈이 없습니다" 오류가 발생하는 이유는 무엇인가요?
  1. 브리징 헤더가 생성되었는지 확인합니다.
  2. 빌드 설정 > Objective-C 브리징 헤더에서 브리징 헤더 파일이 링크되었는지 확인합니다.
"Arm64" 빌드 오류가 발생하는 이유는 무엇인가요?

경우에 따라 iOS 시뮬레이터는 빌드 설정 > 제외된 아키텍처에서 arm64를 제외해야 합니다.

excluded_architectures_arm64.png

글로벌 프로퍼티를 구현했습니다. 왜 테스트 콘솔에 표시되지 않나요?

글로벌 프로퍼티는 현재 테스트 콘솔에 표시되지 않습니다. 향후 추가될 예정입니다. 이 기능을 확인하려면 로그 내보내기를 사용하세요.

로깅 오류가 발생하는 이유는 무엇인가요?

다음과 같은 일반적인 로깅 오류는 무시할 수 있습니다:

  • [logging] 중복 열 이름: "ALTER TABLE sessions ADD COLUMN singular_link TEXT DEFAULT NULL"의 singular_link
  • [logging] 중복 열 이름: "ALTER TABLE 세션을 ADD COLUMN payload TEXT DEFAULT NULL"에 페이로드가 있습니다.
  • [logging] 중복 열 이름: "ALTER TABLE events ADD COLUMN sequence INTEGER DEFAULT -1"의 시퀀스
  • [로깅] 중복 컬럼 이름: "ALTER TABLE events ADD COLUMN payload TEXT DEFAULT NULL"의 페이로드