Hello, I'm somewhat new to CarPlay integration and am having an issue. I have ready through Apple's CarPlay Programming Guide, reviewed their code samples and have exhausted my searches online to help find a solution to my problem.
I have been unable to get a basic map to display on my CarPlay map utilizing the following:
import CarPlay
class CarPlaySceneDelegate: UIResponder, CPTemplateApplicationSceneDelegate {
var interfaceController: CPInterfaceController?
var window: CPWindow?
func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene, didConnect interfaceController: CPInterfaceController) {
self.interfaceController = interfaceController
let mapTemplate = CPMapTemplate()
mapTemplate.mapDelegate = self
interfaceController.setRootTemplate(mapTemplate, animated: true, completion: { success, error in
if let error = error {
debugPrint("Error: \(error)")
} else {
print("CarPlay Map Should Be Displayed")
}
})
let trip = CPTrip(origin: MKMapItem(placemark: .init(coordinate: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0))), destination: MKMapItem(placemark: .init(coordinate: CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0))), routeChoices: [])
mapTemplate.startNavigationSession(for: trip)
}
}
extension CarPlaySceneDelegate: CPMapTemplateDelegate {
func mapTemplate(_ mapTemplate: CPMapTemplate, panWith direction: CPMapTemplate.PanDirection) {
// Handle panning
}
func mapTemplate(_ mapTemplate: CPMapTemplate, startedTrip trip: CPTrip, using routeChoice: CPRouteChoice) {
// Handle trip start
}
}
I have my CarPlay Entitlements setup, I have my CarPlay Navigation App set in my signing and capabilities and my app icon displays properly on CarPlay (both in simulator and inside of my vehicle). However, as mentioned I only get a white screen.
Now, if I utilize the following code, I will get my map to display, however I lose functionality such as panning the map. I'm sure that I am missing something simple on the above example and appreciate any guidance that you may have.
func createMapTemplate(destination: TripDetails?, destinationBL: BucketListItems?, route: MKRoute, window: UIWindow) -> CPMapTemplate {
mapTemplate = CPMapTemplate()
mapTemplate.mapDelegate = self
trip = nil
let startLocation = CLLocation(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude)
let startMapItem = MKMapItem(placemark: MKPlacemark(coordinate: startLocation.coordinate))
startMapItem.name = "Starting Location"
let endMapItem = MKMapItem(placemark: MKPlacemark(coordinate: route.polyline.points()[route.polyline.pointCount - 1].coordinate))
endMapItem.name = destination?.campgroundName != nil ? destination!.campgroundName : destinationBL!.name
// Create the hosting controller for the SwiftUI view
let mapViewController = UIHostingController(rootView: CarPlayMapView(templateManager: self))
window.rootViewController = mapViewController
window.makeKeyAndVisible()
let routeChoice = createCPRouteChoice(from: route)
trip = CPTrip(origin: startMapItem, destination: endMapItem, routeChoices: [routeChoice])
mapTemplate(mapTemplate, selectedPreviewFor: trip!, using: routeChoice)
mapTemplate.showTripPreviews([trip!], textConfiguration: nil)
return mapTemplate
}
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
In order to check for issues related to positioning,I go to https://developer.apple.com/bug-reporting/profiles-and-logs/ and follow the instructions for Location Services for iOS to install a logging profile on my device.But I can't view the gpsd.log.lz4 file.
I read in March that Apple will enable in ios18, due to EU ruling, the function to set the default navigation app, like browser and mail standard apps. I installed ios18b5 and live in EU, but does not see this option.
Any idea if this will come in final version?
The delegate method :
locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion)
is giving no values in beacons for iOS 18 beta iPhone device in XCode 16 beta while the same code works and gives correct beacons on same peripheral and central devices in iOS 17. Has something changed in iOS 18 beta or is it iOS 18 beta bug related to beacons?
I have a UIKit app with an MKMapview.
In that mapview, I show icons on the location of Airfields.
When zooming out to Europe (or USA for that matter), the whole map is covered with the annotations, so I want to only show these annotations when zoomed in beyond some level.
How can that be achieved?
I did find a way like this:
class MapViewController: UIViewController {
var isAtBigZoom = true {
didSet {
guard oldValue != isAtBigZoom else {
return
}
for case let annot in mapView.annotations {
mapView.view(for: annot)?.alpha = isAtBigZoom ? 1 : 0
}
}
}
}
extension MapViewController: MKMapViewDelegate {
func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
isAtBigZoom = mapView.region.span.latitudeDelta < self.airportThreshold
}
}
But I have 2 problems with that:
Seems like a lot of processing power
It only takes effect after a pan. So I zoom beyond the limit, alpha has the 'old' value. Only after I pan, the alpha is suddenly represented in the MapView.
Does anybody know a better solution?
Saved location is not functional ion CarPlay since upgrade to iOS 18 public beta 2. was working fine in beta 1.
Non of my maps are working like they supposed to be. Before the update everything was working fine in CarPlay but for some reason after updating I can’t click on anything on the car screen.
My car was working perfectly fine but I updated to 18 beta since then Google maps keeps going blank and i have to keep Google map on on my mobile screen if i need to use on car play and also not able to click on any thing on car play’s screen
I'm a bit unsure about whether there’s a limit on the number of requests when using MKLocalSearch from MapKit. For example, if I have a large user base and need to make 200 requests per minute at peak times, will MapKit be able to handle this? Will the user be throttled after a number of requests?
If there is a limit, is it based on the user or developer account?
Additionally, if there is a limit, is it per day? Can you clarify?
Just to give you an idea, here is an example of the request we make:
let searchRequest = MKLocalSearch.Request()
searchRequest.naturalLanguageQuery = myQueryStringHere
localSearch?.cancel() // cancel the previous call if it exists
localSearch = MKLocalSearch(request: searchRequest)
localSearch?.start { (response, error) in
guard error == nil else {
completion(.failure(.myError))
return
}
let mapSearchLocations = response?.mapItems
completion(.success(mapSearchLocations))
}
}
I appreciate your help in advance.
Hello,
It’s unclear to me if there is a limit of requests when using MKLocalSearch from MapKit.
Let’s say I have a very large user base and will use 1000 requests per minute at peak times. Will MapKit support this?
But if there is a limit, is it by user or by developer account? Also, if there is a limit, is it per day?
Here is an example of the request we use.
let searchRequest = MKLocalSearch.Request()
searchRequest.naturalLanguageQuery = myQueryStringHere
localSearch?.cancel() // cancel the previous call if it exists
localSearch = MKLocalSearch(request: searchRequest)
localSearch?.start { (response, error) in
guard error == nil else {
completion(.failure(.myError))
return
}
let mapSearchLocations = response?.mapItems
completion(.success(mapSearchLocations))
}
}
The problem is that the second level in the apps cannot be operated via CarPlay.
When I call requestWhenInUseAuthorization in state kCLAuthorizationStatusNotDetermined on iOS 18 Beta 4 in the simulator, all my apps just terminate without any error message in the Xcode console (black screen with an activity indicator for a second or two and then it goes back to the springboard). I do have the NSLocationWhenInUseUsageDescription set in my Info.plist file.
When running the exact same apps in Xcode 16.0 beta 4 (16A5211f) but with a iOS 17 simulator attached, it is working as expected by showing the location authorization dialog.
Is this a known issue or am I missing something?
Been running the public beta for a few days. One significant anomaly. I run an app called Garmin Pilot. It is an aviation Electronic Flight Bag. Since loading the beta, the map rendering in the app has run into a problem.
The two side-by-side photos are the same scene on the map except for the zoom level. At 10NM and above, it's fine. The US Sectional chart is viewable. Drop down to 5NM and the chart disappears. It is the same with other charts in the app.
I am a user of multiple EFB apps and Pilot seems the only one affected. And yes, I reported it to the app developers as well.
Hi! I was wondering what the expected behavior of CLServiceSession(authorization: .always) after a device restart was?
What I am observing right now is that, after a device restart, location access from the background is denied until the app enters the foreground for the first time (CLServiceSession.Diagnostic says insufficientlyInUse: true; CLLocationUpdate additionally says serviceSessionRequired: true).
Is this the expected behavior?
If it is, then this seems like a somewhat suboptimal user experience to me, at least for my use case - the user's intention regarding the background location access won't have changed just because the device was rebooted.
(In case this is relevant, my use case is transmitting the current location to connected Bluetooth devices, e.g. digital cameras. As such my app is setting UIBackgroundModes of ["bluetooth-central”]).
Hi, I'm writing because I've been trying to set the .standard map style to render as a globe on an iPhone 15 running iOS 17 when zoomed out similar to how it works in Apple Maps but can't find any resources on how to make that happen as every time it appears as a flat 2D map, much unlike the .hybrid and .satellite types.
I found another thread on this forum a year ago where someone said .standard was bugged and couldn't become a globe, but I'm honestly quite surprised this issue hasn't been brought up more often.
Occasionally, the location of a user will suddenly shift by several hundred kilometers to different airports, even though the kCLLocationAccuracyBest level of location accuracy is being used, and most of the time, the location accuracy is less than 50.
The app privacy information provided in App Store Connect indicates the app collects data in order to track the user, including Precise Location. However, the app does not use App Tracking Transparency to request the user's permission before tracking their activity.
Apps need to receive the user’s permission through the AppTrackingTransparency framework before collecting data used to track them. This requirement protects the privacy of users.
---How do I fix this problem? I've submitted my app and in return they provided a screenshot of it clearly asking for permission before the app even loads the map in the background. Even though in the screenshot it's asking them for permission they are telling me it's not prompting the user before it starts tracking. I'm lost, help.
Hey guys. I'm building a cross-platform app using Flutter, which uses the Geolocator package to see how far the user has travelled from their starting point, aviation related. I do allow the user to select their own distance filter value from a set of pre-defined options, which could be as low as a metre, since the app is designed for use over relatively small distances, from say 200m to 1km. Therefore, having a large distance filter value wouldn't make much sense.
However, the issue I am having is that with iOS, I can't seem to control the actual sample rate of the user's location. From what I gather, iOS measures the user's location approximately once every second, give or take a bit, but that value cannot be changed. That's quite different to Android, where I can specify this measurement interval to be whatever I want it to be.
This lack of ability to control the measurement interval tends to cause quite a lag. When someone first starts to move, they aren't travelling fast enough to cause a noticeable lag. However, when someone's speed picks up, they could be travelling at around 70mph/32m/s (ish). If you're only measuring the user's location once every second, then it's likely they will have travelled over 30m before the next location update, which means the lag distance could potentially be huge relative to the maximum distance they will measure using the app.
I do fully appreciate that this is native functionality to iOS but my question really is, is there perhaps a way around this? Is there any way to increase the frequency with which the user's location is retrieved, so that I can reduce this lag?
If there isn't, that's no problem at all. I just thought I would ask the question, incase someone has come across this before and found a solution that works.
These are the Apple-related settings that I have been able to control with Flutter, for the Geolocator package.
Thank you in advance!
locationSettings = AppleSettings(
accuracy: LocationAccuracy.bestForNavigation,
activityType: ActivityType.otherNavigation,
distanceFilter: distanceFilterValue,
pauseLocationUpdatesAutomatically: false,
showBackgroundLocationIndicator: false,
);
We found a significant increase in the failure rate of using kCLLocationAccuracyKilometer accuracy to locate on iOS 17.5 & 17.5.1. May I ask how to solve this problem at present, and whether there is a fix in the subsequent version?
Hi
I save a track and I get an error the last point isn't the user location by adding the point to core data.
Is core data to slow?
can you help me?
greeting Fabain