Có rất nhiều nhầm lẫn về các hạn chế được áp dụng bởi iOS trên các ứng dụng muốn quét đèn hiệu BLE \ ngoại vi. Sau khi đọc một số blog và câu trả lời Chồng tràn, tôi muốn xem liệu tôi có hiểu tất cả các vấn đề chính xác không. Xin vui lòng sửa tôi nếu có bất cứ điều gì tôi hiểu lầm hoặc bỏ qua. Tôi chỉ tham khảo iOS 7 trở lên và tập trung vào phát hiện và không kết nối (Bạn có thể kết nối với CLBeacon bằng cách sử dụng Giám sát iBeacon & API phân tách không?).Phát hiện cảnh báo qua iBeacon Giám sát & Khác biệt so với CoreBluetooth scanForPeripheralsWithServices
Các tùy chọn cho đèn hiệu rõ ràng - Sử dụng mục đích chung BLE ngoại vi hoặc sử dụng thiết bị ngoại vi BLE quảng cáo trong số iBeacon format (Ngoài ra, thiết bị ngoại vi không chuẩn có thể quảng cáo ở định dạng iBeacon trong gói dịch vụ và khác định dạng trong gói phản hồi quét).
Hạn chế chung
- iBeacon Khác nhau sẽ cho bạn biết các đèn hiệu là xung quanh bạn. Bạn phải chỉ định ProximityUUID mà đèn hiệu quảng cáo trước đó (không quét "chung").
didRangeBeacons
sẽ được gọi mỗi giây với một mảng các đối tượng CLBeacon được tìm thấy gần đây. Khoảng cách từ đèn hiệu và độ chính xác của nó được tính toán bởi iOS sử dụng một số thuật toán bí mật mà chỉ các nhà phát triển của Apple mới biết (Thuật toán dựa trên giá trị rssi và byte hiệu chuẩn rssi-at-1-mét mà đèn hiệu quảng cáo). Bạn cũng có thể sử dụng giám sát iBeacon để gọi đại biểu mỗi lần bạn vào hoặc ra khỏi một vùng - một lần nữa bạn phải chỉ định ProximityUUID mà bạn đang tìm kiếm (bạn cũng có thể chỉ định một phần lớn là &). "Thoát khỏi một khu vực" được xác định bởi một thời gian không nhận được bất kỳ quảng cáo nào, và do đó không thể ngay lập tức. Số lượng vùng có thể được theo dõi \ giám sát đồng thời trên mỗi thiết bị được giới hạn ở 20 - Điều này có nghĩa là nếu các ứng dụng khác theo dõi \ cùng một lúc, ứng dụng của bạn có thể không giám sát được phạm vi (phải không?). - CoreBluetooth - Bạn cũng có thể phát hiện các cấu trúc quảng cáo khác trong quảng cáo của đèn hiệu. Nếu đèn hiệu quảng cáo ở định dạng iBeacon quá, bạn không thể thấy các trường iBeacon (ProximityUUID, lớn, nhỏ ...), mặc dù thực tế chúng được gửi theo cấu trúc quảng cáo "Nhà sản xuất cụ thể" chuẩn mà bạn có thể thấy trong các trường hợp khác .
Chạy trong Foreground - Việc sử dụng hợp cụ thể ít hạn chế:
- iBeacon Ranging và giám sát - không có hạn chế hơn nữa.
- CoreBluetooth - Đi qua
nil
trongserviceUUIDs
củascanForPeripheralsWithServices
sẽ quét tất cả các thiết bị ngoại vi. Việc chuyểnCBCentralManagerScanOptionAllowDuplicatesKey
thànhYES
trong các tùy chọn sẽ làm chodidDiscoverPeripheral
được gọi nhiều lần cho cùng một ngoại vi \ beacon (tôi giả định rằng việc sử dụng bộ hẹn giờ bạn phát hiện quảng cáo không được nhận trong một thời gian và giả định rằng người dùng đã thoát khỏi "vùng") .
Chạy trong nền - Các hạn chế hơn use-case:
- iBeacon Khác nhau sẽ không làm việc trực tiếp. Giám sát iBeacon sẽ gọi số
didEnterRegion
và cung cấp thời gian chạy ứng dụng trong 6 giây - trong đó bạn có thể bắt đầu Ranging (ví dụ: để phát hiện phần lớn & nhỏ).Việc phát hiện có thể không ngay lập tức vì iOS bật và tắt chức năng quét để bảo vệ nguồn pin. Nếu bạn nhập một vùng của nhiều đèn hiệu với cùng một ProximityUUID, và bạn theo dõi UUID này mà không có một chính cụ thể và \ hoặc nhỏ,didEnterRegion
sẽ được gọi khi bạn bắt đầu nhận tín hiệu từ đèn hiệu đầu tiên - tuy nhiên, nếu bạn không thoát khỏi khu vực của ngọn hải đăng đầu tiên và bạn cũng vào khu vực của một ngọn hải đăng thứ hai ứng dụng sẽ không được đánh thức trở lại (didEnterRegion
sẽ không được gọi lại), do đó bạn không thể bắt đầu phát hiện ra ngọn hải đăng lớn thứ hai của số &. Ứng dụng không thể chỉ đơn giản là bật lên phía trước, nhưng có thể tạo ra các thông báo địa phương và các hoạt động nền khác. - CoreBluetooth - Theo Core Bluetooth Background Processing
scanForPeripheralsWithServices
có thể chạy dưới nền sử dụng, nhưng bạn phải chỉ định ít nhất một serviceUUID.didDiscoverPeripheral
sẽ có thời gian chạy là 10 giây. Sử dụngCBCentralManagerScanOptionAllowDuplicatesKey
sẽ không hoạt động -didDiscoverPeripheral
sẽ được gọi một lần cho mọi thiết bị ngoại vi. Do đó, bạn không thể phát hiện "thoát" khỏi vùng và "nhập lại". Tôi cho rằng bạn có thể sử dụng một thiết bị ngoại vi BLE không chuẩn để thay đổi địa chỉ MAC của nó để khắc phục vấn đề này. Ứng dụng không thể chỉ đơn giản là bật lên phía trước, nhưng có thể tạo ra các thông báo địa phương và các hoạt động nền khác. Việc phát hiện có thể không ngay lập tức vì iOS bật và tắt chức năng quét để bảo vệ nguồn pin.
Chạy sau khi ứng dụng được giết
- Giám sát iBeacon - Công trình! Ngay cả khi người dùng đã giết ứng dụng hoặc thiết bị đã được khởi động lại.
- CoreBluetooth - Ứng dụng sẽ được đánh thức nếu nó bị iOS chết (do không hoạt động hoặc thiếu bộ nhớ). Tuy nhiên, nếu người dùng đã giết chết ứng dụng một cách rõ ràng thì nó sẽ không bị đánh thức (điều này khiến cho trường hợp đầu tiên khó kiểm tra). Tôi không biết điều gì xảy ra sau khi thiết bị khởi động lại ...
Có ai có nhiều kinh nghiệm hơn với những hạn chế này không? Có thể scanForPeripheralsWithServices
được sử dụng làm phương án thay thế tốt hơn cho Giám sát iBeacon trong một số trường hợp sử dụng không?
Cảm ơn!
nhờ mô tả rất hữu ích của nó. –