게시 및 구독

Nearby Messages API는 근처 기기에서 데이터의 작은 페이로드를 교환할 수 있게 해주는 게시-구독 API입니다. 기기에서 메시지를 게시하면 근처 기기에서 메시지를 수신할 수 있습니다. 우수한 성능을 유지하려면 메시지 크기를 상당히 작게 유지해야 합니다. 이 서비스는 사진 및 동영상과 같이 더 큰 객체를 교환하기 위한 것이 아닙니다.

근처 기기 집합은 블루투스와 근초음파 (비들음) 오디오를 통한 작은 토큰 교환에 의해 결정됩니다. 기기가 근처 기기에서 토큰을 감지하면 Nearby Messages 서버로 토큰을 전송하여 유효성을 검사하고 애플리케이션의 현재 구독 모음에 전송할 메시지가 있는지 확인합니다.

애플리케이션은 기기 검색에 사용되는 매체 집합 및 토큰을 브로드캐스트하거나 토큰을 스캔하는 데 매체가 사용되는지 여부를 제어할 수 있습니다. 기본적으로 브로드캐스팅과 스캔은 모든 매체에서 실행됩니다. 하위 집합 또는 매체를 검색하고 브로드캐스트나 스캔 여부를 제어하려면 게시 및 구독을 만들 때 추가 매개변수를 전달해야 합니다.

이 라이브러리는 iOS 7 이상에서 실행되며 iOS 8 SDK로 빌드됩니다.

메시지 관리자 만들기

이 코드는 게시하고 구독할 수 있는 메시지 관리자 객체를 만듭니다. 메시지 교환은 인증되지 않으므로 iOS용 공개 API 키를 제공해야 합니다. 프로젝트의 Google Developers Console 항목을 사용하여 만들 수 있습니다.

Objective-C

#import <GNSMessages.h>

GNSMessageManager *messageManager =
    [[GNSMessageManager alloc] initWithAPIKey:@"API_KEY"];

Swift

let messageManager = GNSMessageManager(APIKey: "API_KEY")

메시지 게시

이 코드 스니펫은 이름이 포함된 메시지를 게시하는 방법을 보여줍니다. 게시는 게시 객체가 존재하는 한 활성 상태입니다. 게시를 중지하려면 게시 객체를 해제하세요.

Objective-C

id<GNSPublication> publication =
    [messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]];

Swift

let publication =
    messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)))

메시지 구독하기

이 코드 스니펫은 이전 게시 스니펫에서 공유한 모든 이름을 구독하는 방법을 보여줍니다. 정기 결제는 정기 결제 객체가 존재하는 한 활성 상태입니다. 구독을 중지하려면 구독 객체를 해제합니다.

메시지 발견 핸들러는 메시지를 게시하는 근처 기기가 검색될 때 호출됩니다. 메시지가 더 이상 관찰되지 않으면 (기기가 범위를 벗어났거나 더 이상 메시지를 게시하지 않는 경우) 메시지 손실 핸들러가 호출됩니다.

Objective-C

id<GNSSubscription> subscription =
    [messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) {
      // Add the name to a list for display
    }
    messageLostHandler:^(GNSMessage *message) {
      // Remove the name from the list
    }];

Swift

let subscription =
    messageManager.subscription(messageFoundHandler: { (message: GNSMessage?) in
      // Add the name to a list for display
    },
    messageLostHandler: { (message: GNSMessage?) in
      // Remove the name from the list
    })

탐색 매체

기본적으로 두 매체 (오디오 및 블루투스)를 모두 사용하여 근처 기기를 검색하며 두 매체가 모두 브로드캐스트 및 스캔됩니다. 경우에 따라 앱의 Info.plist에 다음 항목을 추가해야 합니다.

  • 앱이 오디오를 사용하여 스캔하는 경우 마이크를 사용하는 이유를 설명하는 문자열인 NSMicrophoneUsageDescription를 추가합니다. 예: '마이크가 근처 기기에서 익명 토큰을 수신 대기합니다.'

  • 앱이 BLE를 사용하여 브로드캐스트하는 경우 BLE에서 광고를 게재하는 이유를 설명하는 문자열인 NSBluetoothPeripheralUsageDescription를 추가합니다. 예를 들어 '근처 기기를 검색하기 위해 블루투스를 통해 익명 토큰이 공지됩니다.'

때에 따라 앱은 매체 중 하나만 사용해야 할 수도 있고 이 매체에서 브로드캐스팅과 검색을 모두 실행할 필요는 없습니다.

예를 들어 오디오로 방송하는 셋톱 박스에 연결하도록 설계된 앱은 오디오를 스캔하기만 하면 앱을 검색할 수 있습니다. 다음 스니펫은 검색을 위해 오디오 스캔만 사용하여 셋톱 박스에 메시지를 게시하는 방법을 보여줍니다.

Objective-C

id<GNSPublication> publication = [messageManager publicationWithMessage:message
    paramsBlock:^(GNSPublicationParams *params) {
      params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) {
        params.discoveryMediums = kGNSDiscoveryMediumsAudio;
        params.discoveryMode = kGNSDiscoveryModeScan;
      }];
    }];

Swift

let publication = messageManager.publication(with: message,
    paramsBlock: { (params: GNSPublicationParams?) in
      guard let params = params else { return }
      params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in
        guard let params = params else { return }
        params.discoveryMediums = .audio
        params.discoveryMode = .scan
      })
    })

디버그 로깅 사용 설정하기

디버그 로깅은 Nearby Messages를 앱에 통합할 때 발생할 수 있는 문제를 추적하는 데 유용한 중요한 내부 이벤트를 콘솔에 출력합니다. 기술 지원을 위해 Google에 문의하면 이러한 로그를 요청할 것입니다.

메시지 관리자를 만들기 전에 이 기능을 사용 설정해야 합니다. 다음 코드 스니펫은 디버그 로깅을 사용 설정하는 방법을 보여줍니다.

Objective-C

[GNSMessageManager setDebugLoggingEnabled:YES];

Swift

GNSMessageManager.setDebugLoggingEnabled(true)

Nearby 권한 상태 추적

기기 검색을 사용 설정하려면 사용자 동의가 필요합니다. 이는 Nearby 권한 상태로 표시됩니다. 간행물 또는 정기 결제를 만들기 위한 첫 번째 호출 시 사용자에게 동의 대화상자가 표시됩니다. 사용자가 동의하지 않으면 기기 검색이 작동하지 않습니다. 이 경우 앱에서는 사용자에게 기기 검색이 사용 중지되었음을 알리는 메시지를 표시해야 합니다. 권한 상태는 NSUserDefaults에 저장됩니다.

다음 스니펫은 권한 상태 구독을 보여줍니다. 권한 상태 변경 핸들러는 상태가 변경될 때마다 호출되며 사용자가 권한을 부여하거나 거부할 때까지 처음 호출되지 않습니다. 구독을 중지하려면 권한 객체를 해제합니다.

Objective-C

GNSPermission *nearbyPermission = [[GNSPermission alloc] initWithChangedHandler:^(BOOL granted) {
  // Update the UI here
}];

Swift

let nearbyPermission = GNSPermission(changedHandler: { (granted: Bool) in
  // Update the UI here
})

앱은 사용자가 권한 상태를 변경하는 방법을 제공할 수 있습니다(예: 설정 페이지의 전환 스위치 사용).

다음은 권한 상태를 가져오고 설정하는 방법의 예입니다.

Objective-C

BOOL permissionState = [GNSPermission isGranted];
[GNSPermission setGranted:!permissionState];  // toggle the state

Swift

let permissionState = GNSPermission.isGranted()
GNSPermission.setGranted(!permissionState)  // toggle the state

Nearby에 영향을 미치는 사용자 설정 추적

사용자가 마이크 권한을 거부했거나, 블루투스 권한을 거부했거나, 블루투스를 끈 경우 Nearby가 제대로 작동하지 않거나 전혀 작동하지 않을 수 있습니다. 이러한 경우 앱에서 Nearby의 작업이 중단되고 있음을 알리는 메시지를 표시해야 합니다. 다음 스니펫은 메시지 관리자를 만들 때 핸들러를 전달하여 이러한 사용자 설정의 상태를 추적하는 방법을 보여줍니다.

Objective-C

GNSMessageManager *messageManager = [[GNSMessageManager alloc]
    initWithAPIKey:API_KEY
       paramsBlock:^(GNSMessageManagerParams *params) {
         params.microphonePermissionErrorHandler = ^(BOOL hasError) {
           // Update the UI for microphone permission
         };
         params.bluetoothPowerErrorHandler = ^(BOOL hasError) {
           // Update the UI for Bluetooth power
         };
         params.bluetoothPermissionErrorHandler = ^(BOOL hasError) {
           // Update the UI for Bluetooth permission
         };
}];

Swift

let messageManager = GNSMessageManager(
         APIKey: API_KEY,
    paramsBlock: { (params: GNSMessageManagerParams?) in
      guard let params = params else { return }
      params.microphonePermissionErrorHandler = { (hasError: Bool) in
        // Update the UI for microphone permission
      }
      params.bluetoothPowerErrorHandler = { (hasError: Bool) in
        // Update the UI for Bluetooth power
      }
      params.bluetoothPermissionErrorHandler = { (hasError: Bool) in
        // Update the UI for Bluetooth permission
      }
    })

Nearby 권한 대화상자 재정의

간행물과 구독에 전달하는 매개변수에 따라 iOS는 Nearby가 작동하기 전에 다양한 권한을 요청할 수 있습니다. 예를 들어 기본 전략은 근초음파 오디오로 전송되는 데이터를 수신 대기하므로 iOS에서 마이크 사용 권한을 요청합니다. 이러한 경우 Nearby는 사용자에게 권한 부여를 요청하는 이유를 설명하는 '프리플라이트' 대화상자를 표시합니다.

커스텀 '프리플라이트' 대화상자를 제공하려면 게시 또는 정기 결제 매개변수에서 permissionRequestHandler 매개변수를 커스텀 블록으로 설정합니다. 사용자가 응답한 후에 맞춤 블록은 permissionHandler 블록을 호출해야 합니다. 다음 스니펫은 간행물에서 이 작업을 실행하는 방법을 보여줍니다.

Objective-C

id<GNSPublication> publication =
    [messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]
                               paramsBlock:^(GNSPublicationParams *params) {
                                 params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
                                   // Show your custom dialog here.
                                   // Don't forget to call permissionHandler() with YES or NO when the user dismisses it.
                                 };
                               }];

Swift

let publication =
    messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)),
        paramsBlock: { (params: GNSPublicationParams?) in
          guard let params = params else { return }
          params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler?) in
            // Show your custom dialog here.
            // Don't forget to call permissionHandler() with true or false when the user dismisses it.
          }
        })

백그라운드 작업

기기 검색에 BLE를 사용하는 게시 및 구독은 백그라운드에서 작동할 수 있습니다. 다음은 백그라운드 모드 사용을 결정할 때 유의해야 할 사항입니다.

  • 백그라운드 작업은 BLE 매체만 사용해야 합니다. 오디오는 지원되지 않습니다.
  • 백그라운드 BLE를 사용하면 배터리 비용이 추가됩니다. 비용은 저렴하지만 백그라운드 모드 사용을 결정하기 전에 측정해야 합니다.
  • iOS는 사용자에게 백그라운드에서 BLE를 통해 광고할 권한을 요청합니다.

간행물이나 정기 결제에 백그라운드 모드를 추가하려면 다음 추가 단계를 따르세요.

  • 올바르게 구성된 GNSStrategy 객체를 전달하여 게시 또는 구독에서 백그라운드 모드 및 BLE 전용을 사용 설정합니다. 다음 스니펫은 정기 결제에서 이 작업을 실행하는 방법을 보여줍니다.

    Objective-C

    id<GNSSubscription> subscription =
        [messageManager subscriptionWithMessageFoundHandler:^(GNSMessage *message) {
          // Add the name to a list for display
        }
        messageLostHandler:^(GNSMessage *message) {
          // Remove the name from the list
        }
        paramsBlock:^(GNSSubscriptionParams *params) {
          params.strategy = [GNSStrategy strategyWithParamsBlock:^(GNSStrategyParams *params) {
            params.allowInBackground = YES;
            params.discoveryMediums = kGNSDiscoveryMediumsBLE;
          }];
        }];
    

    Swift

    let subscription =
        messageManager.subscription(messageFoundHandler: { (message: GNSMessage?) in
          // Add the name to a list for display
        },
        messageLostHandler: { (message: GNSMessage?) in
          // Remove the name from the list
        },
        paramsBlock:{ (params: GNSSubscriptionParams?) in
          guard let params = params else { return }
          params.strategy = GNSStrategy(paramsBlock: { (params: GNSStrategyParams?) in
            guard let params = params else { return }
            params.allowInBackground = true
            params.discoveryMediums = .BLE
          })
        })
    

  • 앱의 Info.plist에 다음 항목을 추가합니다.

    • 항목 UIBackgroundModes개:

      • 백그라운드에서의 BLE 검색을 위한 bluetooth-central 검색 모드에 스캔이 포함된 경우에만 필요하며 기본적으로 필요합니다.
      • bluetooth-peripheral: 백그라운드 BLE 광고의 경우 검색 모드에 브로드캐스팅이 포함된 경우에만 필요하며 기본적으로 필요합니다.
    • BLE에서 광고를 게재하는 이유를 설명하는 NSBluetoothPeripheralUsageDescription 문자열입니다. 예를 들어 '근처 기기를 검색할 수 있도록 블루투스를 통해 익명 토큰이 광고됩니다.' 자세한 내용은 Apple 문서를 참조하세요.

  • 앱이 백그라운드에 있는 동안 시스템에 의해 언제든지 종료될 수 있습니다. 백그라운드 모드가 사용자가 사용 설정하거나 중지할 수 있는 설정인 경우 앱은 다음을 실행해야 합니다.

    • 사용자가 변경할 때마다 백그라운드 모드 값을 NSUserDefaults로 저장합니다.
    • 시작 시 NSUserDefaults에서 읽고, 백그라운드 모드가 사용 설정된 경우 Nearby 간행물 또는 구독을 복원합니다.

백그라운드 알림

백그라운드에서 정기 결제가 메시지를 수신하면 앱에서 사용자에게 알리도록 하려면 로컬 알림을 사용하면 됩니다.

앱에 추가하려면 다음 단계를 따르세요.

  • 시작 시 로컬 알림을 등록합니다.

    Objective-C

    if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]) {
      [[UIApplication sharedApplication] registerUserNotificationSettings:
          [UIUserNotificationSettings settingsForTypes:
              UIUserNotificationTypeAlert | UIUserNotificationTypeBadge | UIUserNotificationTypeSound
                                            categories:nil]];
    }
    

    Swift

    UIApplication.shared.registerUserNotificationSettings(
        UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil))
    

  • 구독의 메시지를 찾은 핸들러에서 로컬 알림을 전송합니다.

    Objective-C

    GNSMessageHandler myMessageFoundHandler = ^(GNSMessage *message) {
        // Send a local notification if not in the foreground.
        if ([UIApplication sharedApplication].applicationState != UIApplicationStateActive) {
          UILocalNotification *localNotification = [[UILocalNotification alloc] init];
          localNotification.alertBody = @"Message received";
          [[UIApplication sharedApplication] presentLocalNotificationNow:localNotification];
        }
        // Process the new message...
      };
    

    Swift

    let myMessageFoundHandler: GNSMessageHandler = { (message: GNSMessage?) in
      // Send a local notification if not in the foreground.
      if UIApplication.shared.applicationState != .active {
        let localNotification = UILocalNotification()
        localNotification.alertBody = "Message received"
        UIApplication.shared.presentLocalNotificationNow(localNotification)
      }
      // Process the new message...
    }