2017-01-01 31 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) 
    } 
}