Yayınla ve Abone Ol

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

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