다음을 통해 공유


App Center Analytics(macOS)

중요

Visual Studio App Center는 2025년 3월 31일에 사용 중지될 예정입니다. Visual Studio App Center가 완전히 사용 중지될 때까지 계속 사용할 수 있지만 마이그레이션을 고려할 수 있는 몇 가지 권장 대안이 있습니다.

지원 타임라인 및 대안에 대해 자세히 알아보세요.

App Center Analytics는 사용자 동작 및 고객 참여를 이해하여 앱을 개선하는 데 도움이 됩니다. SDK는 모델, OS 버전 등과 같은 세션 수 및 디바이스 속성을 자동으로 캡처합니다. 고유한 사용자 지정 이벤트를 정의하여 중요한 항목을 측정할 수 있습니다. 캡처된 모든 정보는 App Center 포털에서 데이터를 분석할 수 있습니다.

참고

macOS용 App Center Analytics에서는 이동 통신 사업자 국가 및 이동 통신 사업자 이름을 사용할 수 없지만 디바이스 위치를 사용하여 이동 통신 사업자 국가를 설정할 수 있습니다.

참고

4.0.0 App Center 버전에서는 호환성이 손상되는 변경 내용이 도입되었습니다. App Center SDK 4.0.0 이상으로 마이그레이션 섹션에 따라 이전 버전에서 App Center를 마이그레이션합니다.

애플리케이션에서 SDK를 아직 설정하지 않은 경우 시작 섹션을 따릅니다.

세션 및 디바이스 정보

앱에 App Center Analytics를 추가하고 SDK를 시작하면 추가 코드 없이 OS 버전, 모델 등을 포함한 세션 및 디바이스 속성을 자동으로 추적합니다.

참고

Mac Catalyst 앱에서 세션의 양은 iOS 앱보다 낮을 수 있습니다. Mac Catalyst에서 세션을 추적하는 데 사용되는 수명 주기 이벤트는 iOS의 이벤트와 다르게 작동합니다.

SDK는 디바이스에 모바일 데이터 모뎀과 SIM 카드 설치된 경우 사용자의 국가 코드를 자동으로 보고합니다. WiFi 전용 디바이스는 기본적으로 국가 코드를 보고하지 않습니다. 해당 사용자의 국가 코드를 설정하려면 사용자의 위치를 직접 검색하고 SDK에서 메서드를 사용해야 setCountryCode: 합니다. 사용자 위치를 추적하고 낮은 위치 해상도를 사용하는 것이 좋습니다. 아래 샘플에서는 kCLLocationAccuracyKilometer를 사용합니다.

  • 디바이스에서 Location Services를 사용하도록 설정 해야 합니다.
  • 를 사용하여 CLLocationManager디바이스의 현재 위치를 가져옵니다.
  • 를 사용하여 CLGeocoder위치를 ISO 국가 코드로 변환합니다.
  • SDK의 메서드를 사용하여 이동 통신 사업자 국가 코드를 재정의 setCountryCode 합니다.

다음 코드를 사용하여 디바이스의 위치를 가져와서 앱에서 이동 통신 사업자 국가 코드를 재정의합니다.

APPDelegate에 CLLocationManagerDelegate 프로토콜을 추가하고 locationManager 속성을 추가합니다.

@interface AppDelegate () <CLLocationManagerDelegate>
@property(nonatomic) CLLocationManager *locationManager;
@end
class AppDelegate: CLLocationManagerDelegate {
  private var locationManager: CLLocationManager = CLLocationManager()
}

didFinishLaunchingWithOptions: 메서드에서 위치 관리자를 설정합니다.

  self.locationManager = [[CLLocationManager alloc] init];
  self.locationManager.delegate = self;
  self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
  [self.locationManager requestWhenInUseAuthorization];
  self.locationManager.delegate = self
  self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer
  self.locationManager.requestWhenInUseAuthorization()

참고

requestWhenInUseAuthorization macOS에서는 메서드를 사용할 수 없습니다. macOS용으로 개발할 때 해당 메서드에 대한 호출을 제거합니다.

대리자 메서드를 추가합니다.

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
  if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
    [manager requestLocation];
  }
}

- (void)locationManger:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations {
  CLLocation *location = [locations lastObject];
  CLGeocoder *geocoder = [[CLGeocoder alloc] init];
  [geocoder reverseGeocodeLocation:location
                 completionHandler:^(NSArray *placemarks, NSError *error) {
                   if (placemarks.count == 0 || error)
                     return;
                   CLPlacemark *pm = [placemarks firstObject];
                   [MSACAppCenter setCountryCode:pm.ISOcountryCode];
                 }]
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
  NSLog(@"Failed to find user's location: \(error.localizedDescription)");
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
  if (status == kCLAuthorizationStatusAuthorizedWhenInUse) {
    manager.requestLocation()
  }
}

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
  let userLocation:CLLocation = locations[0] as CLLocation
  CLGeocoder().reverseGeocodeLocation(userLocation) { (placemarks, error) in
    if error == nil {
      AppCenter.countryCode = placemarks?.first?.isoCountryCode
    }
  }
}
  
func locationManager(_ Manager: CLLocationManager, didFailWithError error: Error) {
  print("Failed to find user's location: \(error.localizedDescription)")
}

사용자 지정 이벤트

최대 20개의 속성을 사용하여 사용자 지정 이벤트를 추적하여 앱에서 발생하는 작업을 파악하고, 사용자 작업을 이해하고, App Center 포털에서 집계를 볼 수 있습니다.

SDK를 시작한 후에는 메서드를 trackEvent:withProperties 사용하여 속성을 사용하여 이벤트를 추적합니다. 최대 200개의 고유한 이벤트 이름을 보낼 수 있습니다. 또한 이벤트 이름당 최대 256자, 이벤트 속성 이름 및 이벤트 속성 값당 125자로 제한됩니다.

NSDictionary *properties = @{@"Category" : @"Music", @"FileName" : @"favorite.avi"};
[MSACAnalytics trackEvent:@"Video clicked" withProperties: properties];
Analytics.trackEvent("Video clicked", withProperties: ["Category" : "Music", "FileName" : "favorite.avi"])

이벤트의 속성은 전적으로 선택 사항입니다. 이벤트를 추적하려는 경우 다음 샘플을 대신 사용합니다.

[MSACAnalytics trackEvent:@"Video clicked"];
Analytics.trackEvent("Video clicked")

이벤트 우선 순위 및 지속성

다른 이벤트보다 중요도가 높은 중요 비즈니스용 이벤트를 추적할 수 있습니다.

  • 개발자는 이벤트의 우선 순위를 Normal (FlagsNormal API의 경우) 또는 Critical (FlagsCritical API의 경우 )로 설정할 수 있습니다.
  • 우선 순위가 위험 으로 설정된 이벤트는 먼저 스토리지에서 검색되고 일반 이벤트 전에 전송됩니다.
  • 로컬 스토리지가 가득 차 새 이벤트를 저장해야 하는 경우 우선 순위가 가장 낮은 가장 오래된 이벤트는 먼저 삭제되어 새 이벤트를 위한 공간을 확보합니다.
  • 스토리지에 중요 우선 순위가 있는 로그가 가득 차면 SDK 가 이 경우 공간을 확보할 수 없으므로 정상 우선 순위가 있는 이벤트를 추적하지 못합니다.
  • Crashs 서비스도 사용하는 경우 크래시 로그는 위험으로 설정되고 이벤트와 동일한 스토리지를 공유합니다.
  • 전송 간격은 일반 이벤트에만 적용되며 , 위험 이벤트는 3초 후에 전송됩니다.

다음 API를 사용하여 이벤트를 위험으로 추적할 수 있습니다.

NSDictionary *properties = @{@"Category" : @"Music", @"FileName" : @"favorite.avi"};
[MSACAnalytics trackEvent:@"Video clicked" withProperties:properties flags:MSACFlagsCritical];

// If you're using name only, you can pass nil as properties.
let properties = ["Category" : "Music", "FileName" : "favorite.avi"];
Analytics.trackEvent("Video clicked", withProperties: properties, flags: .critical)

// If you're using name only, you can pass nil as properties.

로그 보내기 일시 중지 및 다시 시작

이벤트 전송을 일시 중지하는 것은 앱이 더 중요한 비즈니스 요구 사항에 맞게 네트워크 대역폭을 제어해야 하는 시나리오에서 유용할 수 있습니다. App Center 백 엔드로 로그 보내기를 일시 중지할 수 있습니다. 일시 중지된 경우에도 이벤트를 추적하고 저장할 수 있지만 바로 전송되지는 않습니다. 일시 중지된 상태에서 앱이 추적하는 모든 이벤트는 를 호출 resume한 후에만 전송됩니다.

[MSACAnalytics pause];
[MSACAnalytics resume];
Analytics.pause()
Analytics.resume()

런타임에 App Center Analytics 사용 또는 사용 안 함

런타임에 App Center Analytics를 사용하도록 설정하고 사용하지 않도록 설정할 수 있습니다. 사용하지 않도록 설정하면 SDK는 앱에 대한 분석 정보를 더 이상 수집하지 않습니다.

[MSACAnalytics setEnabled:NO];
Analytics.enabled = false

App Center Analytics를 다시 사용하도록 설정하려면 동일한 API를 사용하지만 매개 변수로 전달 YES/true 합니다.

[MSACAnalytics setEnabled:YES];
Analytics.enabled = true

상태는 애플리케이션이 시작되는 동안 디바이스의 스토리지에 유지됩니다.

참고

이 메서드는 가 시작된 후에 Analytics 만 사용해야 합니다.

App Center Analytics가 사용하도록 설정되어 있는지 확인

App Center Analytics를 사용하는지 여부를 검사 수도 있습니다.

[MSACAnalytics isEnabled];
Analytics.enabled

참고

이 메서드는 가 시작된 후에 Analytics 만 사용해야 하며, 항상 또는 시작 전에 반환 NOfalse 됩니다.

시작 세션 관리

기본적으로 세션 ID는 애플리케이션의 수명 주기에 따라 달라집니다. 새 세션의 시작을 수동으로 제어하려면 다음 단계를 수행합니다.

참고

Analytics.StartSession() API의 각 호출은 새 세션을 생성합니다. 수동 세션 추적기 모드에서 이 API가 호출되지 않으면 모든 전송 로그에 null 세션 값이 있습니다.

참고

새 애플리케이션이 시작된 후 세션 ID가 다시 생성됩니다.

  • SDK가 시작되기 전에 다음 메서드를 호출합니다.
[MSACAnalytics enableManualSessionTracker];
Analytics.enableManualSessionTracker()
  • 그런 다음, 다음에 API를 startSession 사용할 수 있습니다.AppCenter.start
[MSACAnalytics startSession];
Analytics.startSession()

로컬 스토리지 크기

기본적으로 SDK는 모든 로그를 최대 10MB까지 저장합니다. 개발자는 API를 사용하여 스토리지 크기를 늘릴 수 있으며 SDK는 스토리지가 가득 찼을 때까지 로그를 계속 저장합니다.

인터넷에 액세스할 수 없음

네트워크 연결이 없으면 SDK는 로컬 스토리지에 최대 10MB의 로그를 저장합니다. 스토리지가 가득 차면 SDK는 새 로그를 위한 공간을 확보하기 위해 이전 로그를 삭제하기 시작합니다. 네트워크 연결이 반환되면 SDK는 기본적으로 6초마다 50개 또는 그 이후의 일괄 처리로 로그를 보냅니다.

참고

25일보다 오래된 로그는 삭제됩니다.

이벤트 로그 일괄 처리

App Center SDK는 50개의 일괄 처리로 로그를 업로드하고 SDK에 보낼 로그가 50개 없는 경우 기본적으로 6초 후에도 로그를 보냅니다. 최대 3개의 일괄 처리가 병렬로 전송될 수 있습니다. 전송 간격을 변경할 수 있습니다.

// Change transmission interval to 10 seconds.
[MSACAnalytics setTransmissionInterval:10000];
// Change transmission interval to 10 seconds.
Analytics.transmissionInterval = 10000

전송 간격 값은 6초에서 86400초(하루) 사이여야 하며 서비스를 시작하기 전에 이 메서드를 호출해야 합니다.

다시 시도 및 백오프 논리

App Center SDK는 복구 가능한 네트워크 오류에 대한 백오프 재시도를 지원합니다. 다음은 재시도 논리입니다.

  • 요청당 최대 3회 시도.
  • 각 요청에는 자체 재시도 상태 컴퓨터가 있습니다.
  • 한 요청이 모든 재시도를 소진한 후 모든 전송 채널이 비활성화됩니다(다음 앱 프로세스까지).

백오프 논리

  • 50% 임의화, 먼저 5초에서 10초 사이 다시 시도, 두 번째 재시도 2.5~5분, 마지막 시도 10~20분
  • 네트워크가 꺼져 있거나 Wi-Fi에서 모바일로 전환되면 다시 시도 상태가 다시 설정되고 요청이 즉시 다시 시도됩니다.