Приложение на основе местоположения с использованием CL Location. Возникли проблемы с одной строкой в ​​моем коде - PullRequest
0 голосов
/ 12 января 2020

Я делаю это приложение и получаю эту ошибку "Значение типа 'LocationsStorage' не имеет члена 'saveCLLocationToDisk'"

Я не могу понять, почему проблема, и я даже пытался посмотреть в документацию на сайте Apple, но я до сих пор не знаю, в чем проблема. Соответствующая строка после раздела 4

import UIKit
import CoreLocation
import UserNotifications

@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {
  var window: UIWindow?
  static let geoCoder = CLGeocoder()

  let center = UNUserNotificationCenter.current()
  let locationManager = CLLocationManager()

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    let rayWenderlichColor = UIColor(red: 0/255, green: 104/255, blue: 55/255, alpha: 1)
    UITabBar.appearance().tintColor = rayWenderlichColor
    center.requestAuthorization(options: [.alert, .sound]) { granted, error in

    }
    locationManager.requestAlwaysAuthorization()
    locationManager.startMonitoringVisits()
    locationManager.delegate = self as? CLLocationManagerDelegate

    locationManager.distanceFilter = 35
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.startUpdatingLocation()
    return true
  }

}
extension AppDelegate: CLLocationManagerDelegate {
  func locationManager(_ manager: CLLocationManager, didVisit visit: CLVisit) {
    // create CLLocation from the coordinates of the CLVisit
    let clLocation = CLLocation(latitude: visit.coordinate.latitude, longitude: visit.coordinate.longitude)
    AppDelegate.geoCoder.reverseGeocodeLocation(clLocation) { placemarks, _ in
      if let place = placemarks?.first {
        let description = "\(place)"
        self.newVisitReceived(visit, description: description)
      }
    }

  }

  func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
      // 1
      guard let location = locations.first else {
        return
      }

      // 2
      AppDelegate.geoCoder.reverseGeocodeLocation(location) { placemarks, _ in
      if let place = placemarks?.first {
        // 3
        let description = "Fake visit: \(place)"

        //4
        let fakeVisit = FakeVisit(
          coordinates: location.coordinate,
          arrivalDate: Date(),
          departureDate: Date())
        self.newVisitReceived(fakeVisit, description: description)
      }
    }
  }
  // MY issue is here in the line with the ** before and after it
  func newVisitReceived(_ visit: CLVisit, description: String) {
    let location = Location(visit: visit, descriptionString: description)
    **LocationsStorage.shared.saveLocationOnDisk(location)**

    // save location to the disk

    // Get location description

    let content = UNMutableNotificationContent()
    content.title = "New Journal Entry ?"
    content.body = location.description
    content.sound = .default

    let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
    let request = UNNotificationRequest(identifier: location.dateString, content: content, trigger: trigger)

    center.add(request, withCompletionHandler: nil)

  }

}

final class FakeVisit: CLVisit {
  private let myCoordinates: CLLocationCoordinate2D
  private let myArrivalDate: Date
  private let myDepartureDate: Date

  override var coordinate: CLLocationCoordinate2D {
    return myCoordinates
  }

  override var arrivalDate: Date {
    return myArrivalDate
  }

  override var departureDate: Date {
    return myDepartureDate
  }

  init(coordinates: CLLocationCoordinate2D, arrivalDate: Date, departureDate: Date) {
    myCoordinates = coordinates
    myArrivalDate = arrivalDate
    myDepartureDate = departureDate
    super.init()
  }

  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

1 Ответ

1 голос
/ 12 января 2020

Похоже, вы работаете над следующим учебным пособием

Чуть более половины учебного пособия содержит раздел и блок кода, который выглядит следующим образом:

Сохранение записей на диске

Откройте LocationsStorage.swift. В нижней части класса добавьте следующую функцию:

func saveLocationOnDisk(_ location: Location) {
  // 1
  let encoder = JSONEncoder()
  let timestamp = location.date.timeIntervalSince1970

  // 2
  let fileURL = documentsURL.appendingPathComponent("\(timestamp)")

  // 3
  let data = try! encoder.encode(location)

  // 4
  try! data.write(to: fileURL)

  // 5
  locations.append(location)
}

Убедитесь, что вы добавили этот метод и используете правильное имя для вызова метода в своем коде

...