Key Concepts

In the following use case sections, we will guide you through the most common usage scenarios and reveal tips and easy-to-understand guidelines to help you get the most out of the HERE SDK for iOS.

How to use this Guide?

You can read this guide in any order. All sections are independent from each other, making it easy to skip any section and to dive straight into the topics which you are most interested in.

  • In the example section, you can find the example apps accompanying this user guide.
  • If you are interested in building your first app showing a HERE map, take a look at the Get Started section to guide you through the first simple steps.


The HERE SDK uses completion handlers as callback functions. For all completion handlers available in the HERE SDK, you can either use closure expressions or function call expressions. By convention, for this guide, we preferably use function call expressions to show the full type of information and other details, such as method and callback name. An example for both can be found in the Search section.

Completion Handlers and Delegates

  • The HERE SDK uses completion handlers for single event notification such as for search results.
  • For reoccurring event notifications such as for gesture events, delegates are used. When multiple delegates can be set, then the method pattern add_x() and remove_x() is used as naming convention. If only one delegate can be set at a time, properties are used that can be set to nil to stop listening.

Code Snippets

The shown code snippets cover best practice example code ready to be used for your own applications. However, for the sake of simplicity and to not shadow the educational approach of this guide, not all edge scenarios may be handled, especially when it comes to error handling or robust threading. In some cases, the obvious code is left out, but it can be found in the accompanying example apps that can be instantly built and deployed on any supported device - given a set a of valid HERE credentials. As is the practice in Swift, forced unwrapping of optionals is avoided except when the HERE SDK guarantees by design that it is safe to do so.

Is the HERE SDK Thread Safe?

The HERE SDK is not guaranteed to be thread safe and it is recommended to make calls to the SDK from the main thread. Internally, the HERE SDK will offload most of its work to a background thread, but callbacks to your code will always occur on the main thread. In general, thread safety is the responsibility of the caller. For example, it is unsafe to reuse an engine on different threads unless your code is synchronized.


The HERE SDK contains several modules - or engines as we call them - to execute specific tasks such as calculating a route with the RoutingEngine or requesting search results via the SearchEngine. There are many more engines you can use with the HERE SDK and you can read more about them in the dedicated chapters below. However, most engines share common concepts that makes it easier to use them. For example:

  • All engines execute their tasks asynchronously and receive their results on the main thread.
  • All engines share similar interfaces, callbacks and error handling.
  • It is possible to start multiple instances of an engine in parallel.
  • An online connection is required.

Set HERE Credentials from Property List or Programmatically

Usually, engines can operate independently from each other and require HERE credentials to request data. The credentials can be set in the Info.plist file as shown in the Get Started guide - or programmatically. This can be useful, for example, to inject credentials at runtime from a web service.

By default, when using a map view in your app, the HERE SDK is initialized automatically and it is reading the credentials from the Info.plist file. In addition, a default cache path is used for caching map data.

Use SDKOptions to set HERE Credentials and Cache Path

When you want to set the credentials programmatically, you must take care to initialize the HERE SDK yourself. A good place to do this is the AppDelegate after application launch - before the MapView is initialized and any other parts of the HERE SDK are used:

do {
    try SDKInitializer.initializeIfNecessary()
} catch {
    fatalError("Failed to initialize HERE SDK. Cause: \(error)")

As a next step, you need to create your own instance of the SDKNativeEngine, which can then be used to set or to change your HERE SDK credentials at runtime:

let cachePath = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first?.absoluteString
let sdkOptions = SDKOptions(accessKeyId: "YOUR_ACCESS_KEY_ID",
                            accessKeySecret: "YOUR_ACCESS_KEY_SECRET",
                            cachePath: cachePath!)
let sdkNativeEngine = SDKNativeEngine(options: sdkOptions)
SDKNativeEngine.sharedInstance = sdkNativeEngine

do {
    try searchEngine = SearchEngine()
} catch let engineInstantiationError {
    fatalError("Failed to initialize engine. Cause: \(engineInstantiationError)")

This allows you to set a shared instance that will then be used for all engines under the hood. Above, we initialize the SearchEngine as an example. Note that a shared instance is also required when you add a map view.

Alternatively, you can set the engine individually for each engine:

try searchEngine = SearchEngine(sdkNativeEngine)

By default, the HERE SDK's SDKInitializer will still look for the credentials in your Info.plist file. Therefore, when setting credentials programmatically, keep the tags holding dummy values for id and secret, like shown in the snippet below. Empty values will lead to an exception:


If you don't set your credentials programmatically, the HERE SDK will be initialized automatically using the values found in the Info.plist. Either way, invalid credentials will not block execution until these credentials are used to authenticate your app when you start to use an engine to request data - or when you want to show a map view.

Use Engines with or without a Map View

It is possible to run an engine as a stand-alone, which means that you do not need to add a map view to your application. This way, you can build an app solely around a specific engine. If you are using an engine as a stand-alone, you must take care to initialize the HERE SDK yourself - as shown above. Then you can proceed to create a new engine. With or without a map view - the procedure to create a new engine is exactly the same:

do {
    try searchEngine = SearchEngine()
} catch let engineInstantiationError {
    fatalError("Failed to initialize engine. Cause: \(engineInstantiationError)")

When you use the default constructor to initialize an engine for stand-alone usage, the HERE SDK will use a shared SDKNativeEngine under the hood to take the credentials as found in the Info.plist file. Alternatively, you can provide the credentials programmatically as shown in the previous section.


One of the core features of the HERE SDK for iOS is Mapping, which includes adding a map view, changing the location displayed by the map, and modifying its properties. The primary component of the mapping API is the map view, which is integrated as a UIView subclass. The map view represents a vector based view to display a map and various properties.

HERE map data is updated on a weekly basis to ensure you always get the freshest map data available. By integrating the map view you can automatically benefit from this. While the map is vector based, you can also integrate custom map tiles from other providers.

Note: To create a simple map application, please refer to the Get Started section.

To manipulate the map and its properties it's best to start looking at the Camera section. More features include:

  • Map gestures to handle common map gestures and default map behaviors like pan or rotate.
  • Map schemes to instantly switch default map styles such as satellite versus normal map layer.
  • Map items to place objects and shapes onto the map and interact with them.
  • Custom raster tiles to show custom server images as an additional map layer.
  • Custom map styles to fully customize the look of the existing map schemes.

HERE Logo Watermark

When using the HERE SDK, it is required that the HERE logo is always visible on the map view. By default, the HERE logo is located at the bottom right corner of the map. However, you can easily customize its location to meet your app design by calling setWatermarkPosition() on your map view instance. It is recommended to change the default placement only when it is required due to overlapping UI elements.


The HERE SDK contains fonts to render map labels in Chinese, Japanese and Korean. If you want to optimize the size of the overall app, you can remove selected fonts. For example, the font with Chinese, Japanese and Korean characters is around 1.7MB. To remove this font, open the heresdk.framework file and remove the following files:

  • style/fonts/DroidSansFallback.woff
  • style/fonts/DroidSansFallback.license

When you remove the font, it is recommended to switch the map language to any other language than Chinese, Japanese and Korean.

Map Language

You can customize the language that is used on the map to show labels for streets, cities and other map data. By default, the local language of a region is used.

Use the fields mainLanguageCode and fallbackLanguageCode to specify the desired map language via a MapSceneConfig when loading a map scene. The fallbackLanguageCode is used when the desired language is not available in any region of the world. Set both fields to nil to switch back to the default behavior.

Map Caching

To better support online and offline use cases, the HERE SDK for iOS supports caching of downloaded vector map data. This happens in the background. While interacting with the map, the data is stored locally on the device and can be accessed even when the device loses connection or operates in an offline mode.

The integrated map caching mechanism only supports the standard vector based map schemes - satellite images, for example, are not cached.

Please note that the amount of cached data is limited and will be overwritten with new map data while using the map. In most cases, this is sufficient to give the user the impression of a faster start-up time - as no additional data must be downloaded when you start an app again at the same location as before.

You can customize the amount of cached data via MapViewLite.

results matching ""

    No results matching ""