2015-01-31 11 views
16

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 trong serviceUUIDs của scanForPeripheralsWithServices sẽ quét tất cả các thiết bị ngoại vi. Việc chuyển CBCentralManagerScanOptionAllowDuplicatesKey thành YES trong các tùy chọn sẽ làm cho didDiscoverPeripheral đượ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 ProcessingscanForPeripheralsWithServices 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ụng CBCentralManagerScanOptionAllowDuplicatesKey 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!

+0

nhờ mô tả rất hữu ích của nó. –

Trả lời

2

Bạn chủ yếu phù hợp với mô tả của mình. Chỉ hai làm rõ:

  • Giới hạn 20 khu vực là không cho mỗi thiết bị, nó là ứng dụng cụ thể. Cho dù ứng dụng khác đang làm gì trên thiết bị di động, ứng dụng của bạn vẫn được phép theo dõi tối đa 20 khu vực theo iOS. Điều đó nói rằng, có khả năng giới hạn phần cứng được thiết bị cụ thể về bao nhiêu khu vực có thể được theo dõi trong nền với sự hỗ trợ phần cứng. Những giới hạn này không có giấy tờ. Nếu bạn vượt qua các giới hạn không có giấy tờ này, có thể sẽ mất nhiều thời gian hơn để phát hiện đèn hiệu trong nền. (Mặc dù điều đó nói rằng, không có bảo đảm hệ điều hành khi phát hiện đến, anyway.)

  • Bạn không thể kết nối với CLBeacon bằng cách sử dụng các API giám sát và phân loại. Các API này chỉ hoạt động với các gói quảng cáo BLE, không có kết nối.

Có, bạn có thể sử dụng scanForPeripheralsWithServices làm phương án thay thế. Đây là những gì các cảnh báo Gimbal làm để thực hiện một hệ thống độc quyền. Tuy nhiên, có những nhược điểm thực tế về mặt thời gian phát hiện và độ tin cậy.

+0

Cảm ơn, tôi sẽ xem xét các cảnh báo Gimbal.Bạn có biết nếu có những nhược điểm khác ngoài trường hợp người dùng giết chết ứng dụng một cách rõ ràng hoặc khởi động lại thiết bị? Tôi đang cố gắng xây dựng một ngọn hải đăng sẽ được phát hiện ngay cả khi người dùng rời khỏi ứng dụng trong nền trong một thời gian dài. – Oren

+0

... và quảng cáo nhiều thông tin hơn 4 byte lớn + nhỏ. – Oren

+0

@davidyoung Bạn có thể xây dựng thêm một chút về những bất lợi của việc sử dụng scanForPeripheralsWithServices như một sự thay thế không? Họ là ai? (ngoài khả năng khởi động ứng dụng ở chế độ nền) – fspirit

Các vấn đề liên quan