BLE service notification törlése Xamarin.IOS c#

BLE service notification törlése Xamarin.IOS c#
2019-02-19T00:06:08+01:00
2019-02-20T00:36:13+01:00
2022-10-15T21:41:05+02:00
frankcrk
Egy IOS app-on dolgozom (xamarin.IOS) amiben kapcsolódnom kell egy BLE vonalkod scanner-hez. Mikor megnyitok egy UIView-t csatlakozok a BLE scanner-hez és regisztrálok az egyik service notification-jére. Így mikor lehúznak egy vonalkódot, az app megkapja az értesítést. Ez működik is tökéletesen. A probléma akkor van mikor szakítanom kell a kapcsolatot majd újra kapcsolódni. A user visszamegy a menübe akkor törlöm a kapcsolatot, törlök és null-ozok mindent amit lehet. Mikor az UIView újra megnyílik akkor ugye minden kezdődik elölről. Kapcsolódok, regisztrálom a service notification-t...stb. Viszont ilyenkor már minden scannelést 2x kap meg az app. Ha kimegyek a menube, aztán vissza 10x akkor minden lehúzott vonalkódott 10x kapok meg. Olyan mintha az IOS ráakadna a notification-re és akármit teszek nem akarja törölni. Probáltam az egesz class-omat megcsinálni IDisposable-ra és dispose-al totálisan eltüntetni, de azsem változtatott a dolgon és nem értem mit rontok el. 
a UIVIew:

private ScannerHelper ble; public override void ViewDidAppear(bool animated) { if (ble == null) ble = new ScannerHelper(); ScannerHelper.GetDevice(); } public override void ViewDidDisappear(bool animated) { ble.StopDevice(); ble=null; } --------------------------------------------------------- A ScannerHelper class : using Plugin.BluetoothLE; private IDevice BLEScanner; private Characteristic; public void GetDevice() { CrossBleAdapter.AdapterScanner.FindAdapters(); var scanner = CrossBleAdapter.Current.Scan().Subscribe(scanResult => { if ((scanResult.Device.Name != null) && (scanResult.Device.Name.Length > 0)) { scanResult.Device.Connect(); scanResult.Device.WhenAnyCharacteristicDiscovered().Subscribe(characteristic => { if (characteristic.Service.Uuid == ScannerServiceUUID) { if (characteristic.CanNotify()) { Characteristic=characteristic; CrossBleAdapter.Current.StopScan(); BLEScanner=scanResult.Device; characteristic.EnableNotifications(); characteristic.WhenNotificationReceived().Subscribe(result => { BarcodeScanned(); }); } } }); } }); } public void StopDevice() { Characteristic.DisableNotifications(); BLEScanner.CancelConnection(); Characteristic=null; BLEScanner=null; var devices = CrossBleAdapter.Current.GetConnectedDevices(); devices.Subscribe(deviceResult => { if (deviceResult.Count() > 0) foreach (var device in deviceResult) { device.CancelConnection(); } }); }
Mutasd a teljes hozzászólást!
Elvileg a scanner változó Dispose() metódusát kellene meghívni:

var scanner = CrossBleAdapter.Current.Scan().Subscribe(scanResult => { // do something with it // the scanresult contains the device, RSSI, and advertisement packet }); scanner.Dispose(); // to stop scanning
(forrás)

Tedd ki a scanner változódat osztályváltozóba és a StopDevice()-ban hívd meg rá a Dispose()-t
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd