Near Messages API to interfejs API do publikowania i subskrybowania, który pozwala urządzeniom w pobliżu może wymieniać niewielkie ładunki danych. Gdy urządzenie opublikuje wiadomość, w pobliżu urządzenia mogą odebrać wiadomość. Wiadomość powinna być dość mała do i utrzymać dobrą wydajność. Ta usługa nie służy do wymiany większych plików takie jak zdjęcia i filmy.
Zbiór urządzeń w pobliżu jest określany na podstawie wymiany małych tokenów Bluetooth i dźwięk bliski ultradźwiękowy (niesłyszalny). Gdy urządzenie wykryje token z urządzenia w pobliżu, wysyła token do serwera Wiadomości w pobliżu, jego poprawność i sprawdzić, czy są jakieś komunikaty do dostarczenia dla aplikacji aktualnego zestawu subskrypcji.
Aplikacja może kontrolować zestaw mediów używanych do wykrywania urządzeń oraz czy media są używane do rozpowszechniania tokenów i/lub skanowania w poszukiwaniu tokenów. Domyślnie transmisje i skanowanie są przeprowadzane w przypadku wszystkich mediów. Do zrobienia odkrywanie w podzbiorze lub mediach oraz określanie, czy mają być emitowane czy skanowane, musisz podczas tworzenia publikacji przekazywać dodatkowe parametry oraz subskrypcji.
Ta biblioteka działa w iOS 7 i nowszych wersjach i korzysta z pakietu SDK na iOS 8.
Tworzenie menedżera wiadomości
Ten kod tworzy obiekt menedżera wiadomości, który umożliwia publikowanie i zasubskrybować kanał. Wymiana wiadomości nie jest uwierzytelniona, więc musisz podać publiczny klucz API dla iOS. Możesz ją utworzyć przy użyciu wpisu w Google Developers Console dotyczącego w Twoim projekcie.
Objective-C
#import <GNSMessages.h>
GNSMessageManager *messageManager =
[[GNSMessageManager alloc] initWithAPIKey:@"API_KEY"];
Swift
let messageManager = GNSMessageManager(APIKey: "API_KEY")
Publikowanie wiadomości
Ten fragment kodu pokazuje publikowanie wiadomości zawierającej nazwę. Publikacja jest aktywna, dopóki istnieje obiekt publikacji. Aby zatrzymać Publishing, zwolnij obiekt publikacji.
Objective-C
id<GNSPublication> publication =
[messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]];
Swift
let publication =
messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)))
Subskrybowanie wiadomości
Ten fragment kodu pokazuje subskrypcję wszystkich nazw udostępnianych przez poprzedniego fragmentu kodu publikacji. Subskrypcja jest aktywna, dopóki Obiekty subskrypcji istnieją. Aby zrezygnować z subskrypcji, zwolnij subskrypcję obiektu.
Moduł obsługi znalezionej wiadomości jest wywoływany, gdy znajdują się w pobliżu urządzenia, które publikują wiadomości wiadomości są wykrywane. Moduł obsługi utraconej wiadomości jest wywoływany, gdy wiadomość nie jest jest już obserwowany (urządzenie znalazło się poza zasięgiem lub nie publikuje już ).
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
})
Media Discovery
Domyślnie do wykrywania obiektów w pobliżu używane są oba media (audio i Bluetooth)
i oba media będą transmitowane i skanowane. W niektórych przypadkach
należy dodać te pozycje do Info.plist
aplikacji:
Jeśli aplikacja skanuje przy użyciu dźwięku, dodaj
NSMicrophoneUsageDescription
, czyli tekst opisujący, dlaczego używasz mikrofonu. Na przykład „Adres mikrofon nasłuchuje anonimowych tokenów z urządzeń w pobliżu”.Jeśli aplikacja przesyła za pomocą BLE, dodaj
NSBluetoothPeripheralUsageDescription
– jest to ciąg tekstowy opisujący, będą wyświetlać reklamy w BLE. Na przykład „Reklamowany jest anonimowy token przez Bluetooth, aby wykryć urządzenia w pobliżu”.
W niektórych przypadkach aplikacja może korzystać tylko z jednego z tych mediów, być może nie będą musieli transmitować i skanować na tym medium.
Na przykład aplikacja, która łączy się z dekoderem transmisja dźwięku musi tylko przeskanować dźwięk, aby go wykryć. Poniżej fragment kodu pokazuje, jak opublikować wiadomość na dekoderze tylko przy użyciu dźwięku skanowanie w poszukiwaniu:
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
})
})
Włączam logowanie debugowania
Logowanie debugowania powoduje wydrukowanie w konsoli istotnych zdarzeń wewnętrznych, które można przydatne do śledzenia problemów, które mogą wystąpić przy integrowaniu funkcji W pobliżu Wiadomości do aplikacji. Poprosimy Cię o te dzienniki, jeśli skontaktujesz się z nami w sprawie pomocy technicznej.
Należy go włączyć przed utworzeniem menedżera wiadomości. Ten fragment kodu pokazuje Jak włączyć logowanie debugowania:
Objective-C
[GNSMessageManager setDebugLoggingEnabled:YES];
Swift
GNSMessageManager.setDebugLoggingEnabled(true)
Śledzenie stanu pozwolenia na korzystanie z funkcji W pobliżu
Do włączenia wykrywania urządzeń wymagana jest zgoda użytkownika. Jest to wskazywane przez tag
Stan uprawnień W pobliżu. podczas pierwszej rozmowy w celu utworzenia publikacji,
użytkownik zobaczy okno z prośbą o zgodę. Jeśli użytkownik nie wyrazi zgody,
zgody użytkownika, wykrywanie urządzenia nie będzie działać. W takim przypadku aplikacja powinna wyświetlać
przypominający użytkownikowi, że wykrywanie urządzeń jest wyłączone. Uprawnienia
stan jest przechowywany w NSUserDefaults
.
Ten fragment kodu pokazuje subskrypcję stanu uprawnień. moduł obsługi zmiany stanu uprawnień jest wywoływany przy każdej zmianie stanu i nie zostanie wywołana po raz pierwszy, dopóki użytkownik nie udzielił zgody lub jej odmówił. Zwolnij obiekt uprawnień, aby przestać subskrybować.
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
})
Aplikacja może umożliwiać użytkownikowi zmianę stanu uprawnień; w przypadku np. za pomocą przełącznika na stronie ustawień.
Oto przykład, jak uzyskać i ustawić stan uprawnień.
Objective-C
BOOL permissionState = [GNSPermission isGranted];
[GNSPermission setGranted:!permissionState]; // toggle the state
Swift
let permissionState = GNSPermission.isGranted()
GNSPermission.setGranted(!permissionState) // toggle the state
Śledzenie ustawień użytkowników, które mają wpływ na działanie funkcji W pobliżu
jeśli użytkownik odmówił przyznania dostępu do mikrofonu, dostępu do Bluetootha lub ma wyłączony Bluetooth, funkcja W pobliżu nie będzie działać za dobrze lub może w ogóle nie działać. Aplikacja powinna w takich przypadkach wyświetlać komunikat informujący użytkownika, że funkcja W pobliżu mają utrudnianie w działaniu. Ten fragment kodu pokazuje, jak śledzić tych ustawień użytkownika przez przekazanie modułów obsługi podczas tworzenia wiadomości menedżer:
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
}
})
Zastępowanie okna z uprawnieniami dostępu do urządzeń w pobliżu
W zależności od parametrów, które przekazujesz w publikacjach i subskrypcjach, iOS może prosić o różne uprawnienia przed zezwoleniem na działanie funkcji W pobliżu. Dla: przykład, domyślna strategia nasłuchuje danych przesyłanych przy użyciu więc iOS poprosi o pozwolenie na korzystanie z mikrofonu. W takich przypadkach W pobliżu wyświetli się „przelot wstępny” okno dialogowe z wyjaśnieniem, dlaczego zadano użytkownikowi pytanie aby udzielić pozwolenia.
Jeśli chcesz podać niestandardowy „proces wstępny” ustaw wartość
permissionRequestHandler
do niestandardowego blokowania w publikacji lub
parametrów subskrypcji. Blokada niestandardowa musi wywoływać metodę permissionHandler
blokować po udzieleniu odpowiedzi przez użytkownika. Fragment kodu poniżej pokazuje, jak to zrobić
w przypadku publikacji:
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.
}
})
Działanie w tle
Publikacje i subskrypcje, które wykorzystują BLE do wykrywania urządzeń, mogą działać w tle. Oto kilka kwestii, o których należy pamiętać przy podejmowaniu decyzji tryb działania w tle:
- Operacje w tle mogą korzystać wyłącznie z medium BLE. dźwięk nie jest obsługiwany.
- Jest dodatkowy koszt baterii w przypadku obsługi BLE w tle. Koszt jest niewielki, ale należy go zmierzyć przed użyciem trybu działania w tle.
- iOS poprosi użytkownika o pozwolenie na reklamowanie się za pomocą BLE w tle.
Aby dodać tryb działania w tle do publikacji lub subskrypcji, wykonaj te dodatkowe czynności: kroki:
Włącz tryb działania w tle i tryb BLE w swojej publikacji lub subskrypcji do prawidłowo skonfigurowanego obiektu
GNSStrategy
. Ten fragment kodu jak to zrobić w przypadku subskrypcji: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 }) })
Dodaj te wpisy do
Info.plist
aplikacji:UIBackgroundModes
wpisów:bluetooth-central
do skanowania BLE w tle. Tylko potrzebne gdy tryb wykrywania obejmuje skanowanie; domyślnie.bluetooth-peripheral
za reklamy BLE w tle. Potrzebne tylko wtedy, gdy tryb wykrywania obejmuje nadawanie; domyślnie.
NSBluetoothPeripheralUsageDescription
ciąg tekstowy opisujący powód będziesz reklamować się w BLE. Na przykład „Anonimowy token to reklamować się przez Bluetooth, aby wykryć urządzenia w pobliżu”. Zobacz Dokumentacja Apple .
System może w każdej chwili zamknąć Twoją aplikację w tle. Jeśli Tryb działania w tle to ustawienie, które może włączyć lub wyłączyć powinna wykonywać te czynności:
- Zapisuj wartość trybu działania w tle na
NSUserDefaults
za każdym razem, gdy użytkownik ją zmienić. - Po uruchomieniu odczytaj dane z urządzenia
NSUserDefaults
i przywróć kartę W pobliżu publikacji lub subskrypcji, jeśli jest włączony tryb działania w tle.
- Zapisuj wartość trybu działania w tle na
Powiadomienia w tle
Jeśli chcesz, żeby aplikacja powiadamiała użytkownika o otrzymaniu wiadomości w ramach subskrypcji a w tle można użyć powiadomień lokalnych.
Aby dodać je do swojej aplikacji, wykonaj te czynności:
Zarejestruj się, aby otrzymywać lokalne powiadomienia przy uruchamianiu:
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))
Wyślij lokalne powiadomienie w ramach modułu obsługi znalezionej wiadomości w Twojej subskrypcji:
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... }