האפליקציה יכולה להירשם להודעות איתות 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 בזמן שמתבצעת ברקע, אפשר להשתמש בהתראות מקומיות. מידע נוסף מופיע במאמר התראות ברקע.