Código Swift2.3 para detecção de Beacon
Estamos em estágios avançados de desenvolvimento de um aplicativo Swift2.2 e, portanto, decidimos migrar para o 2.3 nesse meio tempo e fazer a migração completa do Swift 3 posteriormente. No entanto, não conseguimos obter a detecção de beacon funcionando após a conversão para o Swift 2.3. O método "didRangeBeacons" continua retornando uma matriz vazia. O mesmo código estava funcionando no Swift 2.2, então sabemos que temos todas as permissões, etc.
Além disso, se abrirmos o aplicativo "Locate" no mesmo ipad, nosso aplicativo também começará a retornar dados em "didRangeBeacons". Tentei várias versões dos aplicativos por aí e todos os aplicativos Swift2.3 estão se comportando da mesma maneira. Não consegue entender o que o aplicativo Locate está fazendo ... Alguém no mesmo barco ??
Aqui está o código que estamos usando. Não tenho certeza se isso deve ser escrito aqui ou nos comentários, mas não foi possível colocar o código nos comentários de alguma forma ...
import UIKit
import CoreLocation
class ViewController: UIViewController, CLLocationManagerDelegate {
let locationManager = CLLocationManager()
let region = CLBeaconRegion(proximityUUID: NSUUID(UUIDString: "9735BF2A-0BD1-4877-9A4E-103127349E1D")!, identifier: "testing")
// Note: make sure you replace the keys here with your own beacons' Minor Values
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.locationManager.delegate = self
self.locationManager.requestAlwaysAuthorization()
self.locationManager.startMonitoringForRegion(self.region)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManager(manager: CLLocationManager, didStartMonitoringForRegion region: CLRegion) {
print("didStartMonitoringForRegion")
self.locationManager.requestStateForRegion(region)
}
func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) {
print("monitoringDidFailForRegion")
}
func locationManager(manager: CLLocationManager, didDetermineState state: CLRegionState, forRegion region: CLRegion) {
print("didDetermineState")
if state == .Inside {
//Start Ranging
self.locationManager.startRangingBeaconsInRegion(self.region)
self.locationManager.startUpdatingLocation()
}
else {
//Stop Ranging here
self.locationManager.stopUpdatingLocation()
self.locationManager.stopRangingBeaconsInRegion(self.region)
}
}
func locationManager(manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], inRegion region: CLBeaconRegion) {
print(beacons.count)
}
}
[Atualização postar mais algumas tentativas para fazer isso funcionar] O aplicativo funciona no modo de primeiro plano se removermos self.locationManager.startMonitoringForRegion (self.region) e chamar self.locationManager.startRangingBeaconsInRegion (self.region) diretamente após self.locationManager.requestAlwaysAuthorization ()
Isso é subótimo, porque não obtemos eventos ou estados de entrada e saída, mas pelo menos estamos recebendo contagens de beacon.