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