Câu hỏi Chính xác những ứng dụng CoreBluetooth có thể làm gì trong khi ở chế độ nền?


Chủ đề nói tất cả, thực sự. Tất cả các tài liệu được viết bằng khung CoreBluetooth chạy trên thiết bị iOS đều có thể thêm "bluetooth-central" vào danh sách đặc quyền nền của chúng và do đó xử lý một số loại sự kiện Bluetooth trong khi không hoạt động, nhưng chính xác sự kiện nào và không được gửi?

Ví dụ:

  1. Tôi có thể tiếp tục liên lạc với một thiết bị mà tôi đã thiết lập ghép nối không?
  2. Tôi có thể phát hành các yêu cầu phát hiện định kỳ để tìm các thiết bị nằm ngoài phạm vi / tôi chưa từng thấy trước đây không? (Ví dụ: nếu tôi muốn có thể gửi thông báo khi gặp phải một thiết bị thú vị mới)
  3. Điều gì sẽ xảy ra nếu thiết bị không nằm trong phạm vi phủ sóng và sau đó quay lại? Tôi có bị ngắt kết nối và các sự kiện được kết nối mà không cần sự can thiệp của người dùng hay tôi cần phải được đặt nền trước và yêu cầu người dùng yêu cầu kết nối lại một cách rõ ràng không?

76
2018-03-27 19:44


gốc




Các câu trả lời:


Không ai biết, vì vậy tôi đã mua một tài khoản nhà phát triển iOS và chạy một số thử nghiệm. Dưới đây là những gì tôi đã tìm thấy:

Khi chạy ở nền trước, bạn có thể bắt đầu quét bằng CBCentralManager :: scanForPeripheralsWithServices. Quá trình quét của bạn có thể bị hạn chế cho các thiết bị quảng cáo một dịch vụ cụ thể hoặc không hạn chế (vượt qua nil cho tham số của cuộc gọi đó). Nó cũng có thể cho phép hoặc là không cho phép trùng lặp; trong trường hợp trước, bạn sẽ nhận được một cuộc gọi lại doDiscoverPeripheral mỗi khi iPhone nhận được một gói quảng cáo; sau này bạn sẽ chỉ nhận được một cuộc gọi lại cho mỗi thiết bị được tìm thấy.

Khi bạn nhập vào nền, các quy tắc xuất hiện như sau:

  • Nếu bạn đang chạy không hạn chế quét, nó sẽ được âm thầm hủy bỏ. Bạn sẽ không nhận được bất kỳ cuộc gọi lại đã làm nào.
  • Nếu quá trình quét của bạn là bị hạn chế (nghĩa là bạn đã chỉ định một hoặc nhiều UUID dịch vụ mà bạn đang tìm kiếm), quá trình quét của bạn sẽ tiếp tục chạy, nhưng cho phép cờ trùng lặp sẽ bị bỏ qua. Điều này có nghĩa là bây giờ bạn sẽ chỉ nhận được didDiscoverCác cuộc gọi lại ngoại tuyến cho Mới thiết bị. Nếu tất cả các thiết bị được nhìn thấy trong khi ở phía trước, bạn sẽ không nhận được bất kỳ callback nào cả.
  • Bắt đầu và dừng quét không làm đặt lại thiết bị nào được coi là mới. Nếu có một thiết bị có mặt, bạn sẽ chỉ nhận được một cuộc gọi lại, thậm chí trên nhiều lần quét, trừ khi ...
  • nếu bạn kết nối với một thiết bị, sau đó ngắt kết nối, sau đó quét lại, thiết bị sẽ được liệt kê lại (tức là bạn sẽ nhận được thêm một cuộc gọi tới didDiscoverPeripheral). Tôi đoán iOS liên quan rằng có "lãi suất hiển thị" trong thiết bị.

Tôi không biết kết nối có cố gắng với các thiết bị không kết nối được hay không (ví dụ: Nhà quảng cáo BLE, như những người triển khai cấu hình lân cận) là đủ tốt vì các thiết bị ví dụ của tôi có thể kết nối được. Tuy nhiên ít nhất là đối với các thiết bị có thể kết nối, quy trình quét / kết nối / ngắt kết nối / quét này đủ để thăm dò sự hiện diện của thiết bị trong nền.

Các kết quả trên được thu thập bằng cách sử dụng iPhone 4S chạy iOS 5.0.1


119
2018-04-10 20:48



Chào Chris. Hấp dẫn! Tôi không hiểu một điều mặc dù. Quá trình có thể tiếp tục chạy trong nền nếu nó đang giao tiếp với thiết kế Bluetooth không? (Ví dụ, tôi có thể kết nối một màn hình nhịp tim và sau đó di chuyển ứng dụng về phía nền và mong đợi nó tiếp tục chạy?) - Ben
Chào Ben. Nó sẽ không tiếp tục chạy như nó ở nền trước, nhưng nó sẽ tiếp tục được thực hiện khi các sự kiện Bluetooth thuộc loại mà tôi mô tả ở trên xảy ra. Một vấn đề tôi gặp phải là ngay cả trong tình huống này, khi không có tương tác người dùng trong một thời gian điện thoại sẽ đi ngủ và ứng dụng sẽ ngừng được gọi. Tôi đã làm việc xung quanh điều này bằng cách đăng ký (sai) như là một ứng dụng âm thanh, ngăn chặn đình chỉ; điều này rõ ràng là không thể chấp nhận cho cửa hàng ứng dụng. - Chris Smowton
Xin chào Chris. Bài đăng tuyệt vời. Nhận xét cuối cùng của bạn phủ nhận tuyên bố trong bài đăng này: lists.apple.com/archives/bluetooth-dev/2011/Dec/msg00007.html Đây không phải là tin tốt. Bạn có nghĩ đây là lỗi thực sự trong quá trình triển khai không? Bạn đã thiết lập kết nối với một thiết bị chưa? Bạn có thể xác nhận rằng thông báo cập nhật giá trị cũng dừng lại không? Cảm ơn. - allprog
@ChrisSmowton Tôi biết bạn không còn thiết bị iOS nữa. Nhưng bạn có một ý tưởng như thế nào người ta sẽ phân biệt giữa iOS bỏ qua một bản sao và iOS không tìm thấy một thiết bị ngoại vi? - shreyashirday
Nếu bạn chưa thấy nó kể từ lần cuối bạn kết nối với nó, nó không có ở đó. Nếu bạn đã thấy nó, cách duy nhất tôi biết để khám phá nó một lần nữa khi ở chế độ nền là cố gắng kết nối. - Chris Smowton


Ngoài câu trả lời của Chris:

  • Nếu ứng dụng của bạn có chế độ nền "bluetooth-central" và được kết nối với thiết bị ngoại vi, bạn có thể nhận thông báo (peripheral:didUpdateValueForCharacteristic:error:) từ thiết bị ngoại vi trong nền, ngay cả sau 10 phút.

Vì vậy, khi bạn muốn chạy liên tục ở chế độ nền, bạn có 2 tùy chọn:

  • Chạy vòng lặp "kết nối, ngắt kết nối, quét lại"
  • Tạo thông báo gửi ngoại vi

Sau đó phải là "Sự kiện nền" từ các video của WWDC 2012 Core Bluetooth https://developer.apple.com/videos/wwdc/2012/ Nhưng trước đây trông giống như một hack, tôi không muốn dựa vào nó.

Tôi đã thử nghiệm điều này trên iPhone5, iOS6.1.4


Apple cuối cùng đã phát hành Hướng dẫn lập trình lõi Bluetooth và đây là lưu ý chính thức về

Xử lý nền lõi Bluetooth cho ứng dụng iOS


8
2017-07-05 08:08





Nó cũng là tốt để lưu ý các hành vi của backgrounding và CoreBluetooth liên quan đến iBeacons, mặc dù Apple thích nghĩ về điều này như là một chức năng CoreLocation:

  1. Khi thông báo cho khu vực iBeacon được bật, họ sẽ thông báo cho người dùng về mục nhập hoặc thoát khỏi khu vực. Các thông báo này có thể được thực hiện để phụ thuộc vào việc màn hình đang bật hay tắt. Các thông báo này sẽ hoạt động ngay cả khi ứng dụng yêu cầu thông báo ở chế độ nền. (Điều này rõ ràng trong tài liệu).

  2. Không rõ ràng như vậy: Nếu bạn sử dụng API iBeacon, thì ứng dụng của bạn phải ở nền trước. Nó không rõ ràng nói điều này trong tài liệu-- trên thực tế, người ta có thể bị lừa dối khi nghĩ rằng khác nhau, nên làm việc trong nền từ tài liệu. Tuy nhiên, một kỹ sư của Apple làm rõ điều này trong một bài đăng bị chôn vùi ở đâu đó trong một chuỗi dài trên diễn đàn nhà phát triển Apple, và tôi đã thấy điều này thất bại quá. Ranging sẽ chỉ hoạt động ở nền trước.

  3. Người ta có thể khám phá các dịch vụ khác đang được quảng cáo bởi một iBeacons quảng cáo ngoại vi. Nhưng điều này sẽ chỉ hoạt động ở nền trước. Vì vậy, nếu bạn muốn trung tâm được thông báo về sự gần gũi bằng cách sử dụng iBeacons, và sau đó thực hiện một số giao dịch khác bằng các dịch vụ dựa trên BLE khác, điều này sẽ hoạt động, nhưng chỉ ở nền trước. Nó sẽ không hoạt động ở chế độ nền. Đối với các giao dịch với các dịch vụ dựa trên BLE trong nền, quảng cáo phải là một quảng cáo BLE thông thường, không phải là một iBeacon. Bạn không thể sử dụng quảng cáo iBeacon để giúp quá trình khám phá trong nền, sau đó chuyển sang sử dụng dịch vụ BLE trong nền. (Tôi sẽ rất thích điều này để làm việc, nhưng không có súc sắc).


7
2017-10-18 20:08





Tôi vừa mới học chế độ nền cho các thiết bị BLE trên iOS8.3 & 8.4 và đã tìm thấy một số khác biệt so với ở trên:

  1. nếu tôi bắt đầu

    [centralManager scanForPeripheralsWithServices: @ [[CBUUID UUIDWithString: kServiceUUID]] tùy chọn: @ {CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];

từ

- (void)applicationDidEnterBackground:(UIApplication *)application

Tôi tìm thấy liệt kê trả về cùng một thiết bị mỗi cuộc gọi với RSSI khác nhau, vì vậy CBCentralManagerScanOptionAllowDuplicatesKey không bị bỏ qua.

  1. Nếu ứng dụng ở tiền cảnh nó phát hiện thiết bị BLE 50 lần trong giây. Nếu ứng dụng ở chế độ nền nhưng màn hình điện thoại là ứng dụng hoạt động được phát hiện thiết bị BLE 6 lần trong giây lát. Nếu màn hình điện thoại bị chặn ứng dụng phát hiện thiết bị BLE 1 lần trong giây lát.

4
2017-07-13 11:49



Điều cần biết, có vẻ như họ đã cải thiện chồng kể từ khi tôi sử dụng nó trong năm 2012 :) - Chris Smowton