Pertanyaan Apa sebenarnya yang dapat dilakukan aplikasi CoreBluetooth sementara di latar belakang?


Subjek mengatakan semuanya, sungguh. Dokumentasi, sejauh ada, menunjukkan bahwa aplikasi yang ditulis dengan kerangka kerja CoreBluetooth yang berjalan pada perangkat iOS dapat menambahkan "bluetooth-central" ke daftar hak istimewa latar belakang mereka dan memproses beberapa jenis acara Bluetooth sementara tidak aktif, tetapi yang tepat Peristiwa yang terjadi dan tidak disampaikan?

Sebagai contoh:

  1. Dapatkah saya meneruskan komunikasi dengan perangkat yang telah saya bentuk pasangannya?
  2. Dapatkah saya menerbitkan permintaan penemuan berkala untuk menemukan perangkat yang berada di luar jangkauan / belum pernah saya lihat sebelumnya? (Misalnya jika saya ingin dapat mengirimkan pemberitahuan ketika perangkat baru yang menarik ditemukan)
  3. Bagaimana jika perangkat keluar dari jangkauan dan kemudian kembali? Apakah saya akan mendapatkan kejadian yang terputus dan terhubung tanpa campur tangan pengguna, atau akankah saya perlu berada di latar depan dan meminta pengguna secara eksplisit meminta rekoneksi?

76
2018-03-27 19:44


asal


Jawaban:


Sepertinya tidak ada yang tahu, jadi saya membeli akun pengembang iOS dan menjalankan beberapa eksperimen. Inilah yang saya temukan:

Saat berjalan di latar depan, Anda dapat memulai pemindaian menggunakan CBCentralManager :: scanForPeripheralsWithServices. Scan Anda bisa terbatas ke perangkat yang mengiklankan layanan tertentu, atau tidak dibatasi (Lewati nil untuk parameter panggilan itu). Ini juga bisa mengizinkan atau tidak mengizinkan duplikat; dalam kasus sebelumnya Anda akan mendapatkan callback didDiscoverPeripheral setiap kali iPhone menerima paket iklan; dalam yang terakhir Anda hanya akan mendapatkan satu callback per perangkat yang ditemukan.

Saat Anda memasukkan latar belakang, aturannya tampak seperti berikut:

  • Jika Anda menjalankan tidak dibatasi memindai, itu akan dibatalkan secara diam-diam. Anda tidak akan mendapatkan callback doDiscover.
  • Jika pemindaian Anda terbatas (yaitu Anda menetapkan satu atau lebih UUID layanan yang Anda cari), pemindaian Anda akan terus berjalan, tetapi bolehkan duplikat bendera akan diabaikan. Ini berarti bahwa Anda sekarang hanya akan mendapatkan callback didDiscoverPeripheral untuk baru perangkat. Jika semua perangkat terlihat sementara di latar depan Anda tidak akan mendapat callback sama sekali.
  • Memulai dan menghentikan pemindaian tidak mengatur ulang perangkat mana yang dianggap baru. Jika ada satu perangkat yang hadir, Anda hanya akan mendapatkan satu panggilan balik, bahkan di beberapa pemindaian, kecuali ...
  • Jika kamu menghubungkan ke perangkat, lalu memutuskan, kemudian Cari lagi, perangkat akan dicacah lagi (yaitu Anda akan mendapatkan satu panggilan lagi ke didDiscoverPeripheral). Saya kira iOS menganggap itu sebagai "menunjukkan minat" di perangkat.

Saya tidak tahu apakah upaya tersambung ke perangkat yang tidak dapat dihubungkan (mis. Pengiklan BLE, seperti yang menerapkan profil kedekatan) cukup baik karena perangkat contoh saya dapat disambung. Namun setidaknya untuk perangkat yang dapat dihubungkan, prosedur scan / connect / disconnect / scan ini cukup untuk melakukan polling untuk kehadiran perangkat di latar belakang.

Hasil di atas dikumpulkan menggunakan iPhone 4S yang menjalankan iOS 5.0.1


119
2018-04-10 20:48



Selain jawaban Chris:

  • Jika aplikasi Anda memiliki mode latar belakang "pusat bluetooth" dan terhubung ke perangkat, Anda dapat menerima pemberitahuan (peripheral:didUpdateValueForCharacteristic:error:) dari perangkat di latar belakang, bahkan setelah 10 menit.

Jadi ketika Anda ingin terus berjalan di latar belakang, Anda memiliki 2 opsi:

  • Jalankan loop "hubungkan, putuskan sambungan, pindai lagi"
  • Buat pemberitahuan pengiriman perangkat

Nanti harus "Peristiwa latar belakang" dari WWDC 2012 Core Bluetooth video https://developer.apple.com/videos/wwdc/2012/ Tapi yang pertama terlihat seperti peretasan, saya tidak ingin bergantung padanya.

Saya menguji ini di iPhone5, iOS6.1.4


Apple akhirnya merilis Panduan Pemrograman Bluetooth Inti dan inilah catatan resmi tentang

Pengolahan Latar Belakang Bluetooth Inti untuk Aplikasi iOS


8
2017-07-05 08:08



Ini juga baik untuk mencatat perilaku latar belakang dan CoreBluetooth terkait dengan iBeacons, meskipun Apple suka menganggap ini sebagai fungsi CoreLocation:

  1. Saat pemberitahuan untuk wilayah iBeacon dihidupkan, mereka akan memberi tahu pengguna entri wilayah atau keluar. Pemberitahuan ini dapat dibuat bergantung pada apakah layar aktif atau tidak aktif. Notifikasi ini akan berfungsi bahkan ketika aplikasi yang meminta notifikasi ada di latar belakang. (Ini jelas dalam dokumentasi).

  2. Tidak begitu jelas: Jika Anda menggunakan API rentang iBeacon, maka aplikasi Anda harus berada di latar depan. Itu tidak secara eksplisit mengatakan ini dalam dokumentasi - pada kenyataannya, seseorang dapat menyesatkan untuk berpikir bahwa rentang harus bekerja di latar belakang dari dokumentasi. Namun, seorang insinyur Apple mengklarifikasi ini dalam sebuah posting yang terkubur di suatu tempat dalam untaian panjang di forum pengembang Apple, dan saya telah melihat ini gagal juga. Mulai bekerja hanya di latar depan.

  3. Seseorang dapat menemukan layanan lain yang diiklankan oleh iklan periklanan iBeacons. Tetapi ini hanya akan berfungsi di latar depan. Jadi jika Anda ingin pusat untuk diberitahu kedekatan menggunakan iBeacons, dan kemudian melakukan beberapa transaksi lain menggunakan layanan berbasis BLE lainnya, ini akan bekerja, tetapi hanya di latar depan. Ini tidak akan berfungsi di latar belakang. Untuk transaksi dengan layanan berbasis BLE di latar belakang, iklan harus berupa iklan BLE reguler, bukan iBeacon. Anda tidak dapat menggunakan iklan iBeacon untuk membantu proses penemuan di latar belakang, dan kemudian beralih menggunakan layanan BLE di latar belakang. (Saya akan sangat menyukai ini untuk bekerja, tetapi tidak ada dadu).


7
2017-10-18 20:08



Saya baru saja mempelajari mode latar belakang untuk perangkat BLE di iOS8.3 & 8.4 dan telah menemukan beberapa perbedaan dari atas:

  1. jika saya mulai

    [centralManager scanForPeripheralsWithServices: @ [[CBUUID UUIDWithString: kServiceUUID]] opsi: @ {CBCentralManagerScanOptionAllowDuplicatesKey: @YES}];

dari

- (void)applicationDidEnterBackground:(UIApplication *)application

Saya menemukan enumerasi mengembalikan perangkat yang sama setiap panggilan dengan RSSI yang berbeda, jadi CBCentralManagerScanOptionAllowDuplicatesKey tidak diabaikan.

  1. Jika aplikasi di latar depan, perangkat BLE ditemukan 50 kali dalam detik. Jika aplikasi berada di latar belakang tetapi layar ponsel adalah aplikasi yang aktif ditemukan perangkat BLE 6 kali dalam detik. Jika layar ponsel diblokir, aplikasi menemukan perangkat BLE 1 kali dalam detik.

4
2017-07-13 11:49