Skip to content

Commit

Permalink
#82 Forcing ETA refresh when the user doesn't use the expected travel…
Browse files Browse the repository at this point in the history
… mode
  • Loading branch information
lpernelle-woosmap authored Jun 13, 2022
2 parents 2910abe + c9085a9 commit edaca5b
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 59 deletions.
2 changes: 2 additions & 0 deletions Sample/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate,UNUserNotificationCenterDe

WoosmapGeofencing.shared.startTracking(configurationProfile: ConfigurationProfile.passiveTracking)

WoosmapGeofencing.shared.OptimizeDistanceRequest = false

// Check if the authorization Status of location Manager
if CLLocationManager.authorizationStatus() != .notDetermined {
WoosmapGeofencing.shared.startMonitoringInBackground()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public class RegionIsochrone: Object {
@objc public dynamic var duration = 0;
@objc public dynamic var durationText = "";
@objc public dynamic var type = "isochrone";
@objc public dynamic var expectedAverageSpeed:Double = -1;

convenience init(latitude: Double, longitude: Double, radius: Int, dateCaptured: Date, identifier: String, didEnter: Bool, fromPositionDetection: Bool) {
self.init()
Expand All @@ -48,20 +49,22 @@ public class RegionIsochrones {

public class func updateRegion(id: String, didEnter: Bool, distanceInfo: Distance) -> RegionIsochrone {
do {
let regionToUpdate = RegionIsochrones.getRegionFromId(id: id)
if regionToUpdate != nil {
if let regionToUpdate = RegionIsochrones.getRegionFromId(id: id){
let averageSpeed:Double = Double(distanceInfo.distance) / Double(distanceInfo.duration)
let realm = try Realm()
realm.beginWrite()
regionToUpdate!.distance = distanceInfo.distance
regionToUpdate!.distanceText = distanceInfo.distanceText ?? ""
regionToUpdate!.duration = distanceInfo.duration
regionToUpdate!.durationText = distanceInfo.durationText ?? ""
regionToUpdate!.didEnter = didEnter
regionToUpdate!.date = Date()
realm.add(regionToUpdate!)
regionToUpdate.distance = distanceInfo.distance
regionToUpdate.distanceText = distanceInfo.distanceText ?? ""
regionToUpdate.duration = distanceInfo.duration
regionToUpdate.durationText = distanceInfo.durationText ?? ""
regionToUpdate.didEnter = didEnter
regionToUpdate.expectedAverageSpeed = averageSpeed
regionToUpdate.date = Date()
realm.add(regionToUpdate)
try realm.commitWrite()
return regionToUpdate!
return regionToUpdate
}

} catch {
}
return RegionIsochrone()
Expand Down
105 changes: 57 additions & 48 deletions WoosmapGeofencing/Sources/WoosmapGeofencing/Monitor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -547,16 +547,12 @@ public class LocationService: NSObject, CLLocationManagerDelegate {

let userLatitude: String = String(format: "%f", locationOrigin.coordinate.latitude)
let userLongitude: String = String(format: "%f", locationOrigin.coordinate.longitude)
var coordinateDestinations = ""
for i in 0 ..< coordinatesDest.count {
let destLatitude: String = String(format: "%f", Double(coordinatesDest[i].0))
let destLongitude: String = String(format: "%f", Double(coordinatesDest[i].1))
coordinateDestinations += destLatitude + "," + destLongitude
if i != coordinatesDest.count-1 {
coordinateDestinations += "|"
}
var coordinatesDestList: [String] = []
coordinatesDest.forEach { item in
coordinatesDestList.append("\(item.0),\(item.1)")
}

let coordinateDestinations = coordinatesDestList.joined(separator: "|")

var storeAPIUrl = ""
if(distanceProvider == DistanceProvider.woosmapDistance) {
storeAPIUrl = String(format: distanceWoosmapAPI, distanceMode.rawValue, distanceUnits.rawValue, distanceLanguage, userLatitude, userLongitude, coordinateDestinations)
Expand All @@ -567,43 +563,46 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
let url = URL(string: storeAPIUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!

// Call API Distance
let task = URLSession.shared.dataTask(with: url) { [self] (data, response, error) in
if let response = response as? HTTPURLResponse {
if response.statusCode != 200 {
NSLog("statusCode: \(response.statusCode)")
delegateDistance.distanceAPIError(error: "Error Distance API " + String(response.statusCode))
return
}
if let error = error {
NSLog("error: \(error)")
} else {
let distance = Distances.addFromResponseJson(APIResponse: data!,
locationId: locationId,
origin: locationOrigin,
destination: coordinatesDest,
distanceProvider: distanceProvider,
distanceMode: distanceMode,
distanceUnits: distanceUnits,
distanceLanguage: distanceLanguage,
trafficDistanceRouting: trafficDistanceRouting)


if (regionIsochroneToUpdate) {
self.updateRegionWithDistance(distanceAr: distance)
let task = URLSession.shared.dataTask(with: url) { [weak self] (data, response, error) in
DispatchQueue.main.async {
if let response = response as? HTTPURLResponse {
if response.statusCode != 200 {
delegateDistance.distanceAPIError(error: "Error Distance API " + String(response.statusCode))
return
}

delegateDistance.distanceAPIResponse(distance: distance)

if(locationId != "" && !distance.isEmpty) {
guard let delegateSearch = self.searchAPIDataDelegate else {
return
if let error = error {
NSLog("error: \(error)")
} else {
let distance = Distances.addFromResponseJson(APIResponse: data!,
locationId: locationId,
origin: locationOrigin,
destination: coordinatesDest,
distanceProvider: distanceProvider,
distanceMode: distanceMode,
distanceUnits: distanceUnits,
distanceLanguage: distanceLanguage,
trafficDistanceRouting: trafficDistanceRouting)


if (regionIsochroneToUpdate) {
self?.updateRegionWithDistance(distanceAr: distance)
}

let distanceValue = distance.first?.distance
let duration = distance.first?.durationText
let poiUpdated = POIs.updatePOIWithDistance(distance: Double(distanceValue!), duration: duration!, locationId: locationId)
if poiUpdated.locationId != nil {
delegateSearch.searchAPIResponse(poi: poiUpdated)

delegateDistance.distanceAPIResponse(distance: distance)

if(locationId != "" && !distance.isEmpty) {
guard let delegateSearch = self?.searchAPIDataDelegate else {
return
}
if let calculatedDistance = distance.first {
let distanceValue = calculatedDistance.distance
let duration = calculatedDistance.durationText ?? ""
let poiUpdated = POIs.updatePOIWithDistance(distance: Double(distanceValue), duration: duration, locationId: locationId)
if poiUpdated.locationId != nil {
delegateSearch.searchAPIResponse(poi: poiUpdated)
}
}

}
}
}
Expand Down Expand Up @@ -646,7 +645,6 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
for regionIsoIdentifer in regionIsoTodelete {
RegionIsochrones.removeRegionIsochrone(id: regionIsoIdentifer)
}

}

public func didEventRegionIsochrone(regionIsochrone: RegionIsochrone) {
Expand Down Expand Up @@ -741,7 +739,8 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
let regionsIsochrones = RegionIsochrones.getAll()
var regionsBeUpdated = false
for regionIso in regionsIsochrones {
let distance = location.distance(from: CLLocation(latitude: regionIso.latitude, longitude: regionIso.longitude))
let distance = location.distance(from: CLLocation(latitude: regionIso.latitude,
longitude: regionIso.longitude))
if (distance < Double(distanceMaxAirDistanceFilter)) {
let spendtime = -regionIso.date!.timeIntervalSinceNow
let timeLimit = (regionIso.duration - regionIso.radius)/2
Expand All @@ -750,6 +749,17 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
regionsBeUpdated = true
}
}
else{
if (!optimizeDistanceRequest){
if (spendtime > 60){ //1 minute
let averageSpeed:Double = distance/spendtime
let averageSpeedLimit:Double = regionIso.expectedAverageSpeed * 2
if(averageSpeed > averageSpeedLimit){
regionsBeUpdated = true
}
}
}
}
}
if(regionsBeUpdated) {
break
Expand All @@ -759,7 +769,6 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
if(regionsBeUpdated) {
calculateDistanceWithRegion(location: location, locationId: locationId)
}

}

func calculateDistanceWithRegion(location: CLLocation, locationId: String = "") {
Expand Down Expand Up @@ -1019,7 +1028,7 @@ public class LocationService: NSObject, CLLocationManagerDelegate {
SFMCAPIclient.pushDataToMC(poiData: propertyDictionary,eventDefinitionKey: SFMCCredentials["zoiClassifiedExitedEventDefinitionKey"]!)
}
}

}

public extension Date {
Expand Down
3 changes: 3 additions & 0 deletions WoosmapGeofencing/Sources/WoosmapGeofencing/Settings.swift
Original file line number Diff line number Diff line change
Expand Up @@ -114,3 +114,6 @@ public var SFMCAccesToken = ""

public var poiRadius:Any = ""

// Save API consumption by not forcing ETA refresh when the user doesn't use the expected travel mode, Default: true
public var optimizeDistanceRequest: Bool = true

Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import RealmSwift
}

private func initRealm() {
Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 6)
Realm.Configuration.defaultConfiguration = Realm.Configuration(schemaVersion: 7)
}

public func getLocationService() -> LocationService {
Expand Down Expand Up @@ -345,5 +345,15 @@ import RealmSwift

} catch { print(error) }
}


public var OptimizeDistanceRequest: Bool {
get {
return optimizeDistanceRequest
}
set {
optimizeDistanceRequest = newValue
}
}

}

0 comments on commit edaca5b

Please sign in to comment.