<i id='V34Tb'><tr id='V34Tb'><dt id='V34Tb'><q id='V34Tb'><span id='V34Tb'><b id='V34Tb'><form id='V34Tb'><ins id='V34Tb'></ins><ul id='V34Tb'></ul><sub id='V34Tb'></sub></form><legend id='V34Tb'></legend><bdo id='V34Tb'><pre id='V34Tb'><center id='V34Tb'></center></pre></bdo></b><th id='V34Tb'></th></span></q></dt></tr></i><div id='V34Tb'><tfoot id='V34Tb'></tfoot><dl id='V34Tb'><fieldset id='V34Tb'></fieldset></dl></div>
    • <bdo id='V34Tb'></bdo><ul id='V34Tb'></ul>

    <legend id='V34Tb'><style id='V34Tb'><dir id='V34Tb'><q id='V34Tb'></q></dir></style></legend>

      <tfoot id='V34Tb'></tfoot>

      1. <small id='V34Tb'></small><noframes id='V34Tb'>

        Swift:用户位置附近的地理围栏/地理位置

        时间:2023-09-02

        <small id='U6CKc'></small><noframes id='U6CKc'>

        <legend id='U6CKc'><style id='U6CKc'><dir id='U6CKc'><q id='U6CKc'></q></dir></style></legend>

          <bdo id='U6CKc'></bdo><ul id='U6CKc'></ul>

                <tbody id='U6CKc'></tbody>

                1. <tfoot id='U6CKc'></tfoot>
                2. <i id='U6CKc'><tr id='U6CKc'><dt id='U6CKc'><q id='U6CKc'><span id='U6CKc'><b id='U6CKc'><form id='U6CKc'><ins id='U6CKc'></ins><ul id='U6CKc'></ul><sub id='U6CKc'></sub></form><legend id='U6CKc'></legend><bdo id='U6CKc'><pre id='U6CKc'><center id='U6CKc'></center></pre></bdo></b><th id='U6CKc'></th></span></q></dt></tr></i><div id='U6CKc'><tfoot id='U6CKc'></tfoot><dl id='U6CKc'><fieldset id='U6CKc'></fieldset></dl></div>
                  本文介绍了Swift:用户位置附近的地理围栏/地理位置的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  问题:

                  我试图让它一直使用用户的位置,并不断检查它是否在我设置的 CLLocationCoordinate2D 点的 5 英里范围内.如果是这样,它会在应用程序打开时发送警报,或者在应用程序关闭时发送通知.

                  I'm trying to make it so that it uses the user's location all the time and constantly checks to see if it is within 5 miles of the CLLocationCoordinate2D points I have set. If so, it sends a alert if the app is open or a notification if the app is closed.

                  有用信息:

                  在我的项目中,我有 4 个 swift 文件:

                  In my project I have 4 swift files:

                  Locations.swift 包含 CLLocationCoordinate2D 点.

                  Utilities.swift 包含一个简单的警报.

                  Utilities.swift holds a simple alert.

                  UserLocation.swift 检索并更新用户的位置

                  UserLocation.swift retrieves and updates the user's location

                  GeoLocationViewController.swift 监控位置

                  注意:

                  某些代码可能不在正确的位置或不相关,我正在查看另一个项目,试图从中提取相关代码以在我的项目中使用.请告诉我你是否发现了错误.

                  Some code may not be in the right place or relevant, I was looking at another project trying to extract relevant code from it to use in my project. Please tell me if you do catch a mistake.

                  代码:

                  Locations.swift:

                  import UIKit
                  import MapKit
                  
                  class Locations: UIViewController {
                  
                      override func viewDidLoad() {
                          super.viewDidLoad()
                          var radius: CLLocationDistance = 5        
                          let arroyo = CLLocationCoordinate2D (latitude: 33.781327997137595, longitude: -116.46394436519012)
                          var arroyoCoord: CLLocationCoordinate2D = arroyo
                  
                          let buddyrogers = CLLocationCoordinate2D (latitude: 33.78051204742721, longitude: -116.46362250010833)
                          var buddyCoord: CLLocationCoordinate2D = buddyrogers
                  
                          let chopsticks = CLLocationCoordinate2D (latitude: 33.815995425565184, longitude: -116.44107442645873)
                          let colorfulfountain = CLLocationCoordinate2D (latitude: 33.80443304398751, longitude: -116.45723923544313)
                          let diamond = CLLocationCoordinate2D (latitude: 33.80216859530781, longitude: -116.45711048941041)
                          let dinahshore = CLLocationCoordinate2D (latitude: 33.806554795852996, longitude: -116.47734507421876)
                          let fountoflife = CLLocationCoordinate2D (latitude: 33.78075282028137, longitude: -116.46407847564086)
                          let fountains = CLLocationCoordinate2D (latitude: 33.780141969313235, longitude: -116.46346156756744)
                          let historicphoto = CLLocationCoordinate2D (latitude: 33.78130570353292, longitude: -116.46389072100982)
                          let holistic = CLLocationCoordinate2D (latitude: 33.781338029257775, longitude: -116.46408249895438)
                          let hollywoodheroes = CLLocationCoordinate2D (latitude: 33.78095792254918, longitude: -116.45820483068849)
                          let indiangathering = CLLocationCoordinate2D (latitude: 33.78136366689296, longitude: -116.46371905963287)
                          let indianwomen = CLLocationCoordinate2D (latitude: 33.78622660767695, longitude: -116.45820483068849)
                          let cathedrals = CLLocationCoordinate2D (latitude: 33.844502990031124, longitude: -116.45834321534426)
                          let firehouse = CLLocationCoordinate2D (latitude: 33.78103817982461, longitude: -116.46700744788512)
                          let perfectunion = CLLocationCoordinate2D (latitude: 33.778193459376865, longitude: -116.45877843062743)
                          let lizards = CLLocationCoordinate2D (latitude: 33.78104263855992, longitude: -116.46340792338714)
                          let cactus = CLLocationCoordinate2D (latitude: 33.782598723009976, longitude: -116.46699671904906)
                          let swisscheese = CLLocationCoordinate2D (latitude: 33.78121541437478, longitude: -116.46472086469993)
                          let newbeginning = CLLocationCoordinate2D (latitude: 33.78049421237406, longitude: -116.46463101069793)
                          let thunderbolt = CLLocationCoordinate2D (latitude: 33.80140187863324, longitude: -116.46646603445436)
                          let tictoc = CLLocationCoordinate2D (latitude: 33.80156235478469, longitude: -116.45524367193605)
                          let wheeloftime = CLLocationCoordinate2D (latitude: 33.815987530910135, longitude: -116.45892863433227)         
                          let artevita = CLLocationCoordinate2D (latitude: 33.7826633, longitude: -116.46041969999999)
                          let coachellaart = CLLocationCoordinate2D (latitude: 33.78012700000001, longitude: -116.46571840000001)
                          let colinfisher = CLLocationCoordinate2D (latitude: 33.7819228, longitude: -116.46002010000001)
                          let garycreative = CLLocationCoordinate2D (latitude: 33.782660, longitude: -116.462141)
                          let lesliejean = CLLocationCoordinate2D (latitude: 33.78404799999999, longitude: -116.4635222)
                          let rebeccafine = CLLocationCoordinate2D (latitude: 33.782487, longitude: -116.460564)        
                          let agnes = CLLocationCoordinate2D (latitude: 33.77571242620008, longitude: -116.46372063254091)
                         let willardprice = CLLocationCoordinate2D (latitude: 33.77489419346815, longitude: -116.46667910908434)
                         let adobe = CLLocationCoordinate2D (latitude: 33.77479870632753, longitude: -116.46673050629039)
                          let valsamuelson = CLLocationCoordinate2D (latitude: 33.76802162366799, longitude: -116.46920998147584)
                          let gallito = CLLocationCoordinate2D (latitude: 33.7794358, longitude: -116.4612692)        
                          let townsquare = CLLocationCoordinate2D (latitude: 33.7810365, longitude: -116.46464559999998)
                          let ocotillo = CLLocationCoordinate2D (latitude: 33.805963, longitude: -116.46349980000002)
                          let century = CLLocationCoordinate2D (latitude: 33.8269913, longitude: -116.4424588)
                          let denniskeat = CLLocationCoordinate2D (latitude: 33.8304982, longitude: -116.45744730000001)
                          let memorial = CLLocationCoordinate2D (latitude: 33.78318512716751, longitude: -116.46681405767208)
                          let patriot = CLLocationCoordinate2D (latitude: 33.8019902897174, longitude: -116.44000872473146)
                          let panorama = CLLocationCoordinate2D (latitude: 33.83861734636407, longitude: -116.46799619895023)
                          let secondst = CLLocationCoordinate2D (latitude: 33.78069442561766, longitude: -116.45910418200071)
                          let dogpark = CLLocationCoordinate2D (latitude: 33.7804269, longitude: -116.46041309999998)
                  
                  
                      }
                  
                  }
                  

                  Utilities.swift:

                  import UIKit
                  import MapKit
                  
                  func showSimpleAlertWithTitle(title: String!, message: String, viewController: UIViewController) {
                      let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
                      let action = UIAlertAction(title: "OK", style: .Cancel, handler: nil)
                      alert.addAction(action)
                      viewController.presentViewController(alert, animated: true, completion: nil)
                  }
                  

                  UserLocation.swift:

                  import UIKit
                  import CoreLocation
                  
                  class UserLocation: UIViewController, CLLocationManagerDelegate {
                      var locationManager = CLLocationManager()
                  
                      override func viewDidLoad() {
                          super.viewDidLoad()
                  
                          if (CLLocationManager.locationServicesEnabled()) {
                              locationManager = CLLocationManager()
                              locationManager.delegate = self
                              locationManager.desiredAccuracy = kCLLocationAccuracyBest
                              locationManager.requestAlwaysAuthorization()
                              locationManager.startUpdatingLocation()
                          }
                  
                          locationManager.delegate = self
                          locationManager.requestAlwaysAuthorization()
                  
                      }
                  
                  }
                  

                  GeoLocationViewController.swift:

                  import UIKit
                  import CoreLocation
                  
                  class GeoLocationViewController: UIViewController, CLLocationManagerDelegate {
                  
                      let locationManager = CLLocationManager()
                  
                      override func viewDidLoad() {
                          super.viewDidLoad()
                  
                          locationManager.delegate = self
                          locationManager.requestAlwaysAuthorization()
                  
                          // Do any additional setup after loading the view.
                      }
                  
                      override func didReceiveMemoryWarning() {
                          super.didReceiveMemoryWarning()
                          // Dispose of any resources that can be recreated.
                      }
                  
                      func regionWithGeotification(geotification: Locations) -> CLCircularRegion {
                          // 1
                          let region = CLCircularRegion(center: geotification.coordinate, radius: geotification.radius, identifier: geotification.identifier)
                          // 2
                          region.notifyOnEntry = (geotification.eventType == .OnEntry)
                          region.notifyOnExit = !region.notifyOnEntry
                          return region
                      }
                  
                      func startMonitoringGeotification(geotification: Locations) {
                          // 1
                          if !CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion) {
                              showSimpleAlertWithTitle("Error", message: "Geofencing is not supported on this device!", viewController: self)
                              return
                          }
                          // 2
                          if CLLocationManager.authorizationStatus() != .AuthorizedAlways {
                              showSimpleAlertWithTitle("Warning", message: "Your geotification is saved but will only be activated once you grant permission to access the device location.", viewController: self)
                          }
                          // 3
                          let region = regionWithGeotification(geotification)
                          // 4
                          locationManager.startMonitoringForRegion(region)
                      }
                  
                      func stopMonitoringGeotification(geotification: Locations) {
                          for region in locationManager.monitoredRegions {
                              if let circularRegion = region as? CLCircularRegion {
                                  if circularRegion.identifier ==  geotification.identifier {
                                      locationManager.stopMonitoringForRegion(circularRegion)
                                  }
                              }
                          }
                      }
                  
                      func locationManager(manager: CLLocationManager, monitoringDidFailForRegion region: CLRegion?, withError error: NSError) {
                          print("Monitoring failed for region with identifier: (region!.identifier)")
                      }
                  
                      func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
                          print("Location Manager failed with the following error: (error)")
                      }
                  
                  }
                  

                  推荐答案

                  首先,改回 startMonitoringGeotification()regionWithGeotification()stopMonitoringGeotification() 来学习一个 Geotification,就像 Ray Wenderlich 教程一样.确保您已将文件 Geotification.swift 从他的起始代码添加到您的项目中.

                  First and foremost, change back startMonitoringGeotification(), regionWithGeotification(), and stopMonitoringGeotification() to take in a Geotification like the Ray Wenderlich tutorial. Make sure you have added the file Geotification.swift from his starter code to your project.

                  另外,确保您的 Main.storyboard 启动您的 ViewController.如果没有这一步,您的任何代码都不会运行.

                  Also, make sure your Main.storyboard launches your ViewController. Without this step, none of your code will run.

                  1) 在 Locations.swift 中更简单地重新定义您的 Locations 类:

                  1) redefine your Locations class more simply in Locations.swift:

                  import UIKit
                  import MapKit
                  
                  class Locations {
                  
                    static let locations:[String:CLLocationCoordinate2D] = [
                      "buddyrogers" : CLLocationCoordinate2D(latitude: 33.815995425565184, longitude: -116.44107442645873),
                      "diamond"     : CLLocationCoordinate2D(latitude: 33.802168595307814, longitude: -116.45711048941041),
                       . 
                       .    // add your locations
                       .
                      ]
                    }
                  }
                  

                  就像@hungry-yeti 建议的那样

                  like the @hungry-yeti suggested

                  2) 您可以在 GeotificationViewController 类中定义 showSimpleAlertWithTitle().尝试在您的 ViewDidLoad() 中调用它来测试它.您现在可以删除 Utilities.swift.

                  2) You can define showSimpleAlertWithTitle() in your GeotificationViewController class. Try calling it in your ViewDidLoad() to test it. You can now delete Utilities.swift.

                  3) 我认为你可以忽略/删除 UserLocation.swift,这似乎没有必要

                  3) I think you can ignore/remove UserLocation.swift, this seems unnecessary

                  4) 将此代码放入GeotificationViewControllerViewDidLoad:

                  4) Put this code inside GeotificationViewController's ViewDidLoad:

                  let radius = CLLocationDistance(8046.72) // 5 miles in meters
                  
                  for location in Locations.locations {
                    let g = Geotification(coordinate: location.1, radius: radius, identifier: location.0, note: "test", eventType: EventType.OnEntry)
                      startMonitoringGeotification(g)
                  }
                  

                  5) 我希望这有助于并简化您的代码.派对,如果您有任何问题,请在此处回复.

                  5) I hope this helps and simplifies your code. Party on, reply here if you have any issues.

                  这篇关于Swift:用户位置附近的地理围栏/地理位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:在应用启动期间获取当前位置 下一篇:通过 NSFetchedResultsController 按距离排序的核心数据

                  相关文章

                  最新文章

                  <legend id='bkzmW'><style id='bkzmW'><dir id='bkzmW'><q id='bkzmW'></q></dir></style></legend>

                3. <tfoot id='bkzmW'></tfoot>
                  <i id='bkzmW'><tr id='bkzmW'><dt id='bkzmW'><q id='bkzmW'><span id='bkzmW'><b id='bkzmW'><form id='bkzmW'><ins id='bkzmW'></ins><ul id='bkzmW'></ul><sub id='bkzmW'></sub></form><legend id='bkzmW'></legend><bdo id='bkzmW'><pre id='bkzmW'><center id='bkzmW'></center></pre></bdo></b><th id='bkzmW'></th></span></q></dt></tr></i><div id='bkzmW'><tfoot id='bkzmW'></tfoot><dl id='bkzmW'><fieldset id='bkzmW'></fieldset></dl></div>

                      <small id='bkzmW'></small><noframes id='bkzmW'>

                        <bdo id='bkzmW'></bdo><ul id='bkzmW'></ul>