2017-01-01 36 views
0

我正在制作一个具有多个视图的应用程序。我希望它能够在所有视图的背景下监视信标。所以,我在App委托中设置了代码。当代码在应用程序委托中时,它什么也不做。如果我将它移动到第一个视图控制器加载,它将要求授权使用位置,但在进入信标区域时不执行操作。这是应用程序委托中的代码。我究竟做错了什么?从Appdelegate设置iBeacon操作和监控

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:. 
} 


} 
+0

当应用程序进入灯塔区域,它应该显示视图,指出“你输入XXX地区将你想看到的。关于XXX的展品?“如果他们点击是,它会将他们带到适当的位置。如果他们不点击,它会简单地关闭视图。 –

+0

创建自己的单例可能更有趣,而不是用AppDelegate的代码覆盖太多。 – Larme

回答

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: beaconRegion) 
    } 

    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) 
    } 
}