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

يمكن لتطبيقك الاشتراك في رسائل إشارات البلوتوث المنخفض الطاقة (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
    })

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

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. عند إيقاف وضع الطاقة المنخفضة، يتم استخدام فحص iBeacon للمساعدة في العثور على إشارات Eddystone التي يمكنها تقليل أوقات الاستجابة هذه. ومع ذلك، يؤدي هذا إلى زيادة استهلاك البطارية، وسيطلب iOS من المستخدم الإذن لاستخدام الموقع الجغرافي.

يوضح المقتطف التالي كيفية إيقاف وضع الطاقة المنخفضة عند البحث عن إشارات 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
          })
    })

عند البحث عن iBeacons، يسبق مربع حوار إذن تحديد الموقع الجغرافي في نظام التشغيل 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، يمكن أن يعمل في الخلفية. إليك بعض الأشياء التي يجب أن تكون على دراية بها عند اتخاذ قرار باستخدام وضع الخلفية:

  • ستفرض تكلفة إضافية على البطارية عند استخدام تقنية 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 واستعادة اشتراك المرشد إذا كان وضع الخلفية مفعَّلاً.

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

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