2014-11-12 25 views
9

Có nhiều câu hỏi liên quan nhưng (dường như) không có câu trả lời. SO ...iOS cách kết nối lại với thiết bị BLE ở chế độ nền?

Ứng dụng iOS của tôi không nhận nội dung cập nhật từ thiết bị BLE của tôi trong khi ứng dụng ở chế độ nền. Nếu tôi mất liên lạc với thiết bị BLE, sau đó trong centralManager:didDisconnectPeripheral: Tôi gọi - [CBCentralManager cancelPeripheralConnection:] - nếu không tôi sẽ không bao giờ kết nối lại với thiết bị ngoại vi bị mất. Sau đó, tôi gọi [(lại) gọi - [CBCentralManager scanForPeripheralsWithServices:options:].

Ghi nhật ký cho tôi biết rằng cuộc gọi didDisconnectPeripheral và các cuộc gọi chứa trong số đó đều đang diễn ra trong khi ở chế độ nền. Tuy nhiên, kết nối lại chỉ xảy ra khi ứng dụng khởi động từ nền.

Vì vậy, tôi có thể giao tiếp với thiết bị BLE được kết nối trong khi ở chế độ nền (yay!) Nhưng không kết nối lại. Điều này khá quan trọng đối với ứng dụng của tôi và (một người sẽ nghĩ) đối với các ứng dụng khác. Đề nghị chào đón.

Trả lời

5

Paul đúng, rằng tôi không cần hủy kết nối và tôi không cần phải quét lại, mà tất cả những gì tôi cần làm là gọi connectPeripheral. NHƯNG ... những gì tôi đã không làm được điều này:

_manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)]; 

Tôi đã đi qua con số không cho hàng đợi, điều này có nghĩa callbacks CBCentralManagerDelegate của tôi đã được chạy trên các chủ đề chính.

8

Bạn không cần phải hủy kết nối - nó đã bị ngắt kết nối Bạn không cần phải quét lại thiết bị ngoại vi - bạn đã xác định thiết bị ngoại vi của mình.

Trong didDisconnectPeripheral bạn chỉ có thể gọi

[central connectPeripheral:peripheral options:nil]; 

lõi Bluetooth sẽ kết nối lại một lần thiết bị ngoại vi có thể nhìn thấy một lần nữa

Một mẫu hoàn chỉnh là ở đây - https://github.com/paulw11/BTBackground

+0

Thật không may cho tôi. Trong thực tế, bằng cách sử dụng connectPeripheral (thay vì gọi lại scanForPeripherals) ứng dụng của tôi không kết nối lại ngay cả khi nó vẫn còn ở phía trước. Kết nối không bao giờ được thiết lập lại.Trong khi nếu tôi gọi scanForPeripheral trong didDisconnectPeripheral, I * do * kết nối lại nếu ở nền trước, nhưng vẫn không ở chế độ nền. Grr. –

+0

Thiết bị này là TI SensorTag, FWIW. –

+0

Ok. Thẻ cảm biến gây phiền nhiễu - chúng bị tắt sau vài phút, vì vậy tôi không chắc liệu đây có phải là vấn đề của bạn hay không. Các thiết bị iOS cũng khó làm việc vì chúng thay đổi địa chỉ MAC cứ sau vài phút. Tôi có một thẻ cảm biến, vì vậy tôi sẽ có một cuộc chơi xung quanh và xem những gì sẽ xảy ra. Có thể mất một hoặc hai ngày ... – Paulw11

0

Trong tab "Khả năng" -> Background Chế độ, chọn "Người dùng Bluetooth LE phụ kiện" và "Hành vi như một phụ kiện Bluetooth LE". Tôi không chắc chắn nó có thể làm việc, nhưng bạn có thể có một thử.

+0

Cảm ơn bạn đã đề xuất. Tôi đã chọn các phụ kiện Sử dụng Bluetooth LE. Tôi đã thêm Công vụ Như, nhưng nó không thay đổi mọi thứ. Ý tưởng tốt mặc dù. Người ta phải luôn luôn thử những thứ mà * không nên * làm việc. Bởi vì họ có thể làm việc! –

3

Tôi biết bạn có thể đã tìm ra mọi thứ. Tôi cũng tự tình cờ gặp vấn đề này. Cách làm như sau mình sẽ không hoàn toàn giải quyết vấn đề (ít nhất là đối với tôi):
[central connectPeripheral:peripheral options:nil];

Thay vì "nil" cho các tùy chọn, bạn sẽ cần phải cung cấp "tùy chọn" trong các phương pháp trên. Có những thứ khác bạn cần phải thiết lập là tốt (chẳng hạn như info.plist cho ứng dụng của bạn). Sau khi đọc hướng dẫn của Apple về cách bật hoạt động bluetooth nền cho Ứng dụng. Tôi đã có thể làm cho nó hoạt động và nhận các sự kiện để kết nối, ngắt kết nối, cập nhật vv, thậm chí quét có thể hoạt động ở mặt sau. Không được lặp lại mọi thứ mà tài liệu Apple đã viết, bạn có thể xem liên kết sau:
Core Bluetooth Background Processing for iOS Apps

Hy vọng điều này sẽ hữu ích.

+0

Đối với tôi, khóa đã chuyển thông số thích hợp cho hàng đợi, như đã nói ở trên. Tuy nhiên, các tùy chọn chắc chắn có liên quan quá. Cảm ơn. –

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