콘텐츠로 이동

iOS/tvOS/macOS 앱 통합


iOS, tvOS, macOS 앱의 메트릭 데이터를 수집하여 Apple 플랫폼 애플리케이션의 성능을 시각적으로 분석합니다.

읽기 경로

전제 조건

참고

RUM Headless 서비스를 이미 활성화한 경우, 전제 조건이 자동으로 구성되므로 앱을 바로 통합할 수 있습니다.

macOS Alpha 안내

SDK 1.6.6 이상 버전에서 GuanceSDK 메인 SDK는 iOS, tvOS, macOS를 지원합니다. macOS는 현재 Alpha 버전이며, 모든 iOS 기능이 지원된다고 보장하지 않습니다. macOS를 통합하기 전에 먼저 테스트 환경에서 초기화, RUM, Log, Trace, 데이터 동기화 등 핵심 링크를 검증하세요. Session Replay 및 Widget Extension은 macOS를 지원하지 않습니다.

앱 통합

  1. 실제 사용자 모니터링(RUM) > 앱 생성으로 이동하여 iOS, tvOS 또는 macOS 앱 유형을 선택합니다.
  2. 앱 이름을 입력합니다.
  3. 앱 ID를 입력합니다.
  4. 앱 통합 방식을 선택합니다:

    • 공용 네트워크 DataWay: DataKit 수집기를 설치하지 않고 RUM 데이터를 직접 수신합니다.
    • 로컬 환경 배포: 전제 조건을 충족한 후 RUM 데이터를 수신합니다.

설치

tvOS

소스 코드 주소: https://github.com/GuanceCloud/datakit-ios

데모: https://github.com/GuanceDemo/guance-app-demo

CocoaPods 유지 보수 안내

CocoaPods 공식 공지에 따라 CocoaPods는 2026년 12월 2일 이후에 trunk를 읽기 전용으로 전환하고 새로운 Podspec을 수신하지 않을 계획입니다. 이미 게시된 Pod 버전과 기존 빌드는 즉시 무효화되지 않지만, 이후 CocoaPods를 통해 새 버전, 호환성 수정 및 보안 업데이트를 받는 데 제한이 있을 수 있습니다. 따라서 새로 통합하거나 SDK를 업그레이드할 때는 Swift Package Manager 방식을 우선 사용하는 것이 좋습니다.

Xcode UI 사용

  1. Xcode에서 File -> Add Package Dependency...를 선택합니다.

  2. 표시된 페이지의 검색창에 https://github.com/GuanceCloud/datakit-ios.git를 입력합니다.

  3. Xcode가 패키지를 확인한 후, 종속성 버전 규칙을 선택합니다. Up to Next Major Version을 선택하는 것이 좋습니다.

    추가할 프로젝트를 선택한 후 Add Package를 클릭하고 로딩이 완료될 때까지 기다립니다.

  4. 패키지 확인이 완료되면 Package Products 목록에서 각 Target에 추가할 제품을 선택하고 Add Package를 클릭합니다.

    GuanceSDK: 메인 프로젝트 Target에 추가하며, iOS, tvOS, macOS를 지원합니다. macOS는 Alpha 버전입니다.

    GuanceWidgetExtension: iOS Widget Extension Target에만 추가합니다.

Package.swift 사용

프로젝트 자체가 Swift Package인 경우, SDK를 종속성으로 추가하려면 Package.swiftdependencies를 추가합니다.

// 메인 프로젝트
dependencies: [
.package(url: "https://github.com/GuanceCloud/datakit-ios.git",
.upToNextMajor(from: "[latest_version]"))
]

Targets에 종속성을 추가합니다:

targets: [
    .target(
        name: "YourTarget",
        dependencies: [
            .product(name: "GuanceSDK", package: "GuanceSDK"),
        ]),
    .target(
        name: "YourWidgetExtensionTarget",
        dependencies: [
            .product(name: "GuanceWidgetExtension", package: "GuanceSDK"),
        ]),
    ]

참고: 1.4.0-beta.1 이상에서 Swift Package Manager를 지원합니다. SDK 1.6.6 이상 버전에서 SPM 제품명은 GuanceSDK, GuanceWidgetExtension, GuanceSessionReplay로 조정되었습니다. 이전 제품명 마이그레이션은 마이그레이션 가이드를 참조하세요.

  1. Cartfile 파일을 구성합니다.

    github "GuanceCloud/datakit-ios" == [latest_version]
    
  2. 종속성을 업데이트합니다.

    대상 플랫폼(iOS, tvOS 또는 macOS)에 따라 해당하는 carthage update 명령을 실행하고, XCFrameworks를 생성하기 위해 --use-xcframeworks 파라미터를 추가합니다:

    • iOS 플랫폼의 경우:

      carthage update --platform iOS --use-xcframeworks
      
    • tvOS 플랫폼의 경우:

      carthage update --platform tvOS --use-xcframeworks
      
    • macOS 플랫폼의 경우:

      carthage update --platform macOS --use-xcframeworks
      

    생성된 xcframework는 일반 Framework와 동일한 방식으로 사용합니다. 컴파일된 라이브러리를 프로젝트에 추가합니다.

    GuanceSDK: 메인 프로젝트 Target에 추가하며, iOS, tvOS, macOS를 지원합니다. macOS는 Alpha 버전입니다.

    GuanceWidgetExtension: iOS Widget Extension Target에만 추가합니다.

  3. TARGETS -> Build Setting -> Other Linker Flags-ObjC를 추가합니다.

  4. Carthage를 사용한 통합, SDK 버전 지원:

    GuanceSDK: >=1.6.6

    GuanceWidgetExtension: >=1.6.6

CocoaPods 적용 안내

CocoaPods 공식 공지에 따라 CocoaPods는 2026년 12월 2일 이후에 trunk를 읽기 전용으로 전환하고 새로운 Podspec을 수신하지 않을 계획입니다. 새 프로젝트이거나 종속성 관리 방식을 조정 중인 프로젝트는 위의 Swift Package Manager 방식을 우선 사용하여 SDK를 통합하세요.

  1. Podfile 파일을 구성합니다.

    • Dynamic Library 사용

      use_frameworks!
      def shared_pods
        pod 'GuanceSDK', '[latest_version]'
        # Widget Extension 데이터 수집이 필요한 경우
        pod 'GuanceSDK/WidgetExtension', '[latest_version]'
      end
      
      # 메인 프로젝트
      target 'yourProjectName' do
        shared_pods
      end
      
      # Widget Extension
      target 'yourWidgetExtensionName' do
        shared_pods
      end
      
    • Static Library 사용

      use_modular_headers!
      # 메인 프로젝트
      target 'yourProjectName' do
        pod 'GuanceSDK', '[latest_version]'
      end
      # Widget Extension
      target 'yourWidgetExtensionName' do
        pod 'GuanceSDK/WidgetExtension', '[latest_version]'
      end
      
    • 코드 저장소를 로컬에 다운로드하여 사용

      Podfile 파일:

      use_modular_headers!
      # 메인 프로젝트
      target 'yourProjectName' do
        pod 'GuanceSDK', :path => '[folder_path]'
      end
      # Widget Extension
      target 'yourWidgetExtensionName' do
        pod 'GuanceSDK/WidgetExtension', :path => '[folder_path]'
      end
      

      folder_path: GuanceSDK.podspec 파일이 있는 폴더의 경로입니다.

      GuanceSDK.podspec 파일:

      GuanceSDK.podspec 파일에서 s.versions.source를 수정합니다.

      Pod::Spec.new do |s|
        s.name         = "GuanceSDK"
        s.version      = "[latest_version]"
      s.source       = { :git => "https://github.com/GuanceCloud/datakit-ios.git", :tag => s.version }
      end
      

      s.version: 지정된 버전으로 수정합니다. Sources/Agent/Core/FTSDKVersion.hSDK_VERSION과 일치시키는 것이 좋습니다.

      s.source: tag => s.version

Widget Extension 호환 표기법:

SDK 1.6.6 이상 버전은 GuanceSDK/WidgetExtension 사용을 권장합니다. 기존 프로젝트에서 pod 'FTMobileSDK', :subspecs => ['Extension']을 사용했다면, GuanceSDK로 업그레이드한 후에도 호환 subspec을 계속 사용할 수 있습니다:

target 'yourWidgetExtensionName' do
  pod 'GuanceSDK', :subspecs => ['Extension']
end
  1. Podfile 디렉토리에서 pod install을 실행하여 SDK를 설치합니다.

호환성 안내: SDK 1.6.6 이상 버전에서 메인 Pod 이름은 GuanceSDK입니다. 이전 FTMobileSDK 통합 방식은 1.6.6 이전 버전에 적용됩니다. 1.6.6 이상 버전으로 업그레이드할 때는 마이그레이션 가이드를 참조하여 종속성 이름을 조정하세요.

헤더 파일 추가

#import <GuanceSDK/GuanceSDK.h>
import GuanceSDK

상세 설정 진입점

고급 시나리오

자주 묻는 질문

크래시 로그 분석

개발 중 DebugRelease 모드에서는 Crash 시 캡처된 스레드 역추적이 심볼화됩니다. 그러나 릴리스 패키지에는 심볼 테이블이 포함되어 있지 않으므로, 예외 스레드의 주요 역추적은 이미지 이름만 표시되고 유효한 코드 심볼로 변환되지 않습니다. 획득한 crash log의 관련 정보는 모두 16진수 메모리 주소이며, 크래시 코드를 식별할 수 없습니다. 따라서 16진수 메모리 주소를 해당 클래스 및 메서드로 변환해야 합니다.

컴파일 또는 패키징 후 dSYM 파일을 찾는 방법

  • Xcode에서 dSYM 파일은 일반적으로 컴파일된 .app 파일과 함께 동일한 디렉토리에 생성됩니다.
  • 프로젝트를 보관(Archive)한 경우, Xcode의 Window 메뉴에서 Organizer를 선택한 다음 해당 보관 파일을 선택합니다. 보관 파일을 마우스 오른쪽 버튼으로 클릭하고 Show in Finder를 선택합니다. Finder에서 해당 .xcarchive 파일을 찾습니다. .xcarchive 파일을 마우스 오른쪽 버튼으로 클릭하고 Show Package Contents를 선택한 다음 dSYMs 폴더로 이동하면 해당 dSYM 파일을 찾을 수 있습니다.

Xcode 컴파일 후 dSYM 파일이 생성되지 않습니까?

Xcode Release 컴파일은 기본적으로 dSYM 파일을 생성하지만, Debug 컴파일은 기본적으로 생성하지 않습니다. 해당 Xcode 설정은 다음과 같습니다:

Build Settings -> Code Generation -> Generate Debug Symbols -> Yes

Build Settings -> Build Option -> Debug Information Format -> DWARF with dSYM File

bitCode를 활성화한 경우 심볼 테이블을 어떻게 업로드하나요?

bitcode App을 App Store에 업로드할 때 제출 대화 상자에서 심볼 파일(dSYM 파일) 생성을 선언합니다:

  • 심볼 테이블 파일을 구성하기 전에 App Store에서 해당 버전의 dSYM 파일을 로컬로 다운로드한 다음, 스크립트를 사용하여 입력 파라미터에 따라 심볼 테이블 파일을 처리 및 업로드해야 합니다.
  • 스크립트를 Xcode 프로젝트의 Target에 통합할 필요가 없으며, 로컬에서 생성된 dSYM 파일을 사용하여 심볼 테이블 파일을 생성하지 마십시오. 로컬 컴파일로 생성된 dSYM 파일의 심볼 테이블 정보는 모두 숨겨져 있기 때문입니다. 로컬 컴파일로 생성된 dSYM 파일을 업로드하면 복원 결과가 "__hiden#XXX"와 같은 심볼이 됩니다.

App Store에 게시된 앱의 dSYM 파일을 찾는 방법은 무엇인가요?

App Store Connect에 업로드된 애플리케이션의 Distribution options dSym 파일
Don’t include bitcode
Upload symbols
Xcode를 통해 찾기
Include bitcode
Upload symbols
iTunes Connect를 통해 찾기
Xcode를 통해 찾기, .bcsymbolmap을 사용한 디오버스케이션(deobfuscation) 처리 필요
Include bitcode
Don’t upload symbols
Xcode를 통해 찾기, .bcsymbolmap을 사용한 디오버스케이션 처리 필요
Don’t include bitcode
Don’t upload symbols
Xcode를 통해 찾기
Xcode를 통해 찾기
  1. Xcode -> Window -> Organizer

  2. Archives 탭 선택

  3. 게시된 보관 패키지를 찾아 마우스 오른쪽 버튼으로 클릭하고 Show in Finder 선택

  4. 찾은 보관 파일을 마우스 오른쪽 버튼으로 클릭하고 패키지 내용 보기 선택

  5. dSYMs 디렉토리 선택, 디렉토리 내에 다운로드된 dSYM 파일이 있습니다.

iTunes Connect를 통해 찾기
  1. App Store Connect에 로그인합니다.
  2. "My Apps"로 이동합니다.
  3. "App Store" 또는 "TestFlight"에서 특정 버전을 선택하고 "빌드 메타데이터(Build Metadata)"를 클릭합니다. 이 페이지에서 "Download dSYM" 버튼을 클릭하여 dSYM 파일을 다운로드합니다.
.bcsymbolmap 디오버스케이션 처리

Xcode를 통해 dSYM 파일을 찾을 때 BCSymbolMaps 디렉토리를 볼 수 있습니다.

터미널을 열고 다음 명령을 사용하여 디오버스케이션 처리를 수행합니다.

xcrun dsymutil -symbol-map <BCSymbolMaps_path> <.dSYM_path>

충돌 필드를 방지하기 위한 전역 변수 추가

사용자 정의 필드와 SDK 데이터 간의 충돌을 방지하려면, 태그 이름에 프로젝트 약어 접두사를 추가하는 것이 좋습니다. 예: custom_tag_name. 프로젝트에서 사용하는 key 값은 소스 코드에서 확인할 수 있습니다. SDK 전역 변수에 RUM, Log와 동일한 변수가 있는 경우, RUM, Log가 SDK의 전역 변수를 덮어씁니다.

GXP_1_XGXP_2_XGXP_3_XGXP_4_XGXP_5_XGXP_6_XGXP_7_XGXP_8_XGXP_9_XGXP_10_XGXP_11_XGXP_12_XGXP_13_XGXP_14_XGXP_15_XGXP_16_XGXP_17_XGXP_18_XGXP_19_XGXP_20_XGXP_21_XGXP_22_XGXP_23_XGXP_24_XGXP_25_XGXP_26_XGXP_27_XGXP_28_XGXP_29_XGXP_30_XGXP_31_XGXP_32_XGXP_33_XGXP_34_XGXP_35_XGXP_36_XGXP_37_XGXP_38_XGXP_39_XGXP_40_XGXP_41_XGXP_42_XGXP_43_XGXP_44_XGXP_45_XGXP_46_XGXP_47_XGXP_48_X

문서 평가

이 페이지가 도움이 되었나요?