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

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

عند البحث عن أجهزة 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 واستعادة المرشد. الاشتراك في حال تفعيل وضع الخلفية.

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

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