الحصول على رسائل المرشد

يمكن لتطبيقك الاشتراك في رسائل إشارات منخفضة الطاقة للبلوتوث (BLE) باستخدام الآلية نفسها المستخدَمة للاشتراك في الرسائل التي تنشرها الأجهزة الأخرى المجاورة.

لا تعمل الاشتراكات في إشارات البلوتوث تلقائيًا إلا عندما يكون تطبيقك في المقدّمة. عندما ينتقل تطبيقك إلى الخلفية، تتوقف الاشتراكات تلقائيًا عن البحث عن إشارات البلوتوث. راجِع مقالة البحث في الخلفية لمعرفة تفاصيل حول كيفية تفعيل ميزة "البحث في الخلفية".

للاشتراك في إشعارات الأجهزة القريبة، اضبط المَعلمة deviceTypesToDiscover على kGNSDeviceBLEBeacon في مَعلمات الاشتراك. يوضّح المقتطف التالي كيفية إجراء ذلك:

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

لا يكتشف الاشتراك أعلاه سوى إشارات البلوتوث التي يملكها مشروعك، ويتلقّى جميع الرسائل من هذه الإشارات. إذا كنت تريد تلقّي رسائل من أجهزة Beacon مسجّلة في مساحة اسم مختلفة، يمكنك تمرير مساحة اسم في مَعلمات الاشتراك. وبالمثل، إذا كنت تريد نوعًا معيّنًا من الرسائل، يمكنك أيضًا تمرير نوع الرسالة للفلترة. يوضّح المقتطف التالي كيفية إجراء ذلك:

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

تتضمّن عملية فحص الاشتراك في أجهزة الإرسال تلقائيًا كلا النوعين من أجهزة الإرسال، وهما Eddystone وiBeacon. عند تفعيل عملية البحث عن أجهزة iBeacon، سيُطلب من المستخدمين منح التطبيق إذنًا باستخدام بيانات الموقع الجغرافي. يجب أن يتضمّن Info.plist لتطبيقك المفتاح NSLocationWhenInUseUsageDescription مع شرح موجز لسبب استخدام الموقع الجغرافي. لمزيد من التفاصيل، يُرجى الاطّلاع على مستندات Apple.

إذا كنت تريد البحث عن إشارات Eddystone فقط، يمكنك إيقاف البحث عن إشارات iBeacon في GNSBeaconStrategy، ولن يطلب نظام التشغيل iOS من المستخدم الإذن باستخدام الموقع الجغرافي. يوضّح المقتطف التالي كيفية إيقاف عملية البحث عن إشارات iBeacon للاشتراك الأصلي المذكور أعلاه:

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

يتم تلقائيًا تفعيل ميزة البحث عن الأجهزة التي تعمل بطاقة منخفضة، ما قد يؤدي أحيانًا إلى حدوث تأخيرات كبيرة عند العثور على إشارات Eddystone. عند إيقاف &quot;وضع الطاقة المنخفضة&quot;، يتم استخدام البحث عن iBeacon للمساعدة في العثور على إشارات Eddystone، ما قد يؤدي إلى تقليل حالات التأخير هذه. ومع ذلك، يؤدي ذلك إلى زيادة استهلاك البطارية، وسيطلب نظام التشغيل iOS من المستخدم الإذن باستخدام الموقع الجغرافي.

يوضّح المقتطف التالي كيفية إيقاف &quot;وضع الطاقة المنخفضة&quot; عند البحث عن إشارات Eddystone.

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، يسبق مربّع حوار إذن تحديد الموقع الجغرافي على نظام التشغيل iOS مربّع حوار إذن "الأجهزة القريبة". إذا أردت إلغاء مربع الحوار هذا (على سبيل المثال، لتقديم مربع حوار "فحص أولي" يوضّح سبب الحاجة إلى إذن تحديد الموقع الجغرافي)، اضبط permissionRequestHandler على كتلة مخصّصة في مَعلمات الاشتراك. يوضّح المقتطف التالي كيفية إجراء ذلك:

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

البحث في الخلفية

بما أنّ عملية البحث عن إشارات البلوتوث تستخدم تقنية البلوتوث المنخفض الطاقة (BLE)، يمكن أن تعمل في الخلفية. في ما يلي بعض الأمور التي يجب مراعاتها عند اتّخاذ قرار بشأن استخدام وضع الخلفية:

  • هناك تكلفة إضافية للبطارية عند استخدام تقنية البلوتوث المنخفض الطاقة في الخلفية. التكلفة منخفضة، ولكن عليك قياسها قبل اتخاذ قرار بشأن استخدام وضع الخلفية.
  • سيطلب نظام التشغيل iOS من المستخدم الإذن باستخدام الموقع الجغرافي في الخلفية في حال تفعيل عملية البحث عن إشارات iBeacon أو إيقاف وضع "استخدام الطاقة المنخفض".

لتفعيل ميزة البحث عن إشارات البلوتوث في الخلفية، اتّبِع الخطوات الإضافية التالية:

  • فعِّل وضع الخلفية لاشتراكك من خلال تمرير عنصر GNSBeaconStrategy تم إعداده بشكل صحيح. يوضّح المقتطف التالي كيفية إجراء ذلك:

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

  • أضِف الإدخالات المطلوبة إلى Info.plist لتطبيقك:

    • UIBackgroundModes إدخال:

      • bluetooth-central للبحث عن أجهزة BLE في الخلفية
      • location للبحث عن أجهزة iBeacon في الخلفية باستخدام وضع الطاقة العالية يمكنك حذف هذا الحقل إذا كنت تجري عملية مسح ضوئي منخفضة الطاقة لإشارات Eddystone فقط.
    • NSLocationAlwaysUsageDescription سلسلة تصف سبب تتبُّعك للموقع الجغرافي للمستخدم في الخلفية. على سبيل المثال، "نحتاج إلى معرفة موقعك الجغرافي لإجراء عمليات بحث عن إشارات البلوتوث في الخلفية". لمزيد من التفاصيل، يُرجى الاطّلاع على مستندات Apple. يمكنك حذف هذا الحقل إذا كنت تجري عملية فحص منخفضة الطاقة لإشارات Eddystone فقط.

  • هل يمكن للمستخدم تفعيل ميزة البحث في الخلفية أو إيقافها في تطبيقك؟ في هذه الحالة، عليك حفظ قيمة وضع الخلفية في NSUserDefaults لأنّ نظام التشغيل iOS يمكنه إيقاف تطبيقك في أي وقت أثناء تشغيله في الخلفية. يجب أن يلتزم تطبيقك بما يلي:

    • احفظ قيمة وضع الخلفية في NSUserDefaults كلما غيّرها المستخدم.
    • عند بدء التشغيل، يتم قراءة هذا الإعداد من NSUserDefaults واستعادة اشتراك Beacon إذا كان وضع الخلفية مفعّلاً.

الإشعارات في الخلفية

إذا أردت أن يرسل تطبيقك إشعارًا إلى المستخدم عند رصد إشارات البلوتوث المنخفض الطاقة أثناء تشغيل التطبيق في الخلفية، يمكنك استخدام الإشعارات المحلية. لمعرفة التفاصيل، يُرجى الاطّلاع على الإشعارات في الخلفية.