I had a problem that when traveling by boat the GPS dropped working for the boating app after a few seconds. Then I discovered that when picking up the iphone, the GPS information, that was read by the boating app, returned. At first I had the idea that the GPS signals were weak and my body fluids worked as a kind of extra antenna. But then by accident I noticed that the GPS signal returned when there were some waves that caused the boat to move extra. And so it turns out that Apple has apparently built in a security risk feature that when the iphone is not moving (apart from the very slow movement of the boat) it switches GPS off. Probably is this to protect us from being tracked in some way.
An adult approach would leave it to the user to decide if this is a risk the user wants to take (so introduce a setting to turn off this security measure). But not so at Apple. I am getting very tired of trying to find ways to get around the unspecified safety measures that are not under control by me, the user.
This is NOT a small minor problem. The app that I use is the most used boating app at least in the Netherlands. The developers got thousands of complaints from apple users and in spite of specifying that location services can be used always as specified by the developers the user should do,all these users couldn’t use the app and basically had to buy an Android phone! Actually the developpers were totally in the dark because it had worked properly before.
So Is there a work around?? (I am building now a little device to keep my iphone mechanically moving now as a solution but I prefer as software solution!!!!)
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
I am working with an app for tracking driving activity. Currently, I have code that combines CLLocationManager location updates with motion data from CMMotionActivityManager.
My codebase is not straightforward and requires manual starts/stops, etc. After watching the WWDC session about CLLocationUpdate.liveUpdates (https://developer.apple.com/wwdc23/10180) with the specific LiveConfiguration.automotiveNavigation, I thought it was exactly what I needed. Moreover, the presenter mentioned that it could simplify code and remove the dependency on CMMotionActivityManager.
I downloaded the demo project from here https://developer.apple.com/documentation/corelocation/adopting-live-updates-in-core-location, adapted it for iOS 17, and changed CLLocationUpdate.liveUpdates() to CLLocationUpdate.liveUpdates(.automotiveNavigation). However, the result was not what I expected. I received location updates after waking from a stationary state by lightly touching the device, which is not "automotive." Additionally, the changes to LiveConfiguration do not seem to affect the behavior.
What did I do wrong? Or what is the point of LiveConfiguration that I missed?
Thanks,
As we know CLCircularRegion, startMonitoring(for:), CLBeaconRegion are deprecated after iOS 18.0
My question is: when will these APIs stop working ?
Will it continue to work on iOS 18.1? what about iOS 19?
Hey, I have a problem. I was using MKMapView in my app, and in the view where I had a background at the top of the screen, in the example it was Color.red, it extended all the way to the top of the screen. Now, I wanted to switch to the newer Map and I'm seeing an issue because I'm getting a navigation bar that cuts off my color as I indicated in the picture. Does anyone know why this is happening and if there's another way to achieve this?
Steps to reproduce:
Change MapView() to Map() to see difference
import SwiftUI
import MapKit
@main
struct TestAppApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
struct ContentView: View {
var body: some View {
NavigationStack {
ScrollView(.vertical) {
Color.red
.padding(.top, -200)
.frame(height: 200)
MapView().frame(minHeight: 300) // change this line to Map
}
.navigationTitle("Title")
.navigationBarTitleDisplayMode(.large)
}
}
}
private typealias ViewControllerRepresentable = UIViewControllerRepresentable
struct MapView: ViewControllerRepresentable {
typealias ViewController = UIViewController
class Controller: ViewController {
var mapView: MKMapView {
guard let tempView = view as? MKMapView else {
fatalError("View could not be cast as MapView.")
}
return tempView
}
override func loadView() {
let mapView = MKMapView()
view = mapView
}
}
func makeUIViewController(context: Context) -> Controller {
Controller()
}
func updateUIViewController(_ controller: Controller, context: Context) {
update(controller: controller)
}
func update(controller: Controller) {
}
}
#Preview {
ContentView()
}
I got:
I want:
Hello,
There are some countries, with political conflicts on borders, does MapKit JS support displaying the map depending on the point of view of the region ?
if yes, how technically is done (like adding an attribute region on request params or something else) ?
Thanks
Hello,
As you stated that "MapKit JS provides a free daily limit of 250,000 map views and 25,000 service calls per Apple Developer Program membership." , I have two questions :
are user interactions (zooming, panning, and switching theme) included in the billed map views ?
is this limits similar for the enterprise account ? if not, please give us more details.
Thanks
I am encountering some issues with location services in macOS apps. Despite including the necessary keys in the app’s info.plist, I am unable to request user location permission. Here are the details:
Cannot request location permission using requestWhenInUseAuthorization(), ie., no location permission grant permissions popup is appearing.
The app contains NSLocationUsageDescription in the info.plist. I have also tested by adding NSLocationAlwaysAndWhenInUseUsageDescription, NSLocationWhenInUseUsageDescription, and NSLocationAlwaysUsageDescription, but it didn't work.
So to show the location request popup, I was directly(irrespective of the authorizationStatus) requesting location using requestLocation(), which showed the location permission grant permissions popup. But then I encountered another issue. If the popup is left as it is, every time requestLocation() is called a new location request popup appears (which comes after allowing/denying the popup). Also observed that didChangeAuthorization is only called on allowing/denying the last location request pop up.
Initial calls to CLLocationManager().authorizationStatus return Not Determined.
When I checked the location permission state of my app on launch, I used to get not Determined for some time, even if the permission was granted.
Code snippet:
private var locationManager: CLLocationManager {
let lm = CLLocationManager()
lm.delegate = self
lm.desiredAccuracy = kCLLocationAccuracyBest
return lm
}
private var currentAuthorizationStatus: CLAuthorizationStatus {
if #available(macOS 11.0, *) {
return CLLocationManager().authorizationStatus
} else {
return CLLocationManager.authorizationStatus()
}
}
switch currentAuthorizationStatus {
case .notDetermined:
print("requesting permission")
locationManager.requestWhenInUseAuthorization()
case .restricted, .denied:
print("location permission is restricted")
case .authorizedAlways, .authorizedWhenInUse, .authorized:
print("requesting location")
locationManager.requestLocation()
@unknown default:
print("Unknown error occurred")
}
I would appreciate any guidance or suggestions on how to resolve these issues. Thank you!
个别手机在系统iOS17.5.1 开启定位的场景下会出现定位失败。
I'm trying to diagnose a crash we're seeing in an app that's on TestFlight at the moment.
We have the background location permission and are woken by various events, e.g. the significant location change event. I believe the app is being woken in the background and within a few seconds (about 7s in the example below) the app crashes. The crash appears to be when we are confirming what location authorisation the app currently has.
As far as we know this is only happening for a single user.
Any thoughts on what could be happening? Other forum posts led me to believe it was related to leaking background tasks but I didn't think that was likely after only 7s (and there's no actual mention of background tasks in the crash).
Other threads in the crash log have core data relate tasks going on and while we've done a lot of work on our multi-threaded core data I could imagine that being a cause, but surely that would show as a crash on the threads involved rather than thread 0?
Any help appreciated, crash log below.
John
AppVariant: 1:iPhone9,3:15
Beta: YES
Code Type: ARM-64 (Native)
Role: Non UI
Parent Process: launchd [1]
Date/Time: 2021-12-13 10:31:18.0065 +0000
Launch Time: 2021-12-13 10:31:11.4169 +0000
OS Version: iPhone OS 15.1 (19B74)
Release Type: User
Baseband Version: 6.00.00
Report Version: 104
Exception Type: EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Triggered by Thread: 0
Thread 0 name:
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x00000001bdd7cb10 mach_msg_trap + 8
1 libsystem_kernel.dylib 0x00000001bdd7d134 mach_msg + 72 (mach_msg.c:119)
2 libdispatch.dylib 0x0000000183f9c734 _dispatch_mach_send_and_wait_for_reply + 504 (mach.c:815)
3 libdispatch.dylib 0x0000000183f9caec dispatch_mach_send_with_result_and_wait_for_reply$VARIANT$mp + 52 (mach.c:2019)
4 libxpc.dylib 0x00000001de30f458 xpc_connection_send_message_with_reply_sync + 236 (connection.c:974)
5 Foundation 0x0000000185a0387c __NSXPCCONNECTION_IS_WAITING_FOR_A_SYNCHRONOUS_REPLY__ + 12 (NSXPCConnection.m:223)
6 Foundation 0x0000000185a09194 -[NSXPCConnection _sendInvocation:orArguments:count:methodSignature:selector:withProxy:] + 2368 (NSXPCConnection.m:1649)
7 Foundation 0x0000000185a49f8c -[NSXPCConnection _sendSelector:withProxy:arg1:arg2:arg3:] + 148 (NSXPCConnection.m:1294)
8 Foundation 0x00000001859ece6c _NSXPCDistantObjectSimpleMessageSend3 + 80 (NSXPCDistantObject.m:282)
9 CoreLocation 0x000000018b0bba0c -[CLLocationInternalClient getAuthorizationStatus:forBundleID:orBundlePath:] + 140 (LocationInternal.m:786)
10 CoreLocation 0x000000018b0ba1fc CLInternalGetAuthorizationStatus + 268 (LocationInternal.m:2063)
11 CoreLocation 0x000000018b0df1c4 +[CLLocationManager _authorizationStatusForBundleIdentifier:bundle:] + 80 (CLClient.mm:1391)
Stopped updating the location of my family members on June 21st while they can see my location just fine. Restarted, turned on and off sharing, nothing works. any suggestions?
My team and I would like to develop a mechanism that collects the user’s location a few times per day, to detect when the user travels to a different country, for the user’s convenience. The app is very likely going to be opened very rarely. The user would of course be made aware of why collecting the location a few times a day is desired - namely, saving them the effort of having to remember to open the app every time they travel.
My question is the following: given that the app would rarely be interacted with, what is the best strategy for collecting the location? The goal is to handle scenarios where the OS might avoid sending location events or notifications to the app. I imagine that the backend might need to intervene and send the occasional push notification to remind the user to open the app from time to time.
There are 3 strategies that I’m aware of:
LocationManager’s startMonitoringSignificantLocationChanges
Scheduling BGAppRefreshTasks
Using silent push notifications scheduled by the server. Ideally, using a location push service extension
Keeping in mind the “Background execution demystified” WWDC session, documentation, and other threads, I concluded the following:
The first idea is probably the least suitable, since it probably requires the app to be opened often, and the location updates would not be sent by OS if the app has been terminated from the app switcher.
The second approach would also suffer from infrequent use and termination.
The third approach seems not to be affected as much by infrequent usage. I understand that the 3rd strategy might also lead to the OS omitting to wake up the app when it has been terminated by the user.
How would you implement this mechanism?
I'm on MacOS 15 Beta and Xcode 16 Beta.
Running iOS 18 Beta on a 15 Pro Max.
I'm leveraging the .mapItemDetailSheet(item: input) option to pull up a sheet that displays the Place Card for a selection made from a List of places.
What I'm seeing is that the first tap fails to pull up the sheet and it auto closes pretty much immediately. But then loads correctly on the second tap.
Other times it will not auto close, but simply fail to load the item details in the sheet. Again, though, if I close the sheet and tap a second time it loads without issue.
I'm posting to get some feedback as to whether this is most likely caused by bad code (I'm very new to this) or if it is known behavior and due to the Beta software. Any insight from the community would be helpful.
Thanks in advance.
We receive a complaint from a user that the compass heading in our paragliding app differs from the heading in Compass app (preinstalled on iOS). During our research, it was found that third-party apps show the wrong compass heading.
We get the compass heading according to the documentation (https://developer.apple.com/documentation/corelocation/getting-heading-and-course-information#Get-the-current-heading):
func locationManager(_ manager: CLLocationManager, didUpdateHeading heading: CLHeading) {
magneticHeading = heading.magneticHeading
trueHeading = heading.trueHeading
}
The video linked below shows our app and the third-party app getting the compass heading of 270 degrees, and Compass app (preinstalled) getting the compass heading of 30 degrees.
https://drive.google.com/file/d/1HPMRWWq1E_bFYZVyCeqB2Fo-AfG4q9J7/view?usp=share_link
This problem appears to the user unpredictably and the correct compass heading is shown by Compass app (preinstalled). He has iPhone 15 Pro Max and iOS 17.4.1.
The presence of this problem is very critical as it can cause fatal accidents.
Previously (and still, according to the documentation) building a Map Snapshot URL required building the URL with all its parameters, and then signing it using your private key.
However, the URL created via the "Create a map" tool simply appends the pre-generated token on the end of the URL. And if I build a URL and do the same thing - append the token, but do not create a signature - the snapshot is generated correctly. (Omitting the token leads to a "not authenticated" message).
Is this a new, easier way to generate snapshots?
Hello! I want to create an indoor mapping application in Swift, using the LiDAR scanner. I searched among frameworks and I found that ARKit, RealityKit and RoomPlan would be useful. Which is the proper way to create a 2D indoor mapping app? And which is the proper way to create a 3D indoor mapping app? Are there any modifications I have to make on my code in order to have both?
Our test devices running the Dev Beta 1 for iOS 18 no longer recieve updates from the CLMonitor async stream (for try await event in await monitor.events) when the app is in the background and suspended. This works fine in iOS 17.
I only have one CLMonitor.CircularGeographicCondition active at any given time, they switch out dynamically in the background based on the user's location. Another thing is that visit tracking and significant location changes continue to work as expected in the background.
I have submitted feedback (FB13883553) but I'm curious if this is an undocumented policy change or a bug.
I hope to use SwiftUI and MapKit to achieve the effect of a globe view when zooming out on the map. The code works in Xcode’s simulator and Simulator, but when running on my iPhone, it only zooms out to a flat world map. I haven’t found anyone else encountering the same issue, so I’d like to ask where the problem might be. Below is the simple code:
import SwiftUI
import MapKit
struct GlobalTest: View {
var body: some View {
Map(position: .constant(.automatic), interactionModes: [.all, .pan, .pitch, .rotate, .zoom]) {
}
.mapStyle(.hybrid(elevation: .realistic,
pointsOfInterest: .including([.park]),
showsTraffic: false))
}
}
#Preview {
GlobalTest()
}
I have also tried setting the camera properties, but it still doesn’t work. My phone is an iPhone 15 Pro Max, running iOS 17.5.1, and I am in mainland China. The Xcode version is the latest. If anyone understands the reason, please let me know. This is very important to me, and I would be very grateful!
I'm using MapKit JS to plot markers on a Map - so far so good. I've noticed that it doesn't always show the Suburb name for the location of the marker . Here's an example:
The marker is located in Hornsby which isn't showing on the map. If I move the market to an adjacent suburb Wahroonga I get the following:
Now Wahroonga isn't showing but Hornsby is showing. I'm trying to find if there's a control that determines when the suburb for the marker is shown or not but haven't been able to find anything so far.
I would also like to know if I can control the visibility of suburb names at different zoom levels. If you look at this map you can see the names of various suburbs (Bondi, Bondi Beach, North Bondi etc):
but when I zoom in one level these all disappear and I cannot easily locate which suburb the market is in:
Is there a way to always show the suburb names so users can easily locate themselves on the map in reference to the suburbs that they might not be familiar with?
Edit: The issue was resolved. It's back up.
I was streaming the new MapKit Places video, and it suddenly stopped. It's now missing from the Developer app and website. Is this intentional?
Description:
I am working on an iOS 17 app using Xcode 15 and SwiftUI. The app involves displaying points of interest (POIs) on a MapView based on user proximity and other factors such as hours of operation. The data for the POIs is stored in a JSON file, which I am trying to import and parse in the project. However, I have encountered several issues:
Deprecation Errors:
When attempting to use MapAnnotation, I receive deprecation warnings and errors. It seems that MapAnnotation has been deprecated in iOS 17, and I need to use the new Annotation API along with MapContentBuilder.
RandomAccessCollection Conformance:
Errors related to RandomAccessCollection conformance when using Map with SwiftUI.
JSON Import and Parsing:
I used Bundle.main.url(forResource: "locations", withExtension: "json") to load the JSON file but faced issues with correctly parsing and mapping the JSON data to my model objects.
What I Need:
Guidance on how to correctly use the new Annotation API and MapContentBuilder for displaying POIs on a MapView in iOS 17.
Best practices for importing and parsing JSON files in SwiftUI, especially for dynamically updating the MapView based on user proximity and other criteria like hours of operation.
Any relevant code snippets or examples would be greatly appreciated.
Example of What We Tried
Model:
swift
Copy code
struct POI: Codable, Identifiable {
let id: Int
let name: String
let latitude: Double
let longitude: Double
let hours: [String: String]
}
Loading JSON:
swift
Copy code
func loadPOIs() -> [POI] {
guard let url = Bundle.main.url(forResource: "locations", withExtension: "json"),
let data = try? Data(contentsOf: url) else {
return []
}
let decoder = JSONDecoder()
return (try? decoder.decode([POI].self, from: data)) ?? []
}
Map View:
swift
Copy code
import SwiftUI
import MapKit
struct ContentView: View {
@State private var pois: [POI] = loadPOIs()
@State private var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 40.7128, longitude: -74.0060),
span: MKCoordinateSpan(latitudeDelta: 0.05, longitudeDelta: 0.05)
)
var body: some View {
Map(coordinateRegion: $region, annotationItems: pois) { poi in
MapAnnotation(coordinate: CLLocationCoordinate2D(latitude: poi.latitude, longitude: poi.longitude)) {
VStack {
Text(poi.name)
Circle().fill(Color.red).frame(width: 10, height: 10)
}
}
}
}
}
Issues Encountered:
MapAnnotation is deprecated.
Errors related to RandomAccessCollection conformance.
Any advice or solutions for these issues would be greatly appreciated. Thank you!