پیام های Beacon را دریافت کنید

برنامه شما می‌تواند با استفاده از همان مکانیزمی که برای اشتراک در پیام‌های منتشر شده توسط سایر دستگاه‌های مجاور استفاده می‌شود، در پیام‌های بیکن بلوتوث کم‌مصرف (BLE) مشترک شود.

به طور پیش‌فرض، اشتراک‌های بیکن فقط زمانی کار می‌کنند که برنامه شما در پیش‌زمینه باشد. وقتی برنامه شما به پس‌زمینه می‌رود، اشتراک‌ها به طور خودکار اسکن بیکن‌ها را متوقف می‌کنند. برای جزئیات بیشتر در مورد نحوه فعال کردن اسکن پس‌زمینه، به بخش «اسکن پس‌زمینه» مراجعه کنید.

برای اشتراک در beaconها، پارامتر deviceTypesToDiscover را در پارامترهای اشتراک روی kGNSDeviceBLEBeacon تنظیم کنید. قطعه کد زیر نحوه انجام این کار را نشان می‌دهد:

هدف-سی

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

سویفت

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

اشتراک فوق فقط بیکن‌های متعلق به پروژه شما را کشف می‌کند و تمام پیام‌های آن بیکن‌ها را دریافت می‌کند. اگر می‌خواهید پیام‌هایی از بیکن‌های ثبت‌شده با فضای نام دیگری دریافت کنید، می‌توانید یک فضای نام را در پارامترهای اشتراک ارسال کنید. به طور مشابه، اگر نوع خاصی از پیام را می‌خواهید، می‌توانید یک نوع پیام را نیز برای فیلتر کردن ارسال کنید. قطعه کد زیر نحوه انجام این کار را نشان می‌دهد:

هدف-سی

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

سویفت

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

به طور پیش‌فرض، یک اشتراک بیکن، هر دو نوع بیکن، Eddystone و iBeacon را اسکن می‌کند. وقتی اسکن iBeacon فعال باشد، از کاربران خواسته می‌شود که به برنامه اجازه دهند از داده‌های موقعیت مکانی آنها استفاده کند. Info.plist برنامه شما باید شامل کلید NSLocationWhenInUseUsageDescription به همراه توضیح کوتاهی در مورد دلیل استفاده از موقعیت مکانی باشد. برای جزئیات بیشتر به مستندات اپل مراجعه کنید.

اگر می‌خواهید فقط برای بیکن‌های Eddystone اسکن کنید، می‌توانید اسکن iBeacon را در GNSBeaconStrategy غیرفعال کنید و iOS از کاربر برای استفاده از موقعیت مکانی اجازه نمی‌گیرد. قطعه کد زیر نحوه غیرفعال کردن اسکن iBeacon را برای اشتراک اصلی بالا نشان می‌دهد:

هدف-سی

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

سویفت

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

به طور پیش‌فرض، اسکن کم‌مصرف فعال است که گاهی اوقات می‌تواند منجر به تأخیرهای زیادی هنگام یافتن بیکن‌های Eddystone شود. وقتی حالت کم‌مصرف غیرفعال است، از اسکن iBeacon برای کمک به یافتن بیکن‌های Eddystone استفاده می‌شود که می‌تواند این تأخیرها را کاهش دهد. با این حال، این امر منجر به مصرف بیشتر باتری می‌شود و iOS از کاربر برای استفاده از موقعیت مکانی اجازه می‌گیرد.

قطعه کد زیر نحوه غیرفعال کردن حالت کم‌مصرف هنگام اسکن بیکن‌های Eddystone را نشان می‌دهد.

هدف-سی

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;
                                  };
                            }];

سویفت

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

هنگام اسکن iBeacons، قبل از پنجره‌ی مجوز موقعیت مکانی iOS، پنجره‌ی مجوز Nearby نمایش داده می‌شود. اگر می‌خواهید این پنجره را لغو کنید (برای مثال، یک پنجره‌ی "preflight" ارائه دهید که توضیح دهد چرا مجوز موقعیت مکانی مورد نیاز است)، permissionRequestHandler را در پارامترهای اشتراک روی یک بلوک سفارشی تنظیم کنید. قطعه کد زیر نحوه‌ی انجام این کار را نشان می‌دهد:

هدف-سی

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

سویفت

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

اسکن پس‌زمینه

از آنجایی که اسکن بیکن از BLE استفاده می‌کند، می‌تواند در پس‌زمینه کار کند. در اینجا نکاتی وجود دارد که هنگام تصمیم‌گیری برای استفاده از حالت پس‌زمینه باید از آنها آگاه باشید:

  • استفاده از حالت BLE در پس‌زمینه هزینه باتری بیشتری دارد. هزینه آن کم است، اما قبل از تصمیم‌گیری برای استفاده از حالت پس‌زمینه، باید آن را اندازه‌گیری کنید.
  • اگر اسکن iBeacon فعال باشد یا حالت کم‌مصرف غیرفعال باشد، iOS از کاربر اجازه استفاده از موقعیت مکانی در پس‌زمینه را درخواست می‌کند.

برای فعال کردن اسکن بیکن در پس‌زمینه، این مراحل اضافی را دنبال کنید:

  • با ارسال یک شیء GNSBeaconStrategy که به درستی پیکربندی شده باشد، حالت پس‌زمینه را برای اشتراک خود فعال کنید. قطعه کد زیر نحوه انجام این کار را نشان می‌دهد:

    هدف-سی

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

    سویفت

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

  • ورودی‌های مورد نیاز را به Info.plist برنامه خود اضافه کنید:

    • ورودی‌های UIBackgroundModes :

      • bluetooth-central برای اسکن BLE در پس‌زمینه.
      • location اسکن iBeacon در پس‌زمینه با استفاده از حالت پرقدرت. اگر فقط اسکن کم‌قدرت را برای بیکن‌های Eddystone انجام می‌دهید، می‌توانید این مورد را حذف کنید.
    • رشته NSLocationAlwaysUsageDescription که توضیح می‌دهد چرا شما موقعیت مکانی کاربر را در پس‌زمینه ردیابی خواهید کرد. برای مثال، "موقعیت مکانی شما برای اسکن بیکن‌ها در پس‌زمینه مورد نیاز است." برای جزئیات بیشتر به مستندات اپل مراجعه کنید. اگر فقط برای بیکن‌های Eddystone اسکن کم‌مصرف انجام می‌دهید، می‌توانید این را حذف کنید.

  • آیا کاربر می‌تواند اسکن پس‌زمینه را در برنامه شما فعال یا غیرفعال کند؟ در این صورت، باید مقدار حالت پس‌زمینه را در NSUserDefaults ذخیره کنید زیرا iOS می‌تواند برنامه شما را در هر زمانی که در پس‌زمینه است، از بین ببرد. برنامه شما باید موارد زیر را انجام دهد:

    • هر زمان که کاربر مقدار حالت پس‌زمینه را تغییر دهد، آن را در NSUserDefaults ذخیره می‌کند.
    • در هنگام راه‌اندازی، آن را از NSUserDefaults بخوانید و اگر حالت پس‌زمینه فعال است، اشتراک beacon را بازیابی کنید.

اعلان‌های پس‌زمینه

اگر می‌خواهید برنامه شما در هنگام کشف بیکن‌ها در پس‌زمینه به کاربر اطلاع دهد، می‌توانید از اعلان‌های محلی استفاده کنید. برای جزئیات بیشتر، به اعلان‌های پس‌زمینه مراجعه کنید.