İşaretçi Mesajları Alın

Uygulamanız, yakındaki diğer cihazlar tarafından yayınlanan mesajlara abone olmak için kullanılan mekanizmayı kullanarak Bluetooth Düşük Enerji (BDE) işaretçi mesajlarına abone olabilir.

Varsayılan olarak, işaretçi abonelikleri yalnızca uygulamanız ön plandayken çalışır. Uygulamanız arka plana gittiğinde, abonelikler otomatik olarak işaretçi taramayı durdurur. Arka plan taramasını etkinleştirmeyle ilgili ayrıntılar için Arka Planda Tarama bölümüne bakın.

İşaretçilere abone olmak için abonelik parametrelerinde deviceTypesToDiscover parametresini kGNSDeviceBLEBeacon olarak ayarlayın. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
    })

Yukarıdaki abonelik yalnızca projenize ait işaretçileri keşfeder ve bu işaretçilerden gelen tüm mesajları alır. Farklı bir ad alanına kayıtlı işaretçilerden mesaj almak istiyorsanız abonelik parametrelerinde bir ad alanı geçirebilirsiniz. Benzer şekilde, belirli bir mesaj türü istiyorsanız filtreleme için bir mesaj türü de iletebilirsiniz. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.messageNamespace = @"com.mycompany.mybeaconservice";
                              params.type = @"mybeacontype";
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.messageNamespace = "com.mycompany.mybeaconservice"
      params.type = "mybeacontype"
    })

İşaretçi aboneliği varsayılan olarak hem Eddystone hem deiBeacon için tarama yapar. iBeacon taraması etkinleştirildiğinde, kullanıcılardan uygulamanın kendi konum verilerini kullanmaları için izin vermeleri istenir. Uygulamanızın Info.plist özelliği, konumun neden kullanıldığına dair kısa bir açıklamayla birlikte NSLocationWhenInUseUsageDescription anahtarını içermelidir. Ayrıntılar için Apple'ın belgelerine bakın.

Yalnızca Eddystone işaretçilerini taramak istiyorsanız GNSBeaconStrategy içinde iBeacon taramasını devre dışı bırakabilirsiniz. Bu durumda iOS, kullanıcıdan konum kullanımı için izin istemez. Aşağıdaki snippet'te yukarıdaki orijinal abonelik için iBeacon taramasının nasıl devre dışı bırakılacağı gösterilmektedir:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                  };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
          })
    })

Varsayılan olarak düşük güç taraması etkindir ve bu durum, Eddystone işaretçileri bulunurken bazen uzun gecikmelere neden olabilir. Düşük güç modu devre dışı bırakıldığında Eddystone işaretçilerini bulmaya yardımcı olmak için iBeacon taraması kullanılır ve bu gecikmeleri azaltabilir. Ancak bu durum daha fazla pil kullanımına neden olur ve iOS, konum kullanımı için kullanıcıdan izin ister.

Aşağıdaki snippet'te, Eddystone işaretçileri için tarama yapılırken düşük güç modunun nasıl devre dışı bırakılacağı gösterilmektedir.

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.beaconStrategy =
                                  [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                    params.includeIBeacons = NO;
                                    params.lowPowerPreferred = NO;
                                  };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.beaconStrategy =
          GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
            params.includeIBeacons = false
            params.lowPowerPreferred = false
          })
    })

iBeacon'ları tararken, iOS konum izni iletişim kutusunun önünde Yakındaki izin iletişim kutusu görünür. Bu iletişim kutusunu geçersiz kılmak isterseniz (örneğin, konum izninin neden gerekli olduğunu açıklayan bir "ön kontrol" iletişim kutusu sağlamak için) abonelik parametrelerinde permissionRequestHandler özelliğini özel blok olarak ayarlayın. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir:

Objective-C

id<GNSSubscription> beaconSubscription = [messageManager
    subscriptionWithMessageFoundHandler:myMessageFoundHandler
                     messageLostHandler:myMessageLostHandler
                            paramsBlock:^(GNSSubscriptionParams *params) {
                              params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                              params.permissionRequestHandler = ^(GNSPermissionHandler permissionHandler) {
                                // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
                                permissionHandler(userGavePermission);
                              };
                            }];

Swift

let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
    myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
    paramsBlock: { (params: GNSSubscriptionParams!) in
      params.deviceTypesToDiscover = .BLEBeacon
      params.permissionRequestHandler = { (permissionHandler: GNSPermissionHandler!) in
        // Show your custom dialog here, and don't forget to call permissionHandler after it is dismissed
        permissionHandler(userGavePermission);
      }
    })

Arka Planda Tarama

İşaretçi taraması BDE kullandığından arka planda çalışabilir. Arka plan modunu kullanmaya karar verirken aklınızda bulundurmanız gereken bazı noktalar şunlardır:

  • 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, iBeacon taraması etkinleştirilirse veya düşük güç modu devre dışı bırakılırsa kullanıcıdan arka planda konum kullanımı için izin ister.

Arka planda işaretçi taramasını etkinleştirmek için aşağıdaki ek adımları uygulayın:

  • Uygun şekilde yapılandırılmış bir GNSBeaconStrategy nesnesi ileterek aboneliğiniz için arka plan modunu etkinleştirin. Aşağıdaki snippet'te bunun nasıl yapılacağı gösterilmektedir:

    Objective-C

    id<GNSSubscription> beaconSubscription = [messageManager
        subscriptionWithMessageFoundHandler:myMessageFoundHandler
                         messageLostHandler:myMessageLostHandler
                                paramsBlock:^(GNSSubscriptionParams *params) {
                                  params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
                                  params.beaconStrategy = [GNSBeaconStrategy
                                      strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
                                        params.allowInBackground = YES;
                                      }];
                                }];
    

    Swift

    let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
        myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
        paramsBlock: { (params: GNSSubscriptionParams!) in
          params.deviceTypesToDiscover = .BLEBeacon
          params.beaconStrategy =
              GNSBeaconStrategy(paramsBlock: { (params: GNSBeaconStrategyParams!) in
                params.allowInBackground = true
              })
        })
    

  • Gerekli girişleri uygulamanızın Info.plist bölümüne ekleyin:

    • UIBackgroundModes giriş:

      • Arka planda BLE taraması için bluetooth-central.
      • Yüksek güç modunu kullanarak arka planda iBeacon taraması için location. Yalnızca Eddystone işaretçileri için düşük güç taraması yapıyorsanız bunu atlayabilirsiniz.
    • Kullanıcının konumunu neden arka planda izleyeceğinizi açıklayan NSLocationAlwaysUsageDescription dizesi. Örneğin, "Konumunuzun arka planda işaretçileri taraması gerekir." deyin. Ayrıntılar için Apple'ın belgelerine bakın. Yalnızca Eddystone işaretçileri için düşük güç taraması yapıyorsanız bunu atlayabilirsiniz.

  • Kullanıcı, uygulamanızda arka plan taramasını etkinleştirebilir veya devre dışı bırakabilir mi? Öyleyse arka plan modu değerini NSUserDefaults olarak kaydetmelisiniz. Çünkü iOS arka plandayken uygulamanızı her an sonlandırabilir. Uygulamanız şunları yapmalıdır:

    • Arka plan modu değerini kullanıcı her değiştirdiğinde NSUserDefaults değerine kaydedin.
    • Başlatma sırasında bunu NSUserDefaults tarihinden itibaren okuyun ve arka plan modu etkinse işaretçi aboneliğini geri yükleyin.

Arka Plan Bildirimleri

Arka planda çalışırken işaretçiler keşfedildiğinde uygulamanızın kullanıcıya bildirimde bulunmasını istiyorsanız yerel bildirimleri kullanabilirsiniz. Ayrıntılar için arka plan bildirimleri konusuna bakın.