Expand Minimize Picture-in-picture Power Device Status Voice Recognition Skip Back Skip Forward Minus Plus Play Search
Documentation
Sidebar

Setting the Navigation Destination

The SendLocation RPC gives you the ability to send a GPS location to the active navigation app on the head unit.

When using the SendLocation RPC, you will not have access to any information about how the user interacted with this location, only if the request was successfully sent. The request will be handled by Core from that point on using the active navigation system.

Checking If Your App Has Permission to Use Send Location

The SendLocation RPC is restricted by most vehicle manufacturers. As a result, the head unit you are connecting to will reject the request if you do not have the correct permissions. Please check the Understanding Permissions section for more information on how to check permissions for an RPC.

Checking if Head Unit Supports Send Location

Since there is a possibility that some head units will not support the send location feature, you should check head unit support before attempting to send the request. You should also update your app's UI based on whether or not you can use SendLocation.

If using library v.6.0 and connecting to SDL Core v.4.5 or newer, you can use the SDLSystemCapabilityManager to check the navigation capability returned by Core as shown in the code sample below.

If connecting to older versions of Core (or using older versions of the library), you will have to check the SDLManager.registerResponse.hmiCapabilities.navigation after the SDL app has started successfully to see if an embedded navigation system is available. If it is, then you can assume that SendLocation will work.

Objective-C
[self.sdlManager.systemCapabilityManager updateCapabilityType:SDLSystemCapabilityTypeNavigation completionHandler:^(NSError * _Nullable error, SDLSystemCapabilityManager * _Nonnull systemCapabilityManager) {
    BOOL isNavigationSupported = NO;
    if (error == nil) {
        isNavigationSupported = systemCapabilityManager.navigationCapability.sendLocationEnabled.boolValue;
    }
    else {
        isNavigationSupported = systemCapabilityManager.hmiCapabilities.navigation.boolValue;
    }

    <#If navigation is supported, send the `SendLocation` RPC#>
}];
Swift
sdlManager.systemCapabilityManager.updateCapabilityType(.navigation) { (error, systemCapabilityManager) in
    var isNavigationSupported = false
    if error == nil {
        isNavigationSupported = systemCapabilityManager.navigationCapability?.sendLocationEnabled?.boolValue ?? false;
    } else {
        isNavigationSupported = systemCapabilityManager.hmiCapabilities?.navigation?.boolValue ?? false
    }

    <#If navigation is supported, send the `SendLocation` RPC#>
}

Using Send Location

To use the SendLocation request, you must at minimum include the longitude and latitude of the location.

Objective-C
SDLSendLocation *sendLocation = [[SDLSendLocation alloc] initWithLongitude:-97.380967 latitude:42.877737 locationName:@"The Center" locationDescription:@"Center of the United States" address:@[@"900 Whiting Dr", @"Yankton, SD 57078"] phoneNumber:nil image:nil];

[self.sdlManager sendRequest:sendLocation withResponseHandler:^(__kindof SDLRPCRequest * _Nullable request, __kindof SDLRPCResponse * _Nullable response, NSError * _Nullable error) {
    if (error || ![response isKindOfClass:SDLSendLocationResponse.class]) {
        <#Encountered error sending SendLocation#>
        return;
    }

    SDLSendLocationResponse *sendLocation = (SDLSendLocationResponse *)response;
    SDLResult resultCode = sendLocation.resultCode;
    if (![resultCode isEqualToEnum:SDLResultSuccess]) {
        if ([resultCode isEqualToEnum:SDLResultInvalidData]) {
            <#SendLocation was rejected. The request contained invalid data.#>
        } else if ([resultCode isEqualToEnum:SDLResultDisallowed]) {
            <#Your app is not allowed to use SendLocation#>
        } else {
            <#Some unknown error has occured#>
        }
        return;
    }

    <#SendLocation successfully sent#>
}];
Swift
let sendLocation = SDLSendLocation(longitude: -97.380967, latitude: 42.877737, locationName: "The Center", locationDescription: "Center of the United States", address: ["900 Whiting Dr", "Yankton, SD 57078"], phoneNumber: nil, image: nil)

sdlManager.send(request: sendLocation) { (request, response, error) in
    guard let response = response as? SDLSendLocationResponse, error == nil else {
        <#Encountered error sending SendLocation#>
        return
    }

    guard response.resultCode == .success else {
        switch response.resultCode {
        case .invalidData:
            <#SendLocation was rejected. The request contained invalid data.#>
        case .disallowed:
            <#Your app is not allowed to use SendLocation#>
        default:
            <#Some unknown error has occured#>
        }
        return
    }

    <#SendLocation successfully sent#>
}

Checking the Result of Send Location

The SendLocation response has 3 possible results that you should expect:

  1. SUCCESS - Successfully sent.
  2. INVALID_DATA - The request contains invalid data and was rejected.
  3. DISALLOWED - Your app does not have permission to use SendLocation.
View on GitHub.com
Previous Section Next Section