برنامه شما میتواند با استفاده از همان مکانیزمی که برای اشتراک در پیامهای منتشر شده توسط سایر دستگاههای مجاور استفاده میشود، در پیامهای بیکن بلوتوث کممصرف (BLE) مشترک شود.
به طور پیشفرض، اشتراکهای بیکن فقط زمانی کار میکنند که برنامه شما در پیشزمینه باشد. وقتی برنامه شما به پسزمینه میرود، اشتراکها به طور خودکار اسکن بیکنها را متوقف میکنند. برای جزئیات بیشتر در مورد نحوه فعال کردن اسکن پسزمینه، به بخش «اسکن پسزمینه» مراجعه کنید.
برای اشتراک در beaconها، پارامتر deviceTypesToDiscover را در پارامترهای اشتراک روی kGNSDeviceBLEBeacon تنظیم کنید. قطعه کد زیر نحوه انجام این کار را نشان میدهد:
هدف-سی
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
})
اشتراک فوق فقط بیکنهای متعلق به پروژه شما را کشف میکند و تمام پیامهای آن بیکنها را دریافت میکند. اگر میخواهید پیامهایی از بیکنهای ثبتشده با فضای نام دیگری دریافت کنید، میتوانید یک فضای نام را در پارامترهای اشتراک ارسال کنید. به طور مشابه، اگر نوع خاصی از پیام را میخواهید، میتوانید یک نوع پیام را نیز برای فیلتر کردن ارسال کنید. قطعه کد زیر نحوه انجام این کار را نشان میدهد:
هدف-سی
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 را برای اشتراک اصلی بالا نشان میدهد:
هدف-سی
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 برای کمک به یافتن بیکنهای Eddystone استفاده میشود که میتواند این تأخیرها را کاهش دهد. با این حال، این امر منجر به مصرف بیشتر باتری میشود و iOS از کاربر برای استفاده از موقعیت مکانی اجازه میگیرد.
قطعه کد زیر نحوه غیرفعال کردن حالت کممصرف هنگام اسکن بیکنهای Eddystone را نشان میدهد.
هدف-سی
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 نمایش داده میشود. اگر میخواهید این پنجره را لغو کنید (برای مثال، یک پنجرهی "preflight" ارائه دهید که توضیح دهد چرا مجوز موقعیت مکانی مورد نیاز است)، permissionRequestHandler را در پارامترهای اشتراک روی یک بلوک سفارشی تنظیم کنید. قطعه کد زیر نحوهی انجام این کار را نشان میدهد:
هدف-سی
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که به درستی پیکربندی شده باشد، حالت پسزمینه را برای اشتراک خود فعال کنید. قطعه کد زیر نحوه انجام این کار را نشان میدهد:هدف-سی
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 را بازیابی کنید.
- هر زمان که کاربر مقدار حالت پسزمینه را تغییر دهد، آن را در
اعلانهای پسزمینه
اگر میخواهید برنامه شما در هنگام کشف بیکنها در پسزمینه به کاربر اطلاع دهد، میتوانید از اعلانهای محلی استفاده کنید. برای جزئیات بیشتر، به اعلانهای پسزمینه مراجعه کنید.