আপনার অ্যাপটি ব্লুটুথ লো এনার্জি (BLE) বীকন বার্তাগুলিতে সাবস্ক্রাইব করতে পারে, একই পদ্ধতি ব্যবহার করে যা অন্যান্য কাছাকাছি ডিভাইস দ্বারা প্রকাশিত বার্তাগুলিতে সাবস্ক্রাইব করতে ব্যবহৃত হয়।
ডিফল্টরূপে, বীকন সাবস্ক্রিপশনগুলি কেবল তখনই কাজ করে যখন আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকে। যখন আপনার অ্যাপটি ব্যাকগ্রাউন্ডে যায়, তখন সাবস্ক্রিপশনগুলি স্বয়ংক্রিয়ভাবে বীকনের জন্য স্ক্যান করা বন্ধ করে দেয়। ব্যাকগ্রাউন্ড স্ক্যানিং কীভাবে সক্ষম করবেন সে সম্পর্কে বিস্তারিত জানতে ব্যাকগ্রাউন্ড স্ক্যানিং দেখুন।
বীকন সাবস্ক্রাইব করতে, সাবস্ক্রিপশন প্যারামিটারে 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"
})
ডিফল্টরূপে, একটি বীকন সাবস্ক্রিপশন এডিস্টোন এবং আইবিকন উভয় ধরণের বীকনের জন্য স্ক্যান করে। আইবিকন স্ক্যানিং সক্ষম করা হলে, ব্যবহারকারীদের অ্যাপটিকে তাদের অবস্থানের ডেটা ব্যবহারের অনুমতি দেওয়ার জন্য অনুরোধ করা হবে। আপনার অ্যাপের Info.plist এ NSLocationWhenInUseUsageDescription কী থাকতে হবে এবং কেন অবস্থান ব্যবহার করা হচ্ছে তার সংক্ষিপ্ত ব্যাখ্যা থাকতে হবে। বিস্তারিত জানার জন্য অ্যাপলের ডকুমেন্টেশন দেখুন।
যদি আপনি শুধুমাত্র এডিস্টোন বীকনগুলির জন্য স্ক্যান করতে চান, তাহলে আপনি GNSBeaconStrategy তে iBeacon স্ক্যানিং অক্ষম করতে পারেন, এবং 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
})
})
ডিফল্টরূপে, কম শক্তির স্ক্যানিং সক্ষম থাকে, যার ফলে কখনও কখনও এডিস্টোন বীকন খুঁজে বের করার সময় বড় ধরণের বিলম্ব হতে পারে। যখন কম শক্তির মোড অক্ষম থাকে, তখন এডিস্টোন বীকন খুঁজে পেতে সাহায্য করার জন্য iBeacon স্ক্যানিং ব্যবহার করা হয়, যা এই বিলম্ব কমাতে পারে। তবে, এর ফলে ব্যাটারির ব্যবহার বেশি হয় এবং iOS ব্যবহারকারীর কাছে লোকেশন ব্যবহারের অনুমতি চাইবে।
এডিস্টোন বীকন স্ক্যান করার সময় লো পাওয়ার মোড কীভাবে অক্ষম করবেন তা নিম্নলিখিত স্নিপেটে দেখানো হয়েছে।
অবজেক্টিভ-সি
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 কে একটি কাস্টম ব্লকে সেট করুন। নিম্নলিখিত স্নিপেটটি এটি কীভাবে করবেন তা দেখায়:
অবজেক্টিভ-সি
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এন্ট্রি:- ব্যাকগ্রাউন্ডে BLE স্ক্যানিংয়ের জন্য
bluetooth-central। - হাই-পাওয়ার মোড ব্যবহার করে ব্যাকগ্রাউন্ডে iBeacon স্ক্যানিংয়ের জন্য
location। আপনি যদি শুধুমাত্র এডিস্টোন বীকনের জন্য কম পাওয়ার স্ক্যানিং করেন তবে এটি বাদ দিতে পারেন।
- ব্যাকগ্রাউন্ডে BLE স্ক্যানিংয়ের জন্য
NSLocationAlwaysUsageDescriptionস্ট্রিংটি বর্ণনা করে যে কেন আপনি ব্যাকগ্রাউন্ডে ব্যবহারকারীর অবস্থান ট্র্যাক করবেন। উদাহরণস্বরূপ, "ব্যাকগ্রাউন্ডে বীকন স্ক্যান করার জন্য আপনার অবস্থান প্রয়োজন।" বিস্তারিত জানার জন্য অ্যাপলের ডকুমেন্টেশন দেখুন। আপনি যদি শুধুমাত্র এডিস্টোন বীকনের জন্য কম পাওয়ার স্ক্যানিং করেন তবে আপনি এটি বাদ দিতে পারেন।
ব্যবহারকারী কি আপনার অ্যাপে ব্যাকগ্রাউন্ড স্ক্যানিং সক্ষম বা অক্ষম করতে পারবেন? যদি তাই হয়, তাহলে আপনার ব্যাকগ্রাউন্ড মোড মানটি
NSUserDefaultsএ সংরক্ষণ করা উচিত কারণ iOS আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন যেকোনো সময় বন্ধ করে দিতে পারে। আপনার অ্যাপটি নিম্নলিখিত কাজগুলি করবে:- ব্যবহারকারী যখনই ব্যাকগ্রাউন্ড মোড মান পরিবর্তন করবেন তখনই
NSUserDefaultsএ সংরক্ষণ করুন। - শুরুতে,
NSUserDefaultsথেকে এটি পড়ুন এবং ব্যাকগ্রাউন্ড মোড সক্রিয় থাকলে বীকন সাবস্ক্রিপশন পুনরুদ্ধার করুন।
- ব্যবহারকারী যখনই ব্যাকগ্রাউন্ড মোড মান পরিবর্তন করবেন তখনই
পটভূমি বিজ্ঞপ্তি
যদি আপনি চান যে আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন বীকন আবিষ্কৃত হলে ব্যবহারকারীকে অবহিত করুক, তাহলে আপনি স্থানীয় বিজ্ঞপ্তি ব্যবহার করতে পারেন। বিস্তারিত জানার জন্য, ব্যাকগ্রাউন্ড বিজ্ঞপ্তি দেখুন।