Nearby Messages API はパブリッシュ / サブスクライブ型の API です。この機能により、付近のデバイスが データの小さなペイロードを交換します。デバイスがメッセージをパブリッシュすると、 デバイスがメッセージを受信できます。メッセージ サイズは、 維持しますこのサービスは、大規模な会議をやり取りするための オブジェクト。
近くにあるデバイスのセットは、2、 Bluetooth と近超音波(inaudible)音声。デバイスがトークンを検出したとき Nearby Messages サーバーにトークンを送信し、 検証し、アプリケーションの宛先に配信すべきメッセージがあるかどうかを 現在のセットを記録します
アプリは、デバイスの検出に使用するメディアのセットを制御できます。 メディアがトークンのブロードキャストに使用されるかどうか、トークンのスキャンに使用されるかどうか。 デフォルトでは、すべてのメディアでブロードキャストとスキャンが行われます。タスク サブセットやメディアでの検索、ブロードキャストとスキャンのどちらの パブリケーションと Cloud Storage バケットを 。
このライブラリは iOS 7 以降で動作し、iOS 8 SDK を使ってビルドされます。
メッセージ マネージャーの作成
このコードは、メッセージ マネージャー オブジェクトを作成します。このオブジェクトを使用して、 定期購読できますメッセージ交換は認証されていないため、 公開 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)))
メッセージへの登録
このコード スニペットは、プロバイダによって共有されるすべての名前のサブスクライブを示しています。 以前のパブリケーションスニペット契約期間中は、サブスクリプションが 存在します。定期購入を停止するには、定期購入を解除してください 渡されます。
Message found ハンドラは、パブリッシュしている付近のデバイスが呼び出されると呼び出されます 検出されます。メッセージが失われると、メッセージ消失ハンドラが呼び出されます。 (デバイスが圏外にあるか、もはや公開されていない) 。
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
})
発見メディア
デフォルトでは、付近の検出に両方のメディア(音声と Bluetooth)が使用されます
どちらのメディアもブロードキャストとスキャンを行います。一部のケースでは
次のエントリをアプリの Info.plist
に追加する必要があります。
アプリで音声を使用してスキャンする場合は、
NSMicrophoneUsageDescription
を追加します。 マイクを使用する理由を説明する文字列です。たとえば、「The マイクは付近のデバイスからの匿名トークンをリッスンします。」アプリが BLE を使用してブロードキャストする場合は、
NSBluetoothPeripheralUsageDescription
。これは、リソースへのアクセスを BLE でアドバタイジングたとえば、「匿名トークンがアドバタイズされ、 付近のデバイスを検出できます。」
場合によっては、アプリで 1 つのメディアのみを使用しなければならないこともあります。 そのメディアで配信とスキャンの両方を行う必要がない場合もあります。
たとえば、インターネットから接続されるセットトップ ボックスに接続するように設計されたアプリは、 音声でブロードキャストする場合、検出するために音声をスキャンするだけで済みます。次の 音声のみを使用してそのセットトップ ボックスにメッセージをパブリッシュするスニペット 検出のためのスキャン:
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 を統合する際に発生する可能性のある問題を追跡するのに役立つ アプリにメッセージを追加。お客様から以下の目的で 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 に影響するユーザー設定のトラッキング
ユーザーがマイクの使用許可を拒否した場合、Bluetooth 許可を拒否した場合 が Bluetooth がオフになっているため、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 スキャンする場合。必要のみ 検出モードにスキャンが含まれる場合実行されます。bluetooth-peripheral
: バックグラウンドでの BLE 広告用。必要 検出モードにブロードキャストが含まれている場合のみ実行されます。
理由を説明する
NSBluetoothPeripheralUsageDescription
文字列 BLE でアドバタイジングたとえば、「匿名トークンは 付近のデバイスを検出するため、Bluetooth 経由でアドバタイズされています。」詳しくは、 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... }