קבלת הודעות ב-Beacon

האפליקציה יכולה להירשם להודעות איתות Bluetooth עם צריכת אנרגיה נמוכה (BLE), באמצעות אותו מנגנון שמשמש להרשמה להודעות שמתפרסמות על ידי מכשירים אחרים בקרבת מקום.

כברירת מחדל, מינויים לאיתות Bluetooth פועלים רק כשהאפליקציה פועלת בחזית. כשהאפליקציה עוברת לרקע, סריקת המינויים נפסקת אוטומטית לאיתור איתותי Bluetooth. ראו סריקה ברקע לפרטים על הפעלה של סריקת רקע.

כדי להירשם ל-beacons, צריך להגדיר את הפרמטר 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
    })

המינוי שלמעלה מאתר רק איתות Bluetooth שנמצא בבעלות הפרויקט שלכם, ומקבל את כל ההודעות מהם. אם אתם רוצים לקבל הודעות מאותות שרשומים במרחב שמות אחר, תוכלו להעביר מרחב שמות בפרמטרים של המינוי. באופן דומה, אם רוצים סוג ספציפי של הודעה, אפשר גם להעביר סוג הודעה לצורך סינון. קטע הקוד הבא מראה איך לעשות זאת:

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

כברירת מחדל, מינוי למשׂואות רשת (beacon) מחפש את שני סוגי איתות Bluetooth, גם Eddystone ו-iBeacon. כשסריקת iBeacon מופעלת, המשתמשים יתבקשו לתת לאפליקציה הרשאה להשתמש בנתוני המיקום שלהם. ה-Info.plist של האפליקציה חייב לכלול את המפתח NSLocationWhenInUseUsageDescription עם הסבר קצר למה נעשה שימוש במיקום. פרטים נוספים זמינים במסמכי התיעוד של Apple.

אם רוצים לסרוק רק משׂואות רשת (beacon) של 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
          })
    })

כברירת מחדל, סריקה של צריכת חשמל נמוכה מופעלת, דבר שעלול לגרום לפעמים ליחסי גובה-רוחב גדולים כשמוצאים משׂואות רשת (beacon) של Eddystone. כשמצב צריכת חשמל נמוכה מושבת, סריקת iBeacon משמשת לאיתור משׂואות רשת (beacon) של Eddystone, שיכולות לצמצם את מערכי הזמן האלה. עם זאת, התוצאה היא שימוש מוגבר בסוללה, ומערכת iOS תבקש מהמשתמש הרשאת גישה למיקום.

קטע הקוד הבא מראה איך להשבית מצב צריכת חשמל נמוכה כשמחפשים משׂואות רשת (beacon) של 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 תיבת הדו-שיח של ההרשאה Nearby. אם רוצים לבטל את תיבת הדו-שיח הזו (לצורך מכונה, כדי להציג תיבת דו-שיח לפני ההפעלה שתסביר למה צריך הרשאת מיקום), צריך להגדיר את 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);
      }
    })

סריקה ברקע

סריקת איתות Bluetooth משתמשת ב-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 ברקע באמצעות מצב צריכת חשמל גבוהה. אפשר להשמיט את זה אם מבצעים סריקה של צריכת חשמל נמוכה במשׂואות רשת (beacon) של Eddystone בלבד.
    • מחרוזת NSLocationAlwaysUsageDescription שמתארת למה אתם עוקבים ברקע אחרי מיקום המשתמש. לדוגמה, "צריך לבצע סריקה כדי לאתר איתותי Bluetooth ברקע". פרטים נוספים זמינים במסמכי התיעוד של Apple. אפשר להשמיט את זה אם מחפשים רק משׂואות רשת (beacons) של Eddystone, בסריקה של צריכת חשמל נמוכה.

  • האם המשתמש יכול להפעיל או להשבית סריקה ברקע באפליקציה שלך? אם כן, יש לשמור את הערך של מצב הרקע ב-NSUserDefaults כי מערכת iOS עלולה לסגור את האפליקציה בכל שלב כשהיא פועלת ברקע. האפליקציה שלכם צריכה לבצע את הפעולות הבאות:

    • שומרים את הערך של מצב הרקע ב-NSUserDefaults בכל פעם שהמשתמש משנה אותו.
    • במהלך ההפעלה, צריך לקרוא את המידע מ-NSUserDefaults ולשחזר את המינוי לאיתות Bluetooth אם מצב הרקע מופעל.

התראות ברקע

אם רוצים שהאפליקציה תיידע את המשתמש כשיתגלו איתותי Bluetooth בזמן שמתבצעת ברקע, אפשר להשתמש בהתראות מקומיות. מידע נוסף מופיע במאמר התראות ברקע.