2016-09-27 134 views
0

我一直在使用Swift创建Beacon感应应用程序的指南,但自从更新Xcode并将代码更新为Swift 3.0后,我收到了一个致命错误。Swift Beacon目前无法使用Swift 3.0

通过功能我认为有startScanning函数的问题,当它触发时,我得到致命的错误消息。

在什么可以帮助任何提示将不胜感激:

import UIKit 
import CoreLocation 

class ViewController: UIViewController, CLLocationManagerDelegate { 
@IBOutlet weak var distanceLabel: UILabel! 
var locationManager: CLLocationManager! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    locationManager = CLLocationManager() 
    locationManager.delegate = self 
    locationManager.requestAlwaysAuthorization() 

    view.backgroundColor = UIColor.gray 
    print("did load") 

} 


func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { 
    if status == CLAuthorizationStatus.authorizedAlways{ 
     print("status authorized") 
     if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self){ 
      print("is monitoring") 
      if CLLocationManager.isRangingAvailable() { 
       print("scanning") 
       startScanning() 

      } 
     } 
    } 
} 




func startScanning() { 
    print("start Scanning") 
    let uuid = NSUUID(uuidString: "695e5f08824c785cadc72e1dde23be04") 
    let beaconRegion = CLBeaconRegion(proximityUUID: uuid as! UUID, identifier: "MyBeacon") 

    locationManager.startMonitoring(for: beaconRegion) 
    locationManager.startRangingBeacons(in: beaconRegion) 
} 



func updateDistance(distance: CLProximity){ 

    UIView.animate(withDuration: 1) { [unowned self] in 

     switch distance { 
     case .unknown: 
      self.view.backgroundColor = UIColor.gray 
      self.distanceLabel.text = "UNKNOWN" 
      print("distance Unknown") 
     case .far: 
      self.view.backgroundColor = UIColor.blue 
      self.distanceLabel.text = "FAR" 
      print("distance Far") 
     case .near: 
      self.view.backgroundColor = UIColor.orange 
      self.distanceLabel.text = "NEAR" 
      print("distance Near") 
     case .immediate: 
      self.view.backgroundColor = UIColor.red 
      self.distanceLabel.text = "BOOM!" 
      print("distance Immediate") 
     } 
    } 
} 



func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) { 
    if beacons.count > 0 { 
     let beacon = beacons.first! as CLBeacon 
     updateDistance(distance: beacon.proximity) 
     print("found more than one beacon") 
    } else { 
     updateDistance(distance: .unknown) 
     print("found only one beacon") 
    } 
} 



override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


} 
+0

什么是错误信息? – davidgyoung

+0

致命错误:意外发现零,同时展开一个可选值 2016-09-27 17:27:35.045701第22项[3211:825691]致命错误:意外发现零,同时解包可选值 –

回答

3

的问题是,你的UUID是在错误的格式,所以这条线不能分析它,给变量uuid分配零:

let uuid = NSUUID(uuidString: "695e5f08824c785cadc72e1dde23be04") 

该程序然后将崩溃使用uuid as! UUID操作,因为!如果有一个零值,将会崩溃。

要解决此问题,您需要在UUID字符串中的相应位置添加破折号。你也应该避免使用!运算符强制在Swift中打开可选变量,因为它可能导致崩溃。试试这个:

if let uuid = NSUUID(uuidString: "695e5f08-824c-785c-adc7-2e1dde23be04") { 
    let beaconRegion = CLBeaconRegion(proximityUUID: uuid, identifier: "MyBeacon") 
    locationManager.startMonitoring(for: beaconRegion) 
    locationManager.startRangingBeacons(in: beaconRegion) 
} 
else { 
    NSLog("Invalid UUID format") 
} 

运行时检查代码是否没有关闭“Invalid UUID format”路径。

+0

谢谢!这已经解决了开始扫描资金问题,但现在locationManager基金存在问题,但我会看到我可以自己做什么。再次感谢 –