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

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

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

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

هدف-C

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

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

هدف-C

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 را برای اشتراک اصلی بالا نشان می دهد:

هدف-C

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 برای کمک به یافتن چراغ‌های ادیستون استفاده می‌شود که می‌تواند این تأخیرها را کاهش دهد. با این حال، این منجر به مصرف باتری بیشتر می شود و iOS از کاربر برای استفاده از موقعیت مکانی اجازه می خواهد.

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

هدف-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;
                                  };
                            }];

سویفت

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 قرار می گیرد. اگر می‌خواهید این گفتگو را لغو کنید (به عنوان مثال، برای ارائه یک گفتگوی "پیش از پرواز" که توضیح می‌دهد چرا به مجوز مکان نیاز است)، permissionRequestHandler را روی یک بلوک سفارشی در پارامترهای اشتراک تنظیم کنید. قطعه زیر نحوه انجام این کار را نشان می دهد:

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

سویفت

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 که به درستی پیکربندی شده است، حالت پس زمینه را برای اشتراک خود فعال کنید. قطعه زیر نحوه انجام این کار را نشان می دهد:

    هدف-C

    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 را بازیابی کنید.

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

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