برنامه شما میتواند با استفاده از مکانیزم مشابهی که برای اشتراک پیامهای منتشر شده توسط سایر دستگاههای اطراف استفاده میشود، در پیامهای چراغ کم مصرف بلوتوث (BLE) مشترک شود.
به طور پیشفرض، اشتراکهای beacon فقط زمانی کار میکنند که برنامه شما در پیشزمینه باشد. وقتی برنامه شما به پسزمینه میرود، اشتراکها بهطور خودکار اسکن چراغها را متوقف میکنند. برای جزئیات در مورد نحوه فعال کردن اسکن پسزمینه، به اسکن پسزمینه مراجعه کنید.
برای اشتراک در beacon ها، پارامتر deviceTypesToDiscover
را در پارامترهای اشتراک روی kGNSDeviceBLEBeacon
تنظیم کنید. قطعه زیر نحوه انجام این کار را نشان می دهد:
هدف-C
id<GNSSubscription> beaconSubscription = [messageManager
subscriptionWithMessageFoundHandler:myMessageFoundHandler
messageLostHandler:myMessageLostHandler
paramsBlock:^(GNSSubscriptionParams *params) {
params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
}];
سویفت
let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
paramsBlock: { (params: GNSSubscriptionParams!) in
params.deviceTypesToDiscover = .BLEBeacon
})
اشتراک فوق فقط چراغ های متعلق به پروژه شما را کشف می کند و همه پیام ها را از آن چراغ ها دریافت می کند. اگر میخواهید پیامهایی را از بیکنهایی که با فضای نام دیگری ثبت شدهاند دریافت کنید، میتوانید یک فضای نام را در پارامترهای اشتراک ارسال کنید. به طور مشابه، اگر نوع خاصی از پیام را می خواهید، می توانید یک نوع پیام را نیز برای فیلتر کردن ارسال کنید. قطعه زیر نحوه انجام این کار را نشان می دهد:
هدف-C
id<GNSSubscription> beaconSubscription = [messageManager
subscriptionWithMessageFoundHandler:myMessageFoundHandler
messageLostHandler:myMessageLostHandler
paramsBlock:^(GNSSubscriptionParams *params) {
params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
params.messageNamespace = @"com.mycompany.mybeaconservice";
params.type = @"mybeacontype";
}];
سویفت
let beaconSubscription = messageManager.subscriptionWithMessageFoundHandler(
myMessageFoundHandler, messageLostHandler: myMessageLostHandler,
paramsBlock: { (params: GNSSubscriptionParams!) in
params.deviceTypesToDiscover = .BLEBeacon
params.messageNamespace = "com.mycompany.mybeaconservice"
params.type = "mybeacontype"
})
به طور پیشفرض، اشتراک بیکن هر دو نوع بیکن، Eddystone و iBeacon را اسکن میکند. هنگامی که اسکن iBeacon فعال است، از کاربران خواسته می شود تا به برنامه اجازه دهند تا از داده های موقعیت مکانی خود استفاده کند. Info.plist
برنامه شما باید شامل کلید NSLocationWhenInUseUsageDescription
با توضیح کوتاه در مورد دلیل استفاده از موقعیت مکانی باشد. برای جزئیات بیشتر به مستندات اپل مراجعه کنید.
اگر میخواهید فقط برای چراغهای Eddystone اسکن کنید، میتوانید اسکن iBeacon را در GNSBeaconStrategy
غیرفعال کنید و iOS از کاربر اجازه استفاده از موقعیت مکانی را نمیخواهد. قطعه زیر نحوه غیرفعال کردن اسکن iBeacon را برای اشتراک اصلی بالا نشان می دهد:
هدف-C
id<GNSSubscription> beaconSubscription = [messageManager
subscriptionWithMessageFoundHandler:myMessageFoundHandler
messageLostHandler:myMessageLostHandler
paramsBlock:^(GNSSubscriptionParams *params) {
params.deviceTypesToDiscover = kGNSDeviceBLEBeacon;
params.beaconStrategy =
[GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) {
params.includeIBeacons = NO;
};
}];
سویفت
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 برای کمک به یافتن چراغهای ادیستون استفاده میشود که میتواند این تأخیرها را کاهش دهد. با این حال، این منجر به مصرف باتری بیشتر می شود و iOS از کاربر برای استفاده از موقعیت مکانی اجازه می خواهد.
قطعه زیر نحوه غیرفعال کردن حالت کم مصرف را هنگام اسکن برای بیکن های Eddystone نشان می دهد.
هدف-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;
};
}];
سویفت
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
را روی یک بلوک سفارشی در پارامترهای اشتراک تنظیم کنید. قطعه زیر نحوه انجام این کار را نشان می دهد:
هدف-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);
};
}];
سویفت
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 پس زمینه وجود دارد. هزینه کم است، اما قبل از تصمیم به استفاده از حالت پسزمینه، باید آن را اندازه بگیرید.
- اگر اسکن iBeacon فعال باشد یا حالت کم مصرف غیرفعال باشد، iOS از کاربر اجازه میخواهد از موقعیت مکانی در پسزمینه استفاده کند.
برای فعال کردن اسکن چراغ در پسزمینه، این مراحل اضافی را دنبال کنید:
با ارسال یک شی
GNSBeaconStrategy
که به درستی پیکربندی شده است، حالت پس زمینه را برای اشتراک خود فعال کنید. قطعه زیر نحوه انجام این کار را نشان می دهد:هدف-C
id<GNSSubscription> beaconSubscription = [messageManager subscriptionWithMessageFoundHandler:myMessageFoundHandler messageLostHandler:myMessageLostHandler paramsBlock:^(GNSSubscriptionParams *params) { params.deviceTypesToDiscover = kGNSDeviceBLEBeacon; params.beaconStrategy = [GNSBeaconStrategy strategyWithParamsBlock:^(GNSBeaconStrategyParams *params) { params.allowInBackground = YES; }]; }];
سویفت
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 اسکن کم مصرف انجام می دهید، می توانید این مورد را حذف کنید.
-
رشته
NSLocationAlwaysUsageDescription
توضیح می دهد که چرا مکان کاربر را در پس زمینه ردیابی خواهید کرد. به عنوان مثال، "موقعیت مکانی شما برای اسکن چراغهای در پسزمینه مورد نیاز است." برای جزئیات بیشتر به مستندات اپل مراجعه کنید. اگر فقط برای چراغ های Eddystone اسکن کم مصرف انجام می دهید، می توانید این مورد را حذف کنید.
آیا کاربر می تواند اسکن پس زمینه را در برنامه شما فعال یا غیرفعال کند؟ اگر چنین است، باید مقدار حالت پسزمینه را در
NSUserDefaults
ذخیره کنید، زیرا iOS میتواند برنامه شما را در هر زمانی که در پسزمینه است، بکشد. برنامه شما باید کارهای زیر را انجام دهد:- هر زمان که کاربر آن را تغییر داد، مقدار حالت پسزمینه را در
NSUserDefaults
ذخیره کنید. - هنگام راهاندازی، آن را از
NSUserDefaults
بخوانید و اگر حالت پسزمینه فعال است، اشتراک beacon را بازیابی کنید.
- هر زمان که کاربر آن را تغییر داد، مقدار حالت پسزمینه را در
اطلاعیه های پس زمینه
اگر میخواهید برنامهتان در پسزمینه هنگام کشف چراغها به کاربر اطلاع دهد، میتوانید از اعلانهای محلی استفاده کنید. برای جزئیات، اعلانهای پسزمینه را ببینید.