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

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

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

המינוי שלמעלה מזהה רק משׂואות רשת (beacon) שבבעלות הפרויקט שלך, ומקבל כל ההודעות מהמשׂואות רשת (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"
    })

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

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

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

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

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

התראות ברקע

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