I'm currently working on an app that requires location-based notifications, particularly utilizing geofencing to trigger alerts when a user enters specific areas, such as when a student walks into a college campus. However, I'm curious about the behavior of such notifications when the app is fully terminated and not running in the background.
Does anyone have experience implementing geofencing and location-based notifications in apps that are fully terminated? Are these functionalities still active, or does the app need to be running in the background for them to work properly?
Any insights, experiences, or best practices regarding this matter would be greatly appreciated.
Thank you in advance for your help!
Maps & Location
RSS for tagLearn how to integrate MapKit and Core Location to unlock the power of location-based features in your app.
Post
Replies
Boosts
Views
Activity
hi,
I want to develop an APP in Android that will send an iBeacon, but I found all third-party lib only support scan iBeacon. Does anyone know the solution?
thanks!
I have a problem getting cg point from coordinate with MKsnapshotter.
It works well with .flyover or .satellite map type but when using .satelliteFlyover cg point gets invalid value.
Can you guys help me to get correct value?
I attach screenshot here.
Using SwiftUI, MapKit and the Map() view in iOS 17, I'm adding markers and annotations to the map instance. However it seems regardless of what order they are added, they are rendered with random Z-index values. I've not found any modifiers to specify any kind of priority.
Is there a way to declare Z-index priority of Marker and Annotation views?
I have more than 2000 location pins in SwiftData.
My model like this:
@Model
class HaritaModel {
let id: Int
let sto_title: String
let sto_latitude: Double
let sto_longitude: Double
let sto_address: String
let sto_city: String
let sto_country: String
init(id: Int, sto_title: String, sto_latitude: Double, sto_longitude: Double, sto_address: String, sto_city: String, sto_country: String) {
self.id = id
self.sto_title = sto_title
self.sto_latitude = sto_latitude
self.sto_longitude = sto_longitude
self.sto_address = sto_address
self.sto_city = sto_city
self.sto_country = sto_country
}
}
I want to take the user's location and show them the pins at a certain distance. I want these pins to be dynamically updated when the user pan or zoom the map.
The code I am trying to write is as follows:
//
// HaritaTest.swift
//
import SwiftUI
import MapKit
import SwiftData
struct HaritaTest: View {
@Environment(\.modelContext) private var contextHarita
@Query private var harita: [HaritaModel]
@State private var userPosition: MapCameraPosition = .userLocation(fallback: .automatic)
@State private var userCoordinate: CLLocationCoordinate2D?
var body: some View {
Text("Total Boutique \(harita.count)")
Map(initialPosition: { userPosition }) { haritaView in
ForEach(harita) { point in
if let userCoordinate = userCoordinate,
let stoLatitude = point.sto_latitude,
let stoLongitude = point.sto_longitude,
let latitude = Double(stoLatitude),
let longitude = Double(stoLongitude) {
let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
if haritaView.contains(coordinate: coordinate) {
MapPin(coordinate: coordinate)
}
}
}
}
.onAppear {
CLLocationManager().requestWhenInUseAuthorization()
getUserLocation()
}
}
private func getUserLocation() {
if let userLocation = CLLocationManager().location {
userCoordinate = userLocation.coordinate
}
}
}
struct HaritaTest_Previews: PreviewProvider {
static var previews: some View {
HaritaTest()
}
}
can you support me?
thanks in advance
Is there a possibility to enable the public transport layer like in the Maps app?
We're recently requested a Mapkit JS / Mapkit Server api limit increase request and are waiting to hear back before we push an important update to our app which switches to mapkit via server apis.
We don't often go over the 25k daily limit, but there can be spikes where the app goes very viral and we'll need well over 25k – likely above 50k based on historic usage.
I was wondering if there's any way to expedite our limit request? Or how do we get notified if our limit has been approved, is there any way to check?
Would using one of our Code-level support requests (TSIs) be a good idea here?
Thanks!
Hello there,
Mainland china user(s) have trouble accessing MapKitJS, keeps returning HTTP 401 unauthorized for https://cdn.apple-mapkit.com/ma/bootstrap?apiVersion=2&mkjsVersion=5.77.35.
The same valid JWT perfectly works for users rest of the world.
May i know is there any special handling needed for accessing mapkitJS on web from mainland china compared to rest of the world.
Advises are highly appreciated.
I have not tested on the lower version but it seems like it is not functioning properly on iOS 17.4.
It does work with CircularGeographicCondition but not with BeaconIdentityCondition.
I am testing with this example code by Apple. I have typed proper UUID of my iBeacon device but it is never discovered.
Some other posts say that it has not been working since iOS 17.3.1.
Anyone having the same issue with me?
Hi, I've discovered that my app's location can be manipulated using iMyFone. I've searched extensively online for solutions, but haven't found anything effective. Do you have any insights on how I can prevent this manipulation using Swift code? Thanks for your help in advance.
Any suggestions on how to display multi-polygons within MapKit for SwiftUI(https://developer.apple.com/documentation/mapkit/mappolygon)?
At the moment it is not supported and only supported by MapKit for UIKit(https://developer.apple.com/documentation/mapkit/mkmultipolygon) . Any idea on how to bridge these over?
If they had used .task they could have removed the class LocationsHandler: ObservableObject and simply done:
struct ContentView: View {
@State var lastLocation: CLLocation?
var body: some View {
VStack {
...
}
.task {
let updates = CLLocationUpdate.liveUpdates()
for try await update in updates {
if let loc = update.location {
self.lastLocation = loc
}
}
}
And saved themselves about 20 or so lines of code. .task was added in the year before so it isn't the case that it wasn't available to the CoreLocation team yet. To wrap async/await in a Combine's ObservableObject is very strange. They could have also used @AppStorage instead of UserDefaults and saved another few lines. To be honest this is some of the strangest SwiftUI code I've seen.
I have a Python script that returns a scan result with scanForNetworksWithName using CoreWLAN with PyObjC. It provides info on ssid and such like the airport command.
When upgrading to MacOS 14.4 however SSID is now Null. I read this was due to changes in permissions and location services needed to be enabled.
I have enabled access to location services and I am able to use CoreLocation to get a location however I still do now see the SSID.
Here is my script, that does both location and scan:
import CoreWLAN
import CoreLocation
from time import sleep
import re
wifi_interface = CoreWLAN.CWInterface.interface()
networks, error = wifi_interface.scanForNetworksWithName_error_(None, None)
location_manager = CoreLocation.CLLocationManager.alloc().init()
location_manager.startUpdatingLocation()
max_wait = 60
# Get the current authorization status for Python
for i in range(1, max_wait):
authorization_status = location_manager.authorizationStatus()
if authorization_status == 3 or authorization_status == 4:
print("Python has been authorized for location services")
break
if i == max_wait-1:
exit("Unable to obtain authorization, exiting")
sleep(1)
coord = location_manager.location().coordinate()
lat, lon = coord.latitude, coord.longitude
print("Your location is %f, %f" % (lat, lon))
print(f"{'SSID' : >32} {'BSSID' : <17} RSSI CHANNEL HT CC SECURITY")
for i in networks:
print(f"{'SSID' : >32} {'BSSID' : <17} RSSI CHANNEL HT CC SECURITY")
for i in networks:
print(f"{i.ssid() or '' : >32} {i.bssid() or '' : <17} {i.rssiValue() : <4} {i.channel() : <6}")
It worked fine in MacOS 13.6 but with MacOS 14.4 I have the null SSID issue.
We went through something similar with MacOS 10.15 where BSSID became Null. At the time I couldn't find a workaround, but sometime around MacOS 13.x I was able to generate the request for location services. After granting the request I was able to see BSSID again. It seems like we have a similar bug to this again.
Thread about the BSSID issue:
https://github.com/ronaldoussoren/pyobjc/issues/484
Hi
I want to inquire about the data returned from CoreLocation update and whether it is accurate.
I am attempting to retrieve the local address in Japan based on the postal code, and I have observed differences in the returned data.
When calling the information retrieval function with the postal code 3360042, the returned data is as follows:
Locality: さいたま市
SubLocality: 南区
Corresponding to Japan Post:
https://www.post.japanpost.jp/cgi-zip/zipcode.php?pref=11&city=1111080&id=38748
the displayed information on the website includes "Locality + SubLocality".
When calling the information retrieval function with the postal code 1350064, the returned data is as follows:
Locality: 江東区
SubLocality: 青海
Corresponding to Japan Post japan post:
https://www.post.japanpost.jp/cgi-zip/zipcode.php?pref=11&city=1111080&id=38748
the displayed information on the website only includes "Locality" not includes SubLocality.
Is it possible that CoreLocation has been updated? The current data seems to deviate from the design of our application.
Please provide me with a solution to determine when to use "Locality + SubLocality" versus just "Locality" to obtain the local address.
Thank.
I need to fetch nearby places within a 3 km radius using the Apple Maps API
If I load a map while my device is online, I can access this map offline via the default caching mechanism. I need to be able to identify if a map cache is unavailable when my device is offline and react accordingly. For example, if I am offline and I load a map and the cache is unavailable i.e the map tiles are greyed out, I want to display a message to the user. The AppKit delegate had a method to identify when a map loaded but I do not see an equivilient way of doing this in Map. Any ideas?
Hello,
We have an iOS application which detects when the user starts driving by detecting an USB iBeacon which is installed in the car of the users. For that we are monitoring the iBeacon region with CoreLocation and we are detecting the iBeacon when the locationManager(_:didDetermineState:for:) delegate method is called.
We received some reports from a user that the iBeacon monitoring stops working when a specific BT device (specifically a hearing aid) is connected to the iPhone. The hearing aid is connected in the iOS Settings > Bluetooth page, similar how a regular BT headset is connected. When the hearing aid is disconnected then the iBeacon monitoring resumes and starts working properly again.
We can't reproduce this issue with our BT headsets, so maybe the problem is specific to just some BT device connections?
The advertising time interval of the iBeacon is 100mS as requested in the Apple documentation.
Previously we had problems when a phone call was made through a BT headset when we used an advertising interval > 100mS in order to improve the battery usage of the iBeacon. But we changed to use an USB iBeacon, so the battery usage is not a concern anymore.
Did somebody experience similar issues or has a solution? Specifically, can some specific BT connections set up in iOS Settings > Bluetooth page interfere with the iBeacon monitoring when using CoreLocation?
Thank you very much!
This problem cannot be solved and the review is not approved
although the Documentation implies that multiple CLLocationManager running in parallel should not intervene one another. I find some evidence that they do:
for example a Medium posts title: "Single vs Multi CLLocationManager solutions" states:
In multi instances of CLLocationManagers solution, there is the risk of collision where a feature / settings can impacts across instances of CLLocationManagers.
another Medium post titled: "Measuring Differences of Degrees Using CLLocation’s CLHeading" states:
however an important condition is that Apple recommends you initialize only ONE instance within your application at a time. This is because multiple instances running simultaneously has the effect of causing interference and distorting the data
so is there some risk using CLLocationManager in parallel. is the configuration properties such as desiredAccuracy and distanceFilter can interrupt different CLLocationManagers running in parallel?
I would love to know if there is a way to manipulate how the scene size is set initially.
I see that we have mapkit.MapSize(width, height) at our disposal but there isn't any clear documentation on its use case in the MapKit docs.
I had to do some hacky workaround where I had to set the size like this.
`
size = new mapkit.MapSize(1000, 600)
map = new mapkit.Map("map");
map._impl._scene._size = size
`
Is there a better way to handle this? On safari it is not setting correctly.