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