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

يمكن لتطبيقك الاشتراك في رسائل الإشارات منخفضة الطاقة للبلوتوث (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 فقط، يمكنك إيقاف ميزة GNSBeaconStrategy في iBeacon، ولن يطلب نظام التشغيل 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 من العميل منح الإذن لاستخدام الموقع الجغرافي.

يوضّح المقتطف التالي كيفية إيقاف وضع الطاقة المنخفضة عند البحث عن beacons في 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، يمكنها العمل في الخلفية. في ما يلي بعض النقاط التي يجب أخذها في الاعتبار عند اتخاذ قرار استخدام وضع "الخلفية":

  • هناك تكلفة إضافية للبطارية عند استخدام تقنية 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 للبحث عن الأجهزة التي تتضمّن بلوتوث منخفض الطاقة في الخلفية
      • location للبحث عن أجهزة iBeacon في الخلفية باستخدام وضع "استخدام الطاقة العالية" يمكنك حذف هذا الخيار إذا كنت تُجري عملية مسح ضوئيًا بطاقة منخفضة لأجهزة إشارات Eddystone فقط.
    • NSLocationAlwaysUsageDescription سلسلة تصف سبب تتبُّع موقع المستخدم الجغرافي في الخلفية على سبيل المثال، "يُرجى تفعيل إذن الوصول إلى الموقع الجغرافي للبحث عن إشارات في الخلفية". اطّلِع على مستندات Apple لمعرفة التفاصيل. يمكنك حذف هذا الخيار إذا كنت تجري عملية مسح ضوئيًا بطاقة منخفضة الطاقة لرصد beacons في Eddystone فقط.

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

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

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

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