게시 및 구독

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를 사용하여 브로드캐스트하는 경우 NSBluetoothPeripheralUsageDescription: BLE에 광고하게 됩니다. 예: '익명 토큰이 광고됨 블루투스를 통해 근처 기기를 검색합니다."

앱이 매체 중 하나만 사용하면 되는 경우도 있습니다. 해당 매체에 대해 브로드캐스팅과 스캔을 둘 다 수행할 필요가 없을 수도 있습니다.

예를 들어 셋톱 박스에 연결되도록 설계된 앱은 오디오 방송은 오디오를 스캔하기만 하면 됩니다. 다음 오디오만 사용하여 셋톱 박스에 메시지를 게시하는 방법을 보여주는 스니펫 탐색용 스캔:

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 Share를 통합할 때 발생할 수 있는 문제를 추적하는 데 유용합니다. 앱에 메시지를 보냅니다. 다음에 대해 문의하는 경우 이러한 로그를 요청합니다. 기술 지원

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

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를 통해 광고할 권한을 사용자에게 요청합니다.

간행물 또는 구독에 백그라운드 모드를 추가하려면 단계:

  • 다음 방법으로 간행물 또는 구독에서 백그라운드 모드와 BLE 전용을 사용 설정하세요. 올바르게 구성된 GNSStrategy 객체를 전달합니다. 다음 스니펫 구독에서 이를 수행하는 방법을 보여줍니다.

    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개:

      • bluetooth-central: 백그라운드에서 BLE 검색을 수행합니다. 필요한 항목만 검색 모드에 스캔이 포함된 경우 기본적으로 실행됩니다
      • 백그라운드에서 BLE 광고를 위한 bluetooth-peripheral 필요 검색 모드에 브로드캐스팅이 포함된 경우에만 기본적으로 실행됩니다
    • 이유를 설명하는 NSBluetoothPeripheralUsageDescription 문자열 BLE에 광고하게 됩니다. 예를 들어 '익명 토큰은 블루투스를 통해 광고하여 근처 기기를 검색합니다." 자세한 내용은 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))
    

  • 구독의 message-found 핸들러에서 로컬 알림을 보냅니다.

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