Yayınla ve Abone Ol

Yakındaki Mesajlar API'si, yakındaki cihazların küçük miktarda veri aktarımını sağlayan bir yayınlama abonesi API'sidir. Bir cihaz mesaj yayınladığında yakındaki cihazlar mesajı alabilir. İyi bir performans sürdürebilmek için ileti boyutu yeterince küçük olmalıdır. Bu hizmet, fotoğraflar ve videolar gibi daha büyük nesnelerin alışverişi için tasarlanmamıştır.

Yakındaki cihazlar, Bluetooth ve neredeyse ultrasonik (duyulamayan) ses üzerinden küçük jetonların değişimiyle belirlenir. Yakındaki bir cihazdan jeton algılandığında cihaz, jetonu Nearby Messages sunucusuna göndererek kodu doğrular ve uygulamanın mevcut abonelik grubu için teslim edilecek herhangi bir mesaj olup olmadığını kontrol eder.

Bir uygulama, cihaz keşfi için kullanılan aracı grubunu ve ortamların jeton yayınlamak ve/veya jeton taraması yapmak için kullanılıp kullanılmadığını kontrol edebilir. Varsayılan olarak yayın ve tarama tüm ortamlarda yapılır. Bir alt küme veya aracılar üzerinde keşif yapmak ve yayın ya da tarama yapmak isteyip istemediğinizi kontrol etmek için yayınlar ve abonelikler oluştururken ek parametreler iletmeniz gerekir.

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, yayınlamanızı ve abone olmanızı sağlayan bir mesaj yöneticisi nesnesi oluşturur. Mesaj alışverişinin kimliği doğrulanmamıştır. Bu nedenle, iOS için genel API anahtarı sağlamanız gerekir. Projenizin Google Developers Console girişini kullanarak bir kod oluşturabilirsiniz.

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, ad içeren bir mesajın yayınlanmasını göstermektedir. Yayın, yayın nesnesi var olduğu sürece etkindir. Yayınlamayı 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'i tarafından paylaşılan tüm adlara abone olma işlemini gösterir. Abonelik, abonelik nesneleri mevcut olduğu sürece etkindir. Aboneliği durdurmak için abonelik nesnesini bırakın.

Yakındaki mesaj yayınlayan cihazlar bulunduğunda mesaj bulundu işleyicisi çağrılır. Bir mesaj artık gözlemlenmediğinde (cihaz kapsama alanı dışına çıktığında veya mesajı artık yayınlamadığında) mesaj kayıp işleyicisi çağrılır.

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 araçları

Varsayılan olarak, yakındaki cihazları keşfetmek için her iki ortam (ses ve Bluetooth) kullanılır ve her iki ortam da yayın ve tarama yapar. Bazı durumlarda, uygulamanızın Info.plist bölümüne aşağıdaki girişleri eklemeniz gerekir:

  • Uygulamanız ses kullanarak tarama yapıyorsa NSMicrophoneUsageDescription kodunu ekleyin. Bu dize, mikrofonu neden kullanacağınızı açıklayan bir dizedir. Örneğin, "Mikrofon yakındaki cihazların anonim jetonlarını dinler."

  • Uygulamanız BDE kullanarak yayın yapıyorsa NSBluetoothPeripheralUsageDescription ekleyin. Bu dize, neden BDE'de reklam yapacağınızı açıklayan bir dizedir. Örneğin, "Etraftaki cihazların keşfedilmesi için Bluetooth aracılığıyla bir anonim jeton tanıtılır."

Bazı durumlarda, uygulamanızın bu ortamlardan yalnızca birini kullanması ve o ortamda hem yayın hem de tarama yapması gerekmeyebilir.

Örneğin, sesle yayın yapan bir set üstü kutuya bağlanmak üzere tasarlanmış bir uygulamanın, bulunabilmesi için yalnızca sesi taraması yeterlidir. Aşağıdaki snippet'te, keşif için yalnızca ses taramayı kullanarak söz konusu set üstü kutuda nasıl mesaj yayınlayacağınız gösterilmektedir:

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ı, Yakındakiler Mesajları'nı uygulamanıza entegre ederken karşılaşabileceğiniz sorunları tespit etmek için faydalı olabilecek önemli dahili etkinlikleri konsola yazdırır. Teknik destek için bizimle iletişime geçerseniz bu günlükleri isteriz.

Bir mesaj yöneticisi oluşturmadan önce bu özelliği etkinleştirmeniz gerekir. Bu kod snippet'i, hata ayıklama günlük kaydının nasıl etkinleştirileceğini gösterir:

Objective-C

[GNSMessageManager setDebugLoggingEnabled:YES];

Swift

GNSMessageManager.setDebugLoggingEnabled(true)

"Etrafımda" izin durumunu izleme

Cihaz keşfini etkinleştirmek için kullanıcı izni gereklidir. Bu, Yakındaki izin durumu ile gösterilir. Yayın veya abonelik oluşturmak için yapılan ilk çağrıda kullanıcıya bir rıza iletişim kutusu gösterilir. Kullanıcı izin vermezse cihaz keşfi çalışmaz. Bu durumda uygulamanız, kullanıcıya cihaz keşfinin devre dışı bırakıldığını hatırlatacak bir mesaj gösterecektir. İzin durumu NSUserDefaults konumunda depolanır.

Aşağıdaki snippet'te izin durumuna abone olma gösterilmektedir. İzin durumu değiştiğinde işleyici çağrılır ve kullanıcı izin verene ya da 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ıya izin durumunu değiştirme olanağı sunabilir (örneğin, ayarlar sayfasındaki bir açma/kapatma anahtarı kullanarak).

İzin durumunun nasıl alınacağı ve ayarlanacağıyla ilgili bir örneği burada bulabilirsiniz.

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ını izleme

Kullanıcı mikrofon iznini reddetmiş, Bluetooth iznini reddetmiş veya Bluetooth'u kapatmışsa Etrafımda özelliği iyi veya hiç çalışmayabilir. Bu tür durumlarda uygulamanız, kullanıcıyı Yakındakiler işlemlerinin engellendiği konusunda uyaran bir mesaj gösterir. Aşağıdaki snippet'te, mesaj yöneticisini oluştururken işleyicileri ileterek bu kullanıcı ayarlarının durumunun nasıl izleneceği gösterilmektedir:

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ınlarınıza ve aboneliklerinize geçirdiğiniz parametrelere bağlı olarak iOS, Etrafımda işlevine izin vermeden önce çeşitli izinler isteyebilir. Örneğin, varsayılan strateji ultrasona yakın ses üzerinde aktarılan verileri dinler. Bu yüzden iOS, mikrofonu kullanmak için izin ister. Bu tür durumlarda, Etrafımda özelliği kullanıcıdan neden izin istendiğini açıklayan bir "uçuş öncesi" iletişim kutusu gösterir.

Özel bir "ön kontrol" iletişim kutusu sağlamak isterseniz yayın veya abonelik parametrelerinde permissionRequestHandler parametresini özel blok olarak ayarlayın. Özel engellemeniz, kullanıcı yanıt verdikten sonra permissionHandler blokunu çağırmalıdır. Aşağıdaki snippet'te bir yayın için bu işlemin nasıl yapılacağı gösterilmektedir:

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 planda çalışabilir. Arka plan modunu kullanmaya karar verirken aklınızda bulundurmanız gereken bazı noktalar şunlardır:

  • Arka plan işlemleri yalnızca BDE ortamını kullanmalıdır; ses desteklenmez.
  • Arka plan BDE için ek pil maliyeti vardır. Maliyet düşüktür, ancak arka plan modunu kullanmaya karar vermeden önce bunu ölçmelisiniz.
  • iOS, arka planda BDE aracılığıyla reklam yayınlamak için kullanıcıdan izin ister.

Bir yayına veya aboneliğe arka plan modu eklemek için şu ek adımları uygulayın:

  • Doğru yapılandırılmış bir GNSStrategy nesnesini ileterek yayınınızda veya aboneliğinizde arka plan modunu ve yalnızca BDE'yi etkinleştirin. Aşağıdaki snippet'te abonelik için bu işlemin nasıl yapılacağı gösterilmektedir:

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

  • Bu girişleri uygulamanızın Info.plist öğesine ekleyin:

    • UIBackgroundModes giriş:

      • Arka planda BLE taraması için bluetooth-central. Yalnızca keşif modu taramayı içerdiğinde gereklidir; varsayılan olarak tarama yapar.
      • Arka planda BDE reklamları için bluetooth-peripheral. Yalnızca keşif modunda yayın bulunduğunda gereklidir; varsayılan olarak bulunur.
    • BDE'de neden reklam yayınladığınızı açıklayan NSBluetoothPeripheralUsageDescription dizesi. Örneğin, "Etraftaki cihazları keşfetmek için Bluetooth aracılığıyla anonim bir jetonun reklamı yapılır." Ayrıntılar için Apple'ın belgelerine bakın.

  • Uygulamanız, arka plandayken sistem tarafından herhangi bir zamanda sonlandırılabilir. Arka plan modu, kullanıcı tarafından etkinleştirilebilen veya devre dışı bırakılabilen bir ayarsa uygulamanız şunları yapmalıdır:

    • Arka plan modu değerini kullanıcı her değiştirdiğinde NSUserDefaults değerine kaydedin.
    • Başlangıçta, bunu NSUserDefaults bölümünden okuyun ve arka plan modu etkinse Yakındaki yayınları ve/veya abonelikleri geri yükleyin.

Arka plan bildirimleri

Bir abonelik arka plandayken bir mesaj aldığında uygulamanızın kullanıcıya bildirimde bulunmasını istiyorsanız yerel bildirimleri kullanabilirsiniz.

Bunları uygulamanıza eklemek için aşağıdaki 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 ileti 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...
    }