This release, 8.8, was made on 1st February 2024 and is based on commit 8.7-304-gf1fb8f68d in the Git repository. There are no source incompatibilities with 8.6. The main change is that re-routing is now done by a background thread during navigation, allowing applications to remain responsive.

The previous release, 8.6, was made on 8th August 2023 and was based on commit 8.6-1-gc0939f76f in the Git repository.

Changes since the original release of 8.8

--- 8.8.7 ---
fixed disappearance of combined pushpins
--- 8.8.8 ---
corrected protocols defined in the iOS SDK so that asynchronous routing can be used in Swift apps
--- 8.8.13 ---
fixed #271: wrong routing profile used after automatic re-routing
--- 8.8.14 ---
fixed #274: setting the locale should change map labels
--- 8.8.19 ---
makemap now transliterates from the name for the source locale if it is present, or the label if not
in the Android API the returned metadata did not include the list of layers
fixed style sheet so that island names are drawn again now that islands are in the outline/island layer
contour lines at height zero are no longer drawn because they look like glitches and often appear on the sea
reduced line width of rivers and streams
fixes #282: some maps still drawn in blue
--- 8.8.27 ---
fixes #289: label sometimes not drawn if the locale is set
--- 8.8.28 ---


Routes may now optionally be calculated in a separate thread, both at the start of navigation and during navigation. There is a new framework function to support this feature: StartNavigationDeferred starts navigation while triggering route calculation in a background thread. The user can check the navigation status in the same polling function that supplies a position fix, and display the new route when it is available. During turn-by-turn navigation, whether or not routing was started by StartNavigation or StartNavigationDeferred, if the position is off the route for more than the chosen time, or further from the route than the chosen maximum distance, a new route is calculated by a background thread. The function SetNavigationAutoReRoute has been removed because re-routing is now always automatic.

The navigation states ReRouteNeeded and ReRouteDone have been replaced by the states Routing, meaning that a route is being calculated, and NewRoute, meaning that a new route has just been calculated.

Routes are now calculated asynchronously in both the Maps App and the Windows demo.


Labels are no longer condensed (shrunk horizontally) as part of the label fitting system. This feature has been removed, partly because it caused an inconsistent appearance where large numbers of small labels such as house numbers were drawn close together.

The standard style sheet now splits labels containing a slash ('/') into tokens and uses the first token as the main name and the second token as an alternative name, shown on a new line. Label formats in style sheets can extract labels using a new string operation that uses subscript syntax. For example, the expression ($[1]["/"]) extracts token 1 (tokens are numbered from zero, so this is the second token) from the standard name, referenced as $, using slash '/' as a delimiter. The first subscript is the token number and the second is a string containing delimiters. Tokens are stripped of leading and trailing whitespace.


There are three new error codes. Here are the C++ versions. Versions in other APIs have similar names.

constexpr Result KErrorNoRouteData = 68; // no route data is available

constexpr Result KErrorTooManyFontsInStyleSheet = 69; // too many fonts are used in a style sheet (more than 1023)

constexpr Result KErrorTooManyBoxStylesInStyleSheet = 70; // Too many box styles are used in a style sheet (more than 1023)


One overload of Framework::SetStyleSheet now takes a StringDictionary containing the style sheet variables, not a VariableDictionary.

The function Framework::StyleSheetVariables now returns a StringDictionary instead of a VariableDictionary.

A new function, Result Framework::StartNavigationDeferred(const RouteCoordSet& aCoordSet) allows navigation to start while calculating the route in a background thread.

A new function, Result Framework::DisplayNewRoute(), draws the new route if it has been created asynchronously during navigation.

The function void Framework::SetNavigationAutoReRoute(bool aAutoReRoute) and the data member NavigatorParam::AutoReRoute have been removed. Re-routing is now always automatic.

A new function, String Token(size_t aIndex,const MString* aSeparators = nullptr,const MString* aSingleCharacterTokens = nullptr) const returns a token from a string, specified by its index.


The properties Framework.NavigationAutoReRoute and NavigatorParam.AutoReRoute have been removed. Re-routing is now always automatic.

A new function, Result Framework.StartNavigationDeferred(RouteCoordSet^ aCoordSet) allows navigation to start while calculating the route in a background thread.


A new function, int Framework.startNavigationDeferred(RouteCoordSet aCoordSet) allows navigation to start while calculating the route in a background thread.

The function void Framework.setNavigatorAutoReRoute(boolean aAutoReRoute) has been removed. Re-routing is now always automatic.


A new CartoTypeFramework function, startNavigationDeferred, allows navigation to start while calculating the route in a background thread.

The CartoTypeFramework property navigationAutoReRoute and the CartoTypeNavigatorParam property autoReRoute have been removed. Re-routing is now always automatic.