시작하기 전에 SDK 전제 조건
연동하는 동안 문제가 발생했나요? 아래 FAQ를 참조하세요.
Singular SDK 연동하기의 단계를 따르세요 :계획 및 사전 요구 사항의 단계를 따르세요.
이 단계는 모든 Singular SDK 연동을 위한 전제 조건입니다.
SDK 설치하기
CocoaPods, Swift 패키지 관리자 또는 스태틱 라이브러리를 사용하여 Singular SDK를 설치할 수 있습니다.
- 최신 버전의 CocoaPods를다운로드하여 설치합니다.
-
포드파일을 생성하려면 터미널에서 프로젝트 루트 폴더로 이동하여 다음을 입력합니다:
pod init
-
Singular SDK 종속성을 추가하려면 프로젝트의 포드파일에 다음을 추가합니다:
pod 'Singular-SDK'
예를 들어
-
터미널에서 프로젝트 루트 폴더로 이동하여 실행합니다:
pod install
- 이 시점부터는 .xcodeproj 파일 대신 Xcode 워크스페이스 파일 .xcworkspace를 열어 프로젝트를 엽니다.
- 아래 지침에 따라 Swift 브리징 헤더를 생성합니다.
-
Xcode에서 파일 > 패키지 추가로 이동하여 Singular SDK GitHub 리포지토리로 들어갑니다:
https://github.com/singular-labs/Singular-iOS-SDK
-
Singular SDK 버전을 업데이트합니다:
- 패키지 추가 버튼을 클릭합니다.
-
빌드 단계 > 라이브러리와 바이너리 연결로 이동하여 AdServices.framework 라이브러리를 추가합니다. iOS 14.3 이상의 기기에서만 사용할 수 있으므로 선택 사항으로 표시해야 합니다.
-
빌드 설정 > 연동 > 기타 링커 플래그로 이동하여 다음 항목으로 기타 링커 플래그를 업데이트합니다:
(상속됨) -ObjC -l"sqlite3.0" -l"z" -프레임워크 "AdSupport" -프레임워크 "Security" -프레임워크 "Singular" -프레임워크 "StoreKit" -프레임워크 "SystemConfiguration" -프레임워크 "WebKit" -프레임워크 "iAd" - 아래 지침에 따라 Swift 브리징 헤더를 생성합니다.
Singular 프레임워크 다운로드 및 설치는 위의 코코아팟 또는 SPM 방법을 사용하지 않는 경우에만 필요합니다.
Singular SDK 12.3.2 이하에서 업그레이드하시나요?
아래 단계에 따라 이전 스태틱 라이브러리를 제거하세요.
- 프로젝트 파일로 이동하여 Singular 스태틱 라이브러리를 제거합니다. 일반적으로 Singular-iOS-sdk-v12.3.2와 같은 이름의 폴더가 있을 것입니다. 폴더를 마우스 오른쪽 버튼으로 클릭하고 프로젝트에서 삭제합니다.
- 다음 섹션으로 진행하여 새 프레임워크를 설치합니다.
처음으로 Singular 프레임워크 추가하기
-
SDK 프레임워크를 다운로드하여 압축을 풉니다.
구현에 적합한 프레임워크를 선택합니다:
- Xcode 12 이상의 경우 .xcframework [여기에서 다운로드]사용
- Xcode 11 이하의 경우 .framework [여기에서 다운로드]사용
-
압축을 푼 폴더를 Xcode 프로젝트의 폴더에 추가합니다:
Xcode에서 앱 이름 > [프로젝트 이름]에 파일 추가를 마우스 오른쪽 버튼으로 클릭합니다. 대화 상자가 열리면 옵션 > 그룹 생성을 선택하고 SDK의 압축을 푼 폴더를 추가합니다.
이제 Singular 프레임워크가 프로젝트에 있어야 합니다. -
필요한 라이브러리를 추가합니다:
- 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).
- Singular 프레임워크 임베드 및 서명
- 일반 > 프레임워크, 라이브러리 및 임베디드 콘텐츠로이동합니다.
- Singular 프레임워크를"임베드 및 서명"으로 조정합니다.
코코아팟 또는 Swift 패키지 관리자를 사용하여 SDK를 설치한 경우, Singular SDK의 Obj-C 라이브러리를 사용하려면 Swift용 브리징 헤더를 생성해야 합니다.
-
프로젝트에서 Header 유형의 새 파일을 생성하고 이름을 YourProjectName-Bridging-Header로 지정합니다.
-
파일을 열고 다음을 추가합니다:
#import <Singular/Singular.h>
예를 들어
-
빌드 설정 > Objective-C 브리징 헤더로 이동하여 파일의 상대 경로를 추가합니다:
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 응답 대기 시간 설정과 같은 몇 가지 일반적인 구성 옵션을 설정합니다.
다음 섹션에서는 이러한 각 옵션과 사용자 지정 방법에 대해 자세히 설명합니다.
예시: 몇 가지 일반적인 옵션으로 구성 개체 만들기
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;
}
참고: 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에 등록한 시점부터 24시간 이내에 전환 값을 업데이트할 수 있습니다. 전환 값을 업데이트하기 위해 호출하면 타이머가 24시간 더 연장됩니다. 따라서 전환 이벤트를 선택할 때 해당 업데이트 기간 내에 이벤트가 발생하는지 확인해야 합니다. 관리 모드에서는 앱의 새 버전을 릴리스하지 않고도 언제든지 전환 이벤트 구성을 변경할 수 있습니다.
수동 모드에서 SKAdNetwork 사용(고급)
앱 코드를 사용하여 직접 전환 값을 업데이트하려면, 먼저 Singular 컨피그에서 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 메서드를 사용해야 합니다. 앱의 라이프사이클에서 필요할 때마다 사용할 수 있습니다.
참고: 수동스캔컨버젼관리를 활성화하지 않은 경우 skanUpdateConversionValue 메서드는 작동하지 않습니다.
skanUpdateConversionValue 메서드 | |
---|---|
설명 | SKAdNetwork 전환 값을 수동으로 업데이트합니다. |
시그니처 | (BOOL)skanUpdateConversionValue:(NSInteger)conversionValue; |
사용 예시 |
|
기타 SKAdNetwork 메서드:
현재 전환 값을 가져오려면, skanGetConversionValue 메서드 또는 conversionValueUpdatedCallback을 사용합니다. 둘 다 관리 및 수동 모드에서 작동합니다.
skanGetConversionValue 메서드 | |
---|---|
설명 | Singular SDK가 추적한 현재 전환 값을 가져옵니다. |
서명 | (NSNumber *)skanGetConversionValue; |
사용 예시 |
|
전환 값 업데이트 콜백 콜백 | |
설명 | Singular SDK가 추적한 현재 전환 값을 가져옵니다. |
시그니처 | void(^전환값업데이트콜백)(NSInteger); |
사용 예시 |
|
ATT 동의 처리(초기화 지연 설정)
ATT(앱 추적 투명성) 프롬프트 표시하기
iOS 14.5부터 앱은 추적 목적에 도움이 되는 일부 사용자 데이터에 액세스하고 공유하기 전에 ( 앱 추적 투명성 프레임워크를 사용하여) 사용자 동의를 요청해야 합니다(디바이스의 IDFA 포함).
Singular는 IDFA를 통해 디바이스를 식별하고 인스톨 어트리뷰션을 수행함으로써 큰 이점을 얻을 수 있습니다( IDFA 없이 어트리뷰션을 수행하는 방법도 있지만). IDFA를 얻기 위해 사용자의 동의를 구할 것을 강력히 권장합니다.
ATT 응답을 기다리기 위해 초기화 지연하기
기본적으로 Singular SDK는 사용자 세션이 초기화될 때 이를 전송합니다. 새 디바이스에서 세션이 전송되면 즉시 Singular의 어트리뷰션 프로세스가 트리거되며, 이 프로세스는 해당 시점에 Singular에서 사용할 수 있는 데이터만을 기반으로 수행됩니다. 따라서 Singular SDK가 첫 번째 세션을 전송하기 전에 동의를 요청하고 IDFA를 검색하는 것이 필수적입니다.
사용자 세션의 실행을 지연시키려면 구성 객체에서 waitForTrackingAuthorizationWithTimeoutInterval 옵션을 사용하여 Singular SDK를 초기화하세요. 이 옵션은 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 서버로 전송하지는 않습니다.
- 앱 추적 투명성 동의가 승인/거부되거나 설정된 시간이 경과하면, SDK는 세션과 대기열에 있는 모든 이벤트를 (IDFA를 사용하거나 사용하지 않고) Singular 서버로 보냅니다.
- 그러면 Singular는 사용 가능한 경우 IDFA를 활용하여 어트리뷰션 프로세스를 시작합니다.
다음 표에는 이 연동을 사용하여 가능한 시나리오가 요약되어 있습니다:
시나리오 | 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.
초기화 코드 예시
// 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;
}
- 앱디렉티브는 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 키"에서 얻을 수 있습니다.
자주 묻는 질문 및 문제
테스트 앱을 빌드할 때 문제나 오류가 발생하면 이 섹션을 참조하세요.
Xcode 15에는 빌드에서 중요한 역할을 하는 "사용자 Script 샌드박싱 "이라는 새로운 옵션이 있습니다. Script가 시스템을 의도하지 않게 변경하는 것을 방지하여 빌드의 안정성과 보안을 강화하는 것이 목적입니다. 이 기능을 활성화하면 빌드 시스템에서 사용자 Script가 선언되지 않은 입력/출력 종속성을 허용하지 않도록 제한합니다. 이는 종속성을 동적으로 연결하기 위해 Script를 실행해야 하는 Singular SDK에 문제가 됩니다.
문제를 해결하려면 다음과 같이 하세요:
- 빌드 설정 > 빌드 옵션으로이동합니다.
- "사용자 Script 샌드박싱" 을 "아니요" 값으로 조정합니다.
- 브리징 헤더가 생성되었는지 확인합니다.
- 빌드 설정 > Objective-C 브리징 헤더에서 브리징 헤더 파일이 링크되었는지 확인합니다.
로깅 오류가 발생하는 이유는 무엇인가요?
다음과 같은 일반적인 로깅 오류는 무시할 수 있습니다:
- [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"의 페이로드