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