Ứng dụng của bạn có thể đăng ký thông báo báo hiệu qua Bluetooth năng lượng thấp (BLE) sử dụng chính cơ chế được dùng để đăng ký nhận thông báo được đăng bởi các thiết bị lân cận khác.
Theo mặc định, gói thuê bao beacon chỉ hoạt động khi ứng dụng của bạn chạy ở nền trước. Khi ứng dụng của bạn chuyển sang chạy trong nền, các gói thuê bao sẽ tự động dừng quét tìm beacon. Xem bài viết Quét nền để biết thông tin chi tiết về cách bật tính năng quét trong nền.
Để đăng ký beacon, hãy đặt tham số deviceTypesToDiscover
thành
kGNSDeviceBLEBeacon
trong thông số gói thuê bao. Đoạn mã sau
minh hoạ cách thực hiện việc này:
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
})
Gói thuê bao nêu trên chỉ phát hiện các beacon thuộc sở hữu của dự án của bạn và nhận tất cả tin nhắn từ các beacon đó. Nếu bạn muốn nhận tin nhắn từ beacon được đăng ký với một không gian tên khác, bạn có thể chuyển một không gian tên trong thông số gói thuê bao. Tương tự, nếu muốn một loại thông báo cụ thể, bạn cũng có thể chuyển loại thông báo để lọc. Đoạn mã sau đây cho biết cách thực hiện việc này:
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"
})
Theo mặc định, gói thuê bao beacon sẽ quét tìm cả hai loại beacon, Eddystone và
iBeacon. Khi tính năng quét iBeacon được bật, người dùng sẽ được nhắc cung cấp
cho phép ứng dụng sử dụng dữ liệu vị trí của họ. Info.plist
của ứng dụng phải
hãy thêm khoá NSLocationWhenInUseUsageDescription
kèm theo nội dung giải thích ngắn về
lý do dữ liệu vị trí đang được sử dụng. Xem
Tài liệu của Apple
để biết thông tin chi tiết.
Nếu chỉ muốn quét tìm beacon Eddystone, bạn có thể tắt iBeacon
quét trong GNSBeaconStrategy
và iOS sẽ không yêu cầu người dùng cung cấp
quyền sử dụng thông tin vị trí. Đoạn mã sau đây cho biết cách tắt iBeacon
quét tìm gói thuê bao gốc ở trên:
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
})
})
Theo mặc định, tính năng quét pin yếu sẽ được bật và điều này đôi khi có thể dẫn đến độ trễ khi tìm beacon Eddystone. Khi bạn tắt chế độ tiết kiệm pin, Công nghệ quét iBeacon được dùng để giúp tìm ra các beacon Eddystone, nhờ đó có thể giảm thiểu độ trễ. Tuy nhiên, việc này dẫn đến mức sử dụng pin nhiều hơn và iOS sẽ yêu cầu để cấp quyền sử dụng thông tin vị trí.
Đoạn mã sau đây cho biết cách tắt chế độ tiết kiệm pin khi quét tìm Đèn hiệu 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
})
})
Khi quét tìm iBeacons, hộp thoại cấp quyền truy cập thông tin vị trí trên iOS đứng sau
hộp thoại quyền Lân cận. Nếu bạn muốn ghi đè hộp thoại này (cho
chẳng hạn như cung cấp "quy trình kiểm tra" hộp thoại giải thích lý do bạn cần cấp quyền truy cập thông tin vị trí
nếu cần), hãy đặt permissionRequestHandler
thành một khối tuỳ chỉnh trong
thông số gói thuê bao. Đoạn mã sau đây cho biết cách thực hiện việc này:
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);
}
})
Quét nền
Vì tính năng quét báo hiệu sử dụng BLE nên có thể hoạt động ở chế độ nền. Sau đây là một số những điều bạn cần lưu ý khi quyết định sử dụng chế độ nền:
- Sẽ tốn thêm chi phí pin cho BLE ở chế độ nền. Chi phí thấp, nhưng bạn nên đo lường độ chính xác trước khi quyết định sử dụng chế độ nền.
- iOS sẽ yêu cầu người dùng cấp quyền sử dụng thông tin vị trí trong nền nếu Tính năng quét iBeacon đang bật hoặc chế độ tiết kiệm pin bị tắt.
Để bật tính năng quét báo hiệu ở chế độ nền, hãy làm theo các bước bổ sung sau:
Bật chế độ nền cho đăng ký của bạn bằng cách truyền đúng đã định cấu hình đối tượng
GNSBeaconStrategy
. Đoạn mã sau đây cho biết cách thực hiện sau: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 }) })
Thêm các mục bắt buộc vào
Info.plist
của ứng dụng:UIBackgroundModes
mục nhập:bluetooth-central
để quét BLE ở chế độ nền.location
để quét iBeacon ở chế độ nền ở chế độ công suất cao. Bạn có thể bỏ qua tuỳ chọn này nếu đang quét tìm Eddystone vì pin yếu chỉ báo hiệu.
Chuỗi
NSLocationAlwaysUsageDescription
mô tả lý do bạn sẽ theo dõi vị trí của người dùng trong nền. Ví dụ: "Vị trí của bạn là cần để quét tìm beacon trong nền". Xem Tài liệu của Apple để biết thông tin chi tiết. Bạn có thể bỏ qua tuỳ chọn này nếu đang quét pin yếu cho Chỉ báo hiệu Eddystone.
Người dùng có thể bật hoặc tắt tính năng quét nền trong ứng dụng của bạn không? Nếu có, bạn nên lưu giá trị chế độ nền vào
NSUserDefaults
vì iOS có thể tắt ứng dụng của bạn bất cứ lúc nào trong khi đang chạy trong nền. Ứng dụng của bạn sẽ thực hiện sau:- Lưu giá trị của chế độ nền vào
NSUserDefaults
bất cứ khi nào người dùng thay đổi cuộc trò chuyện đó. - Khi khởi động, đọc từ
NSUserDefaults
và khôi phục beacon nếu bạn bật chế độ nền.
- Lưu giá trị của chế độ nền vào
Thông báo trong nền
Nếu bạn muốn ứng dụng của mình thông báo cho người dùng khi phát hiện thấy beacon khi bạn đang ở trong trong nền, bạn có thể dùng thông báo cục bộ. Để biết thông tin chi tiết, hãy xem thông báo trong nền.