Yakındaki Mesajlar API'si, yakındaki cihazların ve küçük miktarda veri değiş tokuşuna dayanır. Bir cihaz mesaj yayınladığında yakındaki cihaz tarafından görüntülenebilir. İleti boyutu, en fazla iyi bir performansın sürdürülmesini sağlar. Bu hizmet daha büyük boyutlu ürünlerin takas edilmesine yönelik değildir. nesneler (ör. fotoğraflar ve videolar)
Yakındaki cihazlar grubu, küçük jetonların Bluetooth ve ultrasona yakın (duyulamayan) ses Cihaz bir jeton algıladığında yakındaki bir cihazdan gönderirse jetonu civardaki Mesajlar sunucusuna gönderir. doğrulamalı ve uygulama için teslim edilecek mesaj olup olmadığını Mevcut abonelik grubu.
Uygulama, cihaz keşfi için kullanılan ortam grubunu kontrol edebilir ve ortamların jeton yayınlamak ve/veya jeton taraması yapmak için kullanılıp kullanılmadığı. Varsayılan olarak, yayınlama ve tarama tüm ortamlarda yapılır. Yapılacaklar bir alt küme veya aracı üzerinde keşif yapmak ve yayın mı yoksa tarama yapmak mı yayın oluşturduğunuzda ve kullandığınız aboneliklerdir.
Bu kitaplık iOS 7 ve sonraki sürümlerde çalışır ve iOS 8 SDK ile oluşturulur.
Mesaj yöneticisi oluşturma
Bu kod, mesaj yöneticisi nesnesi oluşturur. Bu nesneyi yayınlayıp abone ol. İleti değişiminin kimliği doğrulanmamış. Bu nedenle, iOS için genel API anahtarı. Google Developers Console girişini kullanarak şunun için bir tane oluşturabilirsiniz: akılda kalıcı bir yolunu sunar.
Objective-C
#import <GNSMessages.h>
GNSMessageManager *messageManager =
[[GNSMessageManager alloc] initWithAPIKey:@"API_KEY"];
Swift
let messageManager = GNSMessageManager(APIKey: "API_KEY")
Mesaj yayınlama
Bu kod snippet'i, bir ad içeren mesajın yayınlanmasını gösterir. Yayın nesnesi mevcut olduğu sürece yayın etkindir. Durdurmak için yayın nesnesini serbest bırakın.
Objective-C
id<GNSPublication> publication =
[messageManager publicationWithMessage:[GNSMessage messageWithContent:[name dataUsingEncoding:NSUTF8StringEncoding]]];
Swift
let publication =
messageManager.publication(with: GNSMessage(content: name.data(using: .utf8)))
Mesajlara abone olma
Bu kod snippet'i, önceki yayın snippet'ini kullanın. Abonelik, abonelik nesneleri var. Aboneliği durdurmak için aboneliği iptal edin nesnesini tanımlayın.
Mesaj bulundu işleyicisi, yayınlama yapan yakındaki cihazlar olduğunda çağrılır bulunur. Mesaj kayıp işleyicisi, daha uzun süre gözlemlendiği gibi (cihaz kapsama alanı dışına çıkmıştır veya artık mesajı).
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
})
Keşif ortamları
Varsayılan olarak, yakındaki yerleri keşfetmek için her iki ortam da (ses ve Bluetooth) kullanılır
her iki aracı da yayınlayıp tarayacak. Belirli durumlarda
uygulamanızın Info.plist
öğesine aşağıdaki girişleri eklemeniz gerekir:
Uygulamanız ses kullanarak tarama yapıyorsa
NSMicrophoneUsageDescription
mikrofonu neden kullanacağınızı açıklayan bir dizedir. Örneğin, " mikrofon yakındaki cihazlardan gelen anonim jetonları dinliyor."Uygulamanız BDE kullanarak yayın yapıyorsa
NSBluetoothPeripheralUsageDescription
, bu da neden şimdiki BDE üzerinden reklam yayınlayacaktır. Örneğin, "Anonim bir jetonun reklamı yapılır ve için Bluetooth aracılığıyla sağlıyor."
Bazı durumlarda, uygulamanızın ortamlardan yalnızca birini kullanması gerekebilir ve bu ortamda hem yayınlama hem de tarama yapması gerekmeyebilir.
Örneğin, ancak sesli olarak yapılan yayının keşfedilebilmesi için yalnızca sesin taranması gerekir. Aşağıdakiler snippet, bir set üstü kutuya yalnızca ses kullanarak nasıl mesaj yayınlanacağını gösterir. keşif için taranıyor:
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
})
})
Hata ayıklama günlük kaydını etkinleştirme
Hata ayıklama günlük kaydı, önemli dahili etkinlikleri konsola yazdırarak Etrafımda özelliğini entegre ederken karşılaşabileceğiniz sorunları tespit etmek için kullanışlıdır Mesajlar, uygulamanıza aktarılır. Bizimle iletişime geçtiğinizde bu günlükleri isteriz. teknik destek.
Mesaj yöneticisi oluşturmadan önce bu özelliği etkinleştirmeniz gerekir. Bu kod snippet'i, hata ayıklama günlüğü nasıl etkinleştirilir?
Objective-C
[GNSMessageManager setDebugLoggingEnabled:YES];
Swift
GNSMessageManager.setDebugLoggingEnabled(true)
Yakındakiler izin durumunu izleme
Cihaz keşfinin etkinleştirilmesi için kullanıcı izni gereklidir. Bu,
Yakındakiler izin durumu. Yayın oluşturmak için yapılan ilk çağrıda veya
kullanıcıya bir izin iletişim kutusu gösterilir. Kullanıcı bunu yapmazsa
izin verilmezse cihaz keşfi çalışmaz. Bu durumda, uygulamanızda
kullanıcıya cihaz bulma özelliğinin devre dışı bırakıldığını hatırlatır. İzin
durumu NSUserDefaults
parametresinde saklanır.
Aşağıdaki snippet, izin durumuna abone olmayı gösterir. İlgili içeriği oluşturmak için kullanılan durum her değiştiğinde izin durumu değişti işleyicisi çağrılır ve kullanıcı izin verene veya reddedene kadar ilk kez çağrılmaz. Aboneliği durdurmak için izin nesnesini serbest bırakın.
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
})
Uygulamanız, kullanıcının izin durumunu değiştirmesi için bir yöntem sağlayabilir; şunun için: Bunu ayarlamak için ayarlar sayfasındaki açma/kapatma düğmesini kullanabilirsiniz.
Aşağıda, izin durumunun nasıl alınacağı ve ayarlanacağı bir örnek verilmiştir.
Objective-C
BOOL permissionState = [GNSPermission isGranted];
[GNSPermission setGranted:!permissionState]; // toggle the state
Swift
let permissionState = GNSPermission.isGranted()
GNSPermission.setGranted(!permissionState) // toggle the state
Etrafımda özelliğini etkileyen kullanıcı ayarları izleniyor
Kullanıcı mikrofon iznini, Bluetooth iznini reddettiyse veya Bluetooth'u kapattıysa, Etrafımda özelliği de çalışmayacak veya hiç çalışmayabilir. Uygulamanız bu gibi durumlarda bir mesaj göstermelidir ve kullanıcıyı Yakındakilerle Paylaş özelliğinin faaliyetlerinin aksamasına neden olabilir. Aşağıdaki snippet, mesajı oluştururken işleyicileri ileterek bu kullanıcı ayarlarının durumunu yönetici:
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
}
})
"Etrafımda" izni iletişim kutusunu geçersiz kılma
Yayın ve aboneliklerinize aktardığınız parametrelere bağlı olarak iOS, Etrafımda özelliğinin çalışmasına izin vermeden önce çeşitli izinler isteyebilir. Örneğin, Örneğin, varsayılan strateji neredeyse ultrasonik sinyallere göre sesini etkinleştiremez. Bu nedenle iOS, mikrofonu kullanmak için izin ister. Böyle durumlarda Etrafımda, bir "ön yayın" görüntüler kullanıcıya neden sorulduğunu açıklayan iletişim kutusu tıklayın.
Özel bir "ön yayın" sağlamak isterseniz iletişim kutusunu
Yayındaki bir özel bloka permissionRequestHandler
parametresini veya
abonelik parametreleri. Özel yapı taşınız permissionHandler
çağırmalıdır
engelleme. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir
bir yayın için:
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.
}
})
Arka planda işlem
Cihaz keşfi için BDE kullanan yayınlar ve abonelikler: arka plan. Aşağıda, arka plan modu:
- Arka plan işlemleri yalnızca BDE aracısını kullanmalıdır; ses desteklenmiyor.
- Arka plan BDE için ek pil maliyeti vardır. Maliyet düşüktür ama arka plan modunu kullanmaya karar vermeden önce bunu ölçmeniz gerekir.
- iOS, kullanıcıdan arka planda BDE aracılığıyla reklam yayınlamak için izin ister.
Bir yayına veya aboneliğe arka plan modu eklemek için aşağıdaki ek talimatları uygulayın için şu adımları izleyin:
Yayınınızda veya aboneliğinizde arka plan modunu ve yalnızca BDE'yi şu tarihe kadar etkinleştirin: düzgün yapılandırılmış bir
GNSStrategy
nesnesini aktarmalıdır. Aşağıdaki snippet bir abonelikte bunun nasıl yapılacağını gösterir: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 }) })
Uygulamanızın
Info.plist
öğesine şu girişleri ekleyin:UIBackgroundModes
giriş:- Arka planda BDE taraması için
bluetooth-central
. Yalnızca gerekli keşif modu taramayı içerdiğinde; varsayılan olarak yapar. - Arka planda BDE reklamları için
bluetooth-peripheral
. Gereken yalnızca keşif modunda yayın bulunuyorsa varsayılan olarak yapar.
- Arka planda BDE taraması için
Nedenini açıklayan
NSBluetoothPeripheralUsageDescription
dizesi BDE üzerinden reklam yayınlayacaksınız. Örneğin, "Anonim jeton için Bluetooth aracılığıyla reklamı yapıyor." Görüntüleyin Apple'ın belgeleri inceleyebilirsiniz.
Uygulamanız, arka plandayken herhangi bir anda sistem tarafından kapatılabilir. Eğer arka plan modu, kullanıcı tarafından etkinleştirilebilen veya devre dışı bırakılabilen bir ayardır. uygulamasının şunları yapması gerekir:
- Kullanıcı her zaman arka plan modu değerini
NSUserDefaults
olarak kaydet anlamına gelir. - Başlangıçta,
NSUserDefaults
üzerinden okuyun ve Etrafımda özelliğini geri yükleyin arka plan modu etkinse yayınlar ve/veya abonelikler
- Kullanıcı her zaman arka plan modu değerini
Arka plan bildirimleri
Bir abonelik mesaj aldığında uygulamanızın kullanıcıyı bilgilendirmesini istiyorsanız arka planda çalışırken yerel bildirimler.
Bunları uygulamanıza eklemek için şu adımları izleyin:
Başlangıçta yerel bildirimlere kaydolun:
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))
Aboneliğinizin mesaj bulunan işleyicisinde yerel bildirim gönderin:
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... }