Swift:用户位置附近的Geofencing / geolocations [英] Swift: Geofencing / geolocations near user location

查看:151
本文介绍了Swift:用户位置附近的Geofencing / geolocations的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图让它始终使用用户的位置,并不断检查以查看是否它距离我设置的 CLLocationCoordinate2D 点有5英里。如果是这样,它会在应用程序处于打开状态时发送提醒,或者在应用程序关闭时发出通知。



有用的信息:



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

Locations.swift 包含 CLLocationCoordinate2D 点。



Utilities.swift 包含一个简单的提醒。 b
UserLocation.swift检索并更新用户的位置
$ b $ GeoLocationViewController.swift监视器地点



注意: 有些代码可能不在正确的位置或相关,我正在寻找另一个项目,试图从它提取相关的代码来使用我的项目。请告诉我你是否犯了错误。



代码: em> Locations.swift:

 导入UIKit 
导入MapKit

class Locations:UIViewController {

override func viewDidLoad(){
super.viewDidLoad()
var radius:CLLocationDistance = 5
let arroyo = CLLocationCoordinate2D(纬度:33.781327997137595 ,经度:-116.46394436519012)
var arroyoCoord:CLLocationCoordinate2D = arroyo

让buddyrogers = CLLocationCoordinate2D(纬度:33.78051204742721,经度:-116.46362250010833)
var buddyCoord:CLLocationCoordinate2D = buddyrogers

让chopsticks = CLLocationCoordinate2D(纬度:33.815995425565184,经度:-116.44107442645873)
让colorfulfountain = CLLocationCoordinate2D(纬度:33.80443304398751,经度:-116.45723923544313)
让diamond = C地理坐标2D(纬度:33.80216859530781,经度:-116.45711048941041)
让dinahshore = CLLocationCoordinate2D(纬度:33.806554795852996,经度:-116.47734507421876)
让fountoflife = CLLocationCoordinate2D(纬度:33.78075282028137,经度:-116.46407847564086)
让fountains = CLLocationCoordinate2D(纬度:33.780141969313235,经度:-116.46346156756744)
let historicphoto = CLLocationCoordinate2D(纬度:33.78130570353292,经度:-116.46389072100982)
让整体= CLLocationCoordinate2D(纬度:33.781338029257775,经度:-116.46408249895438 )
让hollywoodheroes = CLLocationCoordinate2D(纬度:33.78095792254918,经度:-116.45820483068849)
让indiangathering = CLLocationCoordinate2D(纬度:33.78136366689296,经度:-116.46371905963287)
让indianwomen = CLLocationCoordinate2D(纬度:33.78622660767695,经度:-1 16.45820483068849)
让大教堂= CLLocationCoordinate2D(纬度:33.844502990031124,经度:-116.45834321534426)
让firehouse = CLLocationCoordinate2D(纬度:33.78103817982461,经度:-116.46700744788512)
letunionunion = CLLocationCoordinate2D(纬度:33.778193459376865经度:-116.45877843062743)
让lizards = CLLocationCoordinate2D(纬度:33.78104263855992,经度:-116.46340792338714)
让cactus = CLLocationCoordinate2D(纬度:33.782598723009976,经度:-116.46699671904906)
let swisscheese = CLLocationCoordinate2D (纬度:33.78121541437478,经度:-116.46472086469993)
let newbeginning = CLLocationCoordinate2D(纬度:33.78049421237406,经度:-116.46463101069793)
让thunderbolt = CLLocationCoordinate2D(纬度:33.80140187863324,经度:-116.46646603445436)
让tictoc = CLLocationCoordinate2D(纬度:经度:-116.45524367193605)
让wheeloftime = CLLocationCoordinate2D(纬度:33.815987530910135,经度: CLLocationCoordinate2D(纬度:33.78012700000001,经度:-116.46571840000001)
让colinfisher = CLLocationCoordinate2D(纬度:33.7819228,经度:-116.46002010000001)
让garycreative = CLLocationCoordinate2D(纬度:33.782660,经度:-116.462141)
让lesliejean = CLLocationCoordinate2D(纬度:33.78404799999999,经度:-116.4635222)
让rebeccafine = CLLocationCoordinate2D(纬度:33.782487,经度:-116.460564)
让agnes = CLLocationCoordinate2D(纬度:33.77571242620008,经度:-116.46372063254091 )
let willardprice = CLLocationCoordinate2D(纬度: (纬度:33.77479870632753,经度:-116.46673050629039)
让valsamuelson = CLLocationCoordinate2D CLLocationCoordinate2D(纬度:33.7794358,经度:-116.4612692)
让townsquare = CLLocationCoordinate2D(纬度:33.7810365,经度:-116.46464559999998)
let ocotillo = CLLocationCoordinate2D(纬度:33.805963,经度:-116.46349980000002)
让世纪= CLLocationCoordinate2D(纬度:33.8269913,经度:-116.4424588)
让denniskeat = CLLocationCoordinate2D(纬度:33.8304982,经度:-116.45744730000001)
让纪念馆= CLLocationCoordinate2D(纬度:33.78318512716751,经度:-116.46681405767208 )
让爱国者= CLLocationCoordinate2D(纬度:33.8019902897174,longi tude:-116.44000872473146)
let panorama = CLLocationCoordinate2D(纬度:33.83861734636407,经度:-116.46799619895023)
let secondst = CLLocationCoordinate2D(纬度:33.78069442561766,经度:-116.45910418200071)
let dogpark = CLLocationCoordinate2D(纬度:33.7804269,经度:-116.46041309999998)


}

}

Utilities.swift:

  import UIKit 
import MapKit

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

UserLocation.swift:

  import UIKit 
import CoreLocation
$ b $ class UserLocation:UIViewController,CLLocationManagerDelegate {
var locationManager = CLLocationManager()

重写func viewDidLoad(){
super.viewDidLoad()
$ b $ 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,CLLocationManagerD elegate {

让locationManager = CLLocationManager()

覆盖func viewDidLoad(){
super.viewDidLoad()

locationManager.delegate = self
locationManager.requestAlwaysAuthorization()

//加载视图后执行其他任何设置。
}

重写func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
//处理任何可以重新创建的资源。
}

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
返回区域
}

func startMonitoringGeotification(geotification:Locations){
// 1
if!CLLocationManager.isMonitoringAvailableForClass(CLCircularRegion){
showSimpleAlertWithTitle(Error,message:Geofencing is not supported on this device!,viewController:self)
返回
}
// 2
如果CLLocationManager.authorizationStatus()!= .AuthorizedAlways {
showSimpleAlertWithTitle(Warning,message:您的地理位置已保存,但只会被激活一旦您授予访问设备位置的权限。,viewContr (区域)


$ b $ 3 b
$ b func stopMonitoringGeotification(geotification:Locations){
为locationManager.monitoredRegions中的区域{
如果让circularRegion = region为? CLCircularRegion {
if circularRegion.identifier == geotification.identifier {
locationManager.stopMonitoringForRegion(circularRegion)
}
}
}
}

func locationManager(manager:CLLocationManager,monitoringDidFailForRegion region:CLRegion ?, withError error:NSError){
print(Monitoring for failed with region:\(region!.identifier))


func locationManager(manager:CLLocationManager,didFailWithError error:NSError){
print(Location Manager failed with error:\(error))
}


$ / code>


解决方案

首先,将 startMonitoringGeotification() regionWithGeotification() stopMonitoringGeotification() code>取得 Geotification ,例如Ray Wenderlich tu torial。确保你已经将他的起始代码中的文件 Geotification.swift 添加到你的项目中。

另外,请确保你的 Main。故事板启动您的 ViewController 。没有这一步,你的代码都不会运行。


$ b $ 1更简单地在 Locations.swift 中重新定义您的 Locations 类: p>

 导入UIKit 
导入MapKit

类位置{

static让位置:[字符串:CLLocationCoordinate2D] = [
buddyrogers:CLLocationCoordinate2D(纬度:33.815995425565184,经度:-116.44107442645873),
diamond:CLLocationCoordinate2D(纬度:33.802168595307814,经度:-116.45711048941041),

。 //添加您的位置

]
}
}

像@ hungry-yeti建议
<2>您可以在 GeotificationViewController showSimpleAlertWithTitle() $ c>类。尝试在 ViewDidLoad()中调用它来测试它。您现在可以删除 Utilities.swift



3)我认为您可以忽略/删除 UserLocation.swift ,这似乎是不必要的



4)将此代码放入 GeotificationViewController 的 ViewDidLoad

  let radius = CLLocationDistance(8046.72)//以英尺计的5英里

Locations.locations {
let g = Geotification(coordinate:location.1,radius:radius,identifier:location.0,note:test,eventType:EventType.OnEntry)
startMonitoringGeotification( g)
}

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

Problem:

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.

Useful Information:

In my project I have 4 swift files:

Locations.swift holds the CLLocationCoordinate2D points.

Utilities.swift holds a simple alert.

UserLocation.swift retrieves and updates the user's location

GeoLocationViewController.swift monitors the locations

Note:

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.

Code:

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

}

解决方案

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.

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

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

like the @hungry-yeti suggested

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) I think you can ignore/remove UserLocation.swift, this seems unnecessary

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) I hope this helps and simplifies your code. Party on, reply here if you have any issues.

这篇关于Swift:用户位置附近的Geofencing / geolocations的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆