Release Notes
Mappedin iOS SDK release notes are posted here and this page will be kept up-to-date as updates are released.
v3.0.7 - October 29, 2021
Update pod in Podfile to version 3.0.7: pod 'MappedIn', '3.0.7'
labelAllLocations
andlabelPolygon
now support legacy labelscreateMarker
support forMPINode
andMPICoordinates
- Methods to set minimum and maximum zoom levels with
setMinZoom
andsetMaxZoom
with the followingcameraControlsManager.setMinZoom(100)
v3.0.5 - August 24, 2021
Update pod in Podfile to version 3.0.5: pod 'MappedIn', '3.0.5'
labelAllLocations
bug fix
v3.0.4 - August 16, 2021
Update pod in Podfile to version 3.0.4: pod 'MappedIn', '3.0.4'
- Performance improvements
v3.0.3 - July 22, 2021
Update pod in Podfile to version 3.0.3: pod 'MappedIn', '3.0.3'
- Label performance improvements: Some issues affecting the speed of rendering labels on the map have been fixed. This can lead to improved load times when rendering labels on map initialization, especially when smart labels are enabled.
v3.0.2 - June 24, 2021
Update pod in Podfile to version 3.0.2: pod 'MappedIn', '3.0.2'
Label rankings
Polygons now have a rank
property representing that polygon’s label display priority. This data is also accessible in the MPIData
object made available in onDataLoaded
.
func onDataLoaded(data: MPIData) {
let rankings: MPIRankings? = data.rankings
let polygonRank = data.polygons[0].rank
}
Label styling
Labels now have an appearance
property, a LabelAppearance
which controls the display of that label. New appearance options are available, and the previous style properties on the label itself are now considered deprecated.
let label = MPIOptions.Label(
text: "Hello",
appearance: MPIOptions.LabelAppearance(
margin: 20.0,
text: MPIOptions.LabelAppearance.Text(
backgroundColor: "#00ff00"
)
)
)
The following appearance options are available:
margin: Double,
text: {
numLines: Int,
size: Double,
maxWidth: Double,
foregroundColor: String,
backgroundColor: String
},
marker: {
size: Double,
foreGroundColor: {
active: String,
inactive: String
},
backgroundColor: {
active: String,
inactive: String
}
}
Multi-destination navigation
The APIs to get directions and to draw a journey on the map now support multiple destinations, via the MPIDestinationSet
class. There is a new journeyManager
property on the mapView
with functions to draw
a journey, clear
the current journey, and setStep
on the current journey if it’s multi-destination. The drawJourney
and clearJourney
methods of mapView
are now considered deprecated.
let multiDirections: [MPIDirections] = mapView.getDirections(
to: MPIDestinationSet([aNode, anotherLocation]),
from: aLocation
) {
...
}
mapView?.journeyManager.draw(directions: multiDirections)
v3.0.1 - May 27, 2021
This release contains support for adjusting aspects of the camera that is used to render the mapView
.
iOS
Update to 3.0.1 production release: pod 'MappedIn', '3.0.1'
Camera controls
mapView
now contains another class, CameraControlsManager
, that allows the user to query and manipulate some aspects of the camera that is used to render the map. You can get and set the rotation and tilt of the camera:
mapView?.cameraControlsManager.setRotation(rotation: 180)
mapView?.cameraControlsManager.setTilt(tilt: 0.3)
mapView?.cameraControlsManager.rotation
mapView?.cameraControlsManager.tilt
Rotation is measured in degrees relative to north- setting it to 0 will orient the map so north points upward. Tilt is measured in radians relative to top-down- setting it to 0 will result in a top-down view, while setting it to 0.1 will apply a slight tilt.
v3.0.0-beta.9 - April 26, 2021
This release contains support for custom blueDot color, error handling in mapView.showVenue, no valid path for instructions in mapView.getDirections and new blueDot callbacks.
iOS
Update to 3.0.0-beta.9 in your Podfile
pod 'MappedIn', '3.0.0-beta.9'
Sample code examples can be found here for iOS:
Custom Blue Dot Color
mapView.enableBlueDot
still takes in MPIOptions.BlueDot
as a parameter. MPIOptions.BlueDot
still takes in allowImplicitFloorLevel, smoothing,
and showBearing
as before. In addition, you can now also pass in a string baseColor
in MPIOptions.BlueDot
that allows you to set the color of your blueDot. baseColor
supports strings like “red”, “green”, …, or colors in hex code such as “#7851a9”. baseColor
is an optional parameter, and the default color is set to be the original blue dot color, “#2266ff”.
mapView?.enableBlueDot(options: MPIOptions.BlueDot(allowImplicitFloorLevel: true, smoothing: false, showBearing: true, baseColor: "green"))
mapView?.enableBlueDot(options: MPIOptions.BlueDot(allowImplicitFloorLevel: true, smoothing: false, showBearing: true, baseColor: "#7851a9"))
MPIInstruction For No Valid Path
When calling mapView.getDirections
between two MPINavigatables
(MPINode, MPILocation, MPIPolygon) and there exists no valid path between them, the instruction
string of the first instruction in the directionsCallback
will state “No Valid Path Available” and the distance
double will contain 0. In addition, the directionsCallback
now contains an optional MPIDirection?
object.
Changes you should make in your apps to adapt new MPIDirection:
After getting the MPIDirection object from the direction directionsCallback when calling mapView?.getDirections, you should check if MPIDirection is nil before calling mapView?.drawJourney with it.
An example is shown below and can also be found in the sample app.
mapView?.getDirections(to: _selectedPolygon, from: _nearestNode, accessible: true) { directions in
if let directions = directions {
self.mapView?.drawJourney(directions: directions)
}
}
Error Handling For ShowVenue
mapView.showVenue
still takes in a data string or a deserialized MPIVenueResponse
and MPIOptions.ShowVenue
as before. In addition, it has an optional error callback errorCallback
that allows you to check if mapView.showVenue
has an error. The error callback contains an MPIError
enum which is either nil
(no error), MPIError.SHOW_VENUE
(error showing the venue ) or MPIError.DECODE
(error decoding the data). This error callback is optional, so nothing needs to be added if you do not want an error callback.
An example is shown below:
mapView.showVenue(
venueResponse: "<venue data string>",
showVenueOptions: MPIOptions.ShowVenue(
labelAllLocationsOnInit: true,
backgroundColor: "#CDCDCD"
)) { error in
print(error?.rawValue) (error callback)
}
New Blue Dot Callbacks
BlueDot updates have now been split into two separate callbacks. Previously, the only callback was onBlueDotUpdated
and currently, the two callbacks are onBlueDotPositionUpdate
and onBlueDotStateChange
.
The onBlueDotPositionUpdate
callback takes in an MPIBlueDotPositionUpdate
parameter which is nearly identical to the MPIBlueDot
class, except MPIBlueDotPositionUpdate
contains a newly added Double?
variable bearing
. You can still expect the same behaviour for the other class variables in MPIBlueDotPositionUpdate
--- position (MPIPosition?
), map (MPIMap?
), nearestNode (MPINode?
).
The onBlueDotStateChange
callback takes in an MPIBlueDotStateChange
parameter which has four class variables --- name (MPIBlueDotState
), markerVisibility (MPIMarkerState?
), reason (MPIBlueDotStateReason?
), and message (String?
). These four variables introduce different properties about the current state of the blueDot. The enums have following possible values:
MPIMarkerState | MPIBlueDotState | MPIBlueDotStateReason |
---|---|---|
HIDDEN | NOT_LISTENING | OUTSIDE_MAP |
GHOST | LISTENING | NO_POSITIONS_PROVIDED |
NORMAL | HAS_POSITION | GEOLOCATION_PROVIDER_ERROR |
UNCERTAIN | HAS_INDOOR_POSITION | CUSTOM_GEOLOCATION_PROVIDER_ERROR |
LOCATION_UNCERTAIN |
Message is an optional string that is used for the WebSDK and basically adds additional non-enum messages to developers about why things may fail. But it is not relevant for the Android/iOS SDKs.
Changes you should make in your app to adopt the new blue dot event:
- You should add two additional callbacks (
onBlueDotPositionUpdate
andonBlueDotStateChange
) inside classes that conform toMPIMapViewDelegate
. MPIBlueDot
is now a deprecated class and should be replaced withMPIBlueDotPositionUpdate
.onBlueDotUpdated
is also a deprecated callback and should not be used. Instead, you should only use the callbacks explained above.
The sample code includes an example on how to deprecate onBlueDotUpdated
.
- For everything you initially had in
onBlueDotUpdated
, you should also make your changes accordingly to include them inside the two new callbacks. The sample code includes an example of this: update the global variablenearestNode
and functionupdateBlueDotBanner
insideonBlueDotPositionUpdate
instead. Instead of taking anMPIBlueDot
parameter,updateBlueDotBanner
should take in the new classMPIBlueDotPositionUpdate
as a parameter.
v3.0.0-beta.8 - April 13, 2021
This release contains support for creating and removing custom markers, MPIOptions.Journey
has increased customization and distance
has been added as a property on MPIInstruction
. MPIMap.createCoordinate
can be used to create a MPICoordinate
by passing in latitude and longitude values.
iOS
Update to 3.0.0-beta.8 in your Podfile
pod 'MappedIn', '3.0.0-beta.8'
Sample code examples can be found here for iOS:
Custom Markers
Markers can be created and removed using createMarker
and removeMarker
which are member functions of the MPIMapView
class. createMarker
takes in three parameters. Firstly, createMarker
takes in an MPINavigatable.MPINode
which the marker will be displayed on. Secondly, the function takes in a string of HTML code which will generate the appearance of the marker. Lastly, createMarker
takes in options in the form of an MPIOptions.Marker
object, which includes a rank (optional) and an anchor (optional). While rank is simply a double, the anchor option is a MARKER_ANCHOR
enum and contains values for CENTER
, TOP
, BOTTOM
, LEFT
, and RIGHT
. When createMarker
is called, the third parameter defaults to an empty MPIOptions.Marker
object. createMarker
returns a unique id string for the marker, which can later be used to remove the marker.
Two code examples of creating a marker are as follows:
mapView.createMarker(polygon.entrances[0], "<div>marker1</div>")
id2 = mapView.createMarker(polygon.entrances[0], "<div>marker2</div>", MPIOptions.Marker(1.0, MPIOptions.MARKER_ANCHOR.LEFT))
removeMarker
takes in only the id of the marker to be removed. A code example of removing a marker is as follows:
mapView.removeMarker(id2)
Markers are also compatible with smartLabels and will replace labels when being generated. Additionally, once a marker is removed, the smartLabel will be displayed once again.
Update to drawJourney Options
mapView.drawJourney
still takes in an MPIDirections
object and MPIOptions.Journey
object as before. MPIOptions.Journey
object can still take in a connectionTemplateString
and pathOptions
. In addition, you can now also pass in a destinationMarkerTemplateString
, departureMarkerTemplateString
, and polygonHighlightColor
to MPIOptions.Journey
. By default, when you call drawJourney
, a predetermined destination and departure marker appear on the last and first nodes, respectively, from MPIDirections.Path
. The same behaviour occurs if you pass null
for both destinationMarkerTemplateString
and departureMarkerTemplateString
. You can also set destination and departure markers to not show up by passing in an empty string for both destinationMarkerTemplateString
and departureMarkerTemplateString
. If you want to create a custom destination and departure markers, you can pass in your own custom string of HTML code. You can now also pass a polygonHighlightColor
string in MPIOptions.Journey
to change the highlighted color of the destination and departure polygons.
See the code block below some code examples for the features mentioned above:
mapView.drawJourney(
directions = directions,
options = MPIOptions.Journey(
connectionTemplateString = "<div style=\"font-size: 13px;display: flex; align-items: center; justify-content: center;\"><div style=\"margin: 10px;\">{{capitalize type}} {{#if isEntering}}to{{else}}from{{/if}} {{toMapName}}</div><div style=\"width: 40px; height: 40px; border-radius: 50%;background: green;display: flex;align-items: center;margin: 5px;margin-left: 0px;justify-content: center;\"><svg height=\"16\" viewBox=\"0 0 36 36\" width=\"16\"><g fill=\"white\">{{{icon}}}</g></svg></div></div>",
destinationMarkerTemplateString = null,
departureMarkerTemplateString = "<div>departureMarker</div>",
pathOptions = MPIOptions.Path(
color = "#cdcdcd",
pulseColor = "#000000",
displayArrowsOnPath = true
),
polygonHighlightColor = "orange"
)
)
Distance in Instructions
MPIInstruction
now contains a distance parameter which is the distance of the MPIAction
in meters.
Coordinate from Latitude/Longitude
To get the coordinate, createCoordinate
can be used. This function is a member of the MPIMap
class. By passing in latitude
and longitude
values, createCoordinate
returns an MPICoordinate
object containing an x
and y
value, the latitude
and longitude
parameters, and the MPIMap
itself. x
and y
values are scaled to Mappedin units & latitude
and longitude
represent real world units.
v3.0.0-beta.7 - March 28, 2021
This release contains updates to display the venue by passing in data as MPIVenueResponse
or the string of the response from the legacy exporter service to the showVenue
method. Additionally, the type property on MPIVortex
has been changed to be an enum instead of a string.
iOS
Update to 3.0.0-beta.7 in your Podfile
pod 'MappedIn', '3.0.0-beta.7'
ShowVenue
This is an alternative method to using loadVenue
where no API calls will be made to retrieve the data. Instead, the data must be passed into the showVenue
method which takes in a data string or a deserialized MPIVenueResponse
and MPIOptions.ShowVenue
.
Sample code examples can be found here:
Reading MPIData from MPIVenueResponse
This response can be converted into an MPIData
object where Mappedin data can be read before displaying the venue by calling the static method fromVenueResponse on MPIData
and passing in the venue data string or MPIVenueResponse
Object.
let data = MPIData.fromVenueResponse(response: venueDataString)
v3.0.0-beta.6 - February 28, 2021
This release contains updates on the bluedot by adding follow state, option to disable smoothing and showBearing, and a method for finding the nearest node based on-screen coordinates.
iOS
Update to 3.0.0-beta.6 in your Podfile
pod 'MappedIn', '3.0.0-beta.6'
Follow Mode
The MPIMapViewListener now has a new method called onStateChanged(:MPIState) that is triggered when the state of the map changes.
Call mapView?.setState(MPIState.FOLLOW)
will set the map to follow the BlueDot (the screen will move to follow the bluedot and will change map to the correct floor
Map interactions will remove the user from this state (pan, zoom) and set the state to MPIState.EXPLORE
Bluedot Options
Pass showBearing
as true in MPIOptions.BlueDot
when calling enableBlueDot
to show bearing
Pass smoothing
as false in MPIOptions.BlueDot
when calling enableBlueDot
to disable our smoothing algorithm
Get Nearest Node By Screen Coordinates
Example to get the nearest node from the center of the screen (see full source code in [https://github.com/MappedIn/ios/blob/master/SDK%20v3%20Examples/ios-sdk-app/ios-sdk-app/ViewController.swift(https://github.com/MappedIn/ios/blob/master/SDK%20v3%20Examples/ios-sdk-app/ios-sdk-app/ViewController.swift))
mapView?.getNearestNodeByScreenCoordinates(x: Int(mapView!.bounds.width/2), y: Int(mapView!.bounds.height/2))
Bugfixes
focusOn
can now properly focus on nodes passed in from locations
v3.0.0-beta.3 - February 15, 2021
This release contains updates to navigation, adds custom headers and options when showing the venue. To update, follow the instructions for each platform:
Data Changes
MPIDirections:
directions property has been renamed to instructions, please update this in your app if you are accessing the directions property.
Additionally, atVortex has been added to MPIInstruction, if a vortex is available at that instruction.
iOS 3.0.0-beta.3
Update to in your Podfile pod 'MappedIn', '3.0.0-beta.3'
Bluedot
To use bluedot, first enable it by calling enableBlueDot(), and then call updatePosition(:MPIPosition)
mapView?.enableBlueDot()
//Call this whenever GPS or beacon location provider updates user position
mapView?.updatePosition(
position: MPIPosition(
timestamp: 0.0,
coords: MPICoordinates(
latitude: 40.0,
longitude: 80.0,
accuracy: 3.0,
floorLevel: nil
),
type: "GPS"
)
)
Navigation w/ Connection Markers
You can now draw a journey instead of just a path with the drawJourney method which takes in an MPIDirections object. This will draw the path and connection markers if the journey is multifloor.
mapView?.getDirections(to: _selectedPolygon, from: _nearestNode, accessible: true) { directions in
self.mapView?.drawJourney(directions: directions)
}
To get text for directions, after calling getDirections with two MPINavigatables (MPINode, MPILocation, MPIPolygon) as the to and from parameters, you should receive an MPIDirections object in the callback. The instructions will be accessible in the instructions property which is a list of MPIInstructions which contains an instruction property which is a String that contains the text for the instruction.
Custom Navigation Markers
If you want custom navigation markers, you can pass in a connectionTemplateString
in the MPIOptions.Journey
. This is an HTML template, you can pass it in as seen below:
self.mapView?.drawJourney(
directions: directions,
options: MPIOptions.Journey(
connectionTemplateString: #"<div style=\"font-size: 13px;display: flex; align-items: center; justify-content: center;\"><div style=\"margin: 10px;\">{{capitalize type}} {{#if isEntering}}to{{else}}from{{/if}} {{toMapName}}</div><div style=\"width: 40px; height: 40px; border-radius: 50%;background: green;display: flex;align-items: center;margin: 5px;margin-left: 0px;justify-content: center;\"><svg height=\"16\" viewBox=\"0 0 36 36\" width=\"16\"><g fill=\"white\">{{{icon}}}</g></svg></div></div>"#,
pathOptions: MPIOptions.Path(
color: "#cdcdcd",
pulseColor: "#000000",
displayArrowsOnPath: true
)
)
)
You can use the template above and change the background color under background: green
or pass in your own template string.
Custom Headers
Headers can now be added for each request when loading the venue
mapView.loadVenue(options: MPIOptions.Init(headers: [MPIHeader(name: "testName", value: "testValue")]))
Show Venue Options
You can also now pass in an MPIOptions.ShowVenue
on loadVenue
to modify the properties of the map on the first load, the following properties are supported firstMapId
, labelAllLocationsOnInit
, backgroundColor
, backgroundAlpha
.
mapView.loadVenue(
options: MPIOptions.Init(venue: "testVenue"),
showVenueOptions: MPIOptions.ShowVenue(
labelAllLocationsOnInit: false,
firstMapId: "55e9c73fd982bc3839000003",
backgroundColor: "#CDCDCD"
)
)