我在IOS中有监控用户位置的项目,当他经过他想要的地方时,应用程序会通知他..这是我的代码
import UIKit
import MapKit
import CoreLocation
import UserNotifications
import FirebaseDatabase
import FirebaseAuth
class testingViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
var users: User?
var todoList = [Todo] ()
let usersRef = FIRDatabase.database().reference(withPath: "Users")
var snapshot: [FIRDataSnapshot]! = []
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
FIRAuth.auth()?.addStateDidChangeListener() { auth, user in
if user != nil {
guard let user = user else { return }
self.users = User(authData: user)
let currentUserRef = self.usersRef.child((self.users?.uid)!)
currentUserRef.setValue(self.users?.email)
print(user.uid)
} else {
print("Not signed in")
}
}
// 2. setup locationManager
locationManager.delegate = self;
// self.locationManager = CLLocationManager()
// locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters;
// locationManager.desiredAccuracy = kCLLocationAccuracyBest
// locationManager.startMonitoringSignificantLocationChanges()
// locationManager.startUpdatingLocation()
// setup mapView
mapView.delegate = self
mapView.showsUserLocation = true
mapView.userTrackingMode = .follow
// 4. setup test data
setupData()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// 1. status is not determined
if CLLocationManager.authorizationStatus() == .notDetermined {
locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization()
}
// 2. authorization were denied
else if CLLocationManager.authorizationStatus() == .denied {
print("Location services were previously denied. Please enable location services for this app in Settings.")
}
// 3. we do have authorization
else if CLLocationManager.authorizationStatus() == .authorizedAlways {
// locationManager.startUpdatingLocation()
locationManager.startMonitoringSignificantLocationChanges();
}
}
func setupData() {
let usercur = (FIRAuth.auth()?.currentUser?.uid)!
let test = FIRDatabase.database().reference(fromURL: "https://ade-mc-trial.firebaseio.com/Data")
test.child(usercur).child("ToDoList").observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
// 1. check if system can monitor regions
if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
// 2. region data
let title = "medical collage"
let coordinate = CLLocationCoordinate2DMake(25.900767, 45.3411889)
let regionRadius = 350.0
// 3. setup region
let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: coordinate.latitude,
longitude: coordinate.longitude), radius: regionRadius, identifier: title)
self.locationManager.startMonitoring(for: region)
// 4. setup annotation
let restaurantAnnotation = MKPointAnnotation()
restaurantAnnotation.coordinate = coordinate;
restaurantAnnotation.title = "\(title)";
self.mapView.addAnnotation(restaurantAnnotation)
// 5. setup circle
let circle = MKCircle(center: coordinate, radius: regionRadius)
self.mapView.add(circle)
}
else {
print("System can't track regions")
}
}})
}
// 6. draw circle
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let circleRenderer = MKCircleRenderer(overlay: overlay)
circleRenderer.strokeColor = UIColor.blue
circleRenderer.lineWidth = 1.0
return circleRenderer
}
// 1. user enter region
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
let notification = UILocalNotification()
notification.fireDate = NSDate(timeIntervalSinceNow: 0) as Date
notification.alertBody = "Hey you! Yeah you! Swipe to unlock!"
notification.alertAction = "be awesome!"
notification.soundName = UILocalNotificationDefaultSoundName
notification.userInfo = ["CustomField1": "w00t"]
UIApplication.shared.scheduleLocalNotification(notification)
/*
guard let settings = UIApplication.shared.currentUserNotificationSettings else { return }
if settings.types == .none {
let ac = UIAlertController(title: "Can't schedule", message: "Either we don't have permission to schedule notifications, or we haven't asked yet.", preferredStyle: .alert)
ac.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(ac, animated: true, completion: nil)
return
}*/
}
/* func showAlert(_ title: String) {
let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: { (action) in
alert.dismiss(animated: true, completion: nil)
}))
self.present(alert, animated: true, completion: nil)
}*/
}
但是当我想将它与数据库 - firebase-链接时,它迫使我纠正三行来添加“self”。我在行中添加星号,迫使我添加“自我”..然后代码不起作用并且在添加'self'后没有显示通知
import UIKit
import MapKit
import CoreLocation
import UserNotifications
import FirebaseDatabase
import FirebaseAuth
class testingViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {
@IBOutlet weak var mapView: MKMapView!
var users: User?
var todoList = [Todo] ()
let usersRef = FIRDatabase.database().reference(withPath: "Users")
var snapshot: [FIRDataSnapshot]! = []
let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
FIRAuth.auth()?.addStateDidChangeListener() { auth, user in
if user != nil {
guard let user = user else { return }
self.users = User(authData: user)
let currentUserRef = self.usersRef.child((self.users?.uid)!)
currentUserRef.setValue(self.users?.email)
print(user.uid)
} else {
print("Not signed in")
}
}
// 2. setup locationManager
locationManager.delegate = self;
// self.locationManager = CLLocationManager()
// locationManager.distanceFilter = kCLLocationAccuracyNearestTenMeters;
// locationManager.desiredAccuracy = kCLLocationAccuracyBest
// locationManager.startMonitoringSignificantLocationChanges()
// locationManager.startUpdatingLocation()
// setup mapView
mapView.delegate = self
mapView.showsUserLocation = true
mapView.userTrackingMode = .follow
// 4. setup test data
setupData()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// 1. status is not determined
if CLLocationManager.authorizationStatus() == .notDetermined {
locationManager.requestAlwaysAuthorization()
locationManager.requestWhenInUseAuthorization()
}
// 2. authorization were denied
else if CLLocationManager.authorizationStatus() == .denied {
print("Location services were previously denied. Please enable location services for this app in Settings.")
}
// 3. we do have authorization
else if CLLocationManager.authorizationStatus() == .authorizedAlways {
// locationManager.startUpdatingLocation()
locationManager.startMonitoringSignificantLocationChanges();
}
}
func setupData() {
let usercur = (FIRAuth.auth()?.currentUser?.uid)!
let test = FIRDatabase.database().reference(fromURL: "https://ade-mc-trial.firebaseio.com/Data")
test.child(usercur).child("ToDoList").observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
// 1. check if system can monitor regions
if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
// 2. region data
let title = "medical collage"
let coordinate = CLLocationCoordinate2DMake(25.900767, 45.3411889)
let regionRadius = 350.0
// 3. setup region
let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: coordinate.latitude,
longitude: coordinate.longitude), radius: regionRadius, identifier: title)
self.locationManager.startMonitoring(for: region)//*****************
// 4. setup annotation
let restaurantAnnotation = MKPointAnnotation()
restaurantAnnotation.coordinate = coordinate;
restaurantAnnotation.title = "\(title)";
self.mapView.addAnnotation(restaurantAnnotation)//***************
// 5. setup circle
let circle = MKCircle(center: coordinate, radius: regionRadius)
self.mapView.add(circle)//*******************************
}
else {
print("System can't track regions")
}
}})
}
// 6. draw circle
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let circleRenderer = MKCircleRenderer(overlay: overlay)
circleRenderer.strokeColor = UIColor.blue
circleRenderer.lineWidth = 1.0
return circleRenderer
}
// 1. user enter region
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
let notification = UILocalNotification()
notification.fireDate = NSDate(timeIntervalSinceNow: 0) as Date
notification.alertBody = "Hey you! Yeah you! Swipe to unlock!"
notification.alertAction = "be awesome!"
notification.soundName = UILocalNotificationDefaultSoundName
notification.userInfo = ["CustomField1": "w00t"]
UIApplication.shared.scheduleLocalNotification(notification)
}
}
请有人有解决方案吗?
答案 0 :(得分:0)
我认为关闭不理解self
。
一般而言,您应该使用self
的弱引用而不是强引用。尝试创建self
的弱引用并将其放入闭包中。
代码将如下更改。
func setupData() {
weak var weakSelf = self //Updates
let usercur = (FIRAuth.auth()?.currentUser?.uid)!
let test = FIRDatabase.database().reference(fromURL: "https://ade-mc-trial.firebaseio.com/Data")
test.child(usercur).child("ToDoList").observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.exists() {
// 1. check if system can monitor regions
if CLLocationManager.isMonitoringAvailable(for: CLCircularRegion.self) {
// 2. region data
let title = "medical collage"
let coordinate = CLLocationCoordinate2DMake(25.900767, 45.3411889)
let regionRadius = 350.0
// 3. setup region
let region = CLCircularRegion(center: CLLocationCoordinate2D(latitude: coordinate.latitude,
longitude: coordinate.longitude), radius: regionRadius, identifier: title)
weakSelf.locationManager.startMonitoring(for: region)//Updates
// 4. setup annotation
let restaurantAnnotation = MKPointAnnotation()
restaurantAnnotation.coordinate = coordinate;
restaurantAnnotation.title = "\(title)";
weakSelf.mapView.addAnnotation(restaurantAnnotation)//Updates
// 5. setup circle
let circle = MKCircle(center: coordinate, radius: regionRadius)
weakSelf.mapView.add(circle)//Updates
}
else {
print("System can't track regions")
}
}})
}