从Appdelegate设置iBeacon操作和监控

时间:2017-01-01 03:50:27

标签: bluetooth monitoring viewcontroller ibeacon appdelegate

我正在创建一个包含多个视图的应用。我希望它能够在所有视图的背景中监视信标。所以,我正在App代理中设置代码。当代码在app delegate中时,它什么都不做。如果我将其移动到第一个视图控制器进行加载,它将要求授权使用位置,但在进入信标区域时不执行操作。这是app委托中的代码。我做错了什么?

import UIKit
import CoreLocation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

    var window: UIWindow?


    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        return true
    }

    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }



    func applicationDidFinishLaunchingWithOptions(_ application: UIApplication) {


        let beaconManager = CLLocationManager()


            var locationManager: CLLocationManager!

            var window: UIWindow?


            locationManager = CLLocationManager()

            locationManager.delegate = self

            locationManager.requestAlwaysAuthorization()

            func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
                if status == CLAuthorizationStatus.authorizedAlways {
                    if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
                        if CLLocationManager.isRangingAvailable() {

                            startScanning()
                        }
                    }
                }
            }


            func startScanning() {

                let uuid = NSUUID(uuidString: "2F234454-CF6D-4AOF-ADF2-F4911BA9FFA6")
                let beaconRegion1 = CLBeaconRegion(proximityUUID: uuid as! UUID, major: 0, minor: 1, identifier: "AuschwitzAlbum")
                let beaconRegion2 = CLBeaconRegion(proximityUUID: uuid as! UUID, major: 0, minor: 2, identifier: "Children")

                locationManager.startMonitoring(for: beaconRegion1)
                locationManager.startMonitoring(for: beaconRegion2)
            }


            func beaconManager(manager: Any, didEnterRegion: CLBeaconRegion) {

                switch CLBeaconRegion() {

                case beaconRegion1:
                    let storyboard = UIStoryboard(name: "Main", bundle: nil)
                    let controller = storyboard.instantiateViewController(withIdentifier: "exhibitions")
                    self.window?.rootViewController?.present(controller, animated: true, completion: nil)


                case beaconRegion2: break

                default: break

                }
            }

    }


func applicationWillEnterForeground(_ application: UIApplication) {
    // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
}

func applicationDidBecomeActive(_ application: UIApplication) {
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

func applicationWillTerminate(_ application: UIApplication) {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}


}

1 个答案:

答案 0 :(得分:0)

为了更容易上手,您可以尝试在嵌套条件之外将调用移至startScanning(),或使用调试器查看代码的进入和退出区域部分是否实际被调用。

以下是一些简化的示例代码,可帮助您入门:

import UIKit
import CoreLocation

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    var locationManager: CLLocationManager!
    let beaconRegion1 = CLBeaconRegion(proximityUUID: UUID(uuidString: "2F234454-CF6D-4AOF-ADF2-F4911BA9FFA6")!, identifier: "AuschwitzAlbum")

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        requestLocationAuthorization()
        return true
    }

    // Standard AppDelegate implementations here
}

extension AppDelegate : CLLocationManagerDelegate {

    func requestLocationAuthorization() {
        if CLLocationManager.authorizationStatus() != .authorizedAlways {
            locationManager.requestAlwaysAuthorization()
        }
    }

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status == .authorizedAlways {
            startMonitoringRegion()
        }
    }

    func startMonitoringRegion() {
        locationManager.startMonitoring(for: beaconRegion1)
    }

    func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
        print("Did enter region \(region.identifier)")
        if region.identifier == beaconRegion1.identifier{
            showViewController()
        }
    }

    func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
        print("Did exit region \(region.identifier)")
    }

    func showViewController() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let controller = storyboard.instantiateViewController(withIdentifier: "exhibitions")
        self.window?.rootViewController?.present(controller, animated: true, completion: nil)
    }
}