4.1.5 version
Table of Contents
- What’s New
- Installation
- UIKit
- SwiftUI
- Navigation
- GlobalLocationProvider
- CrowdConnected location provider
- IndoorAtlas location provider
- ExpoFP-GPS location provider
What’s New in ExpoFP Fplan version 4.1.5
Bugs have been fixed.
Installation
Cocoapods:
pod 'ExpoFpFplan', '4.1.5'
UIKit
Usage
import UIKit
import ExpoFpFplan
class ViewController: UIViewController {
var fplanUiView: UIFplanView!
override func loadView() {
fplanUiView = UIFplanView()
self.view = fplanUiView
}
override func viewDidLoad() {
super.viewDidLoad()
fplanUiView.load("https://demo.expofp.com")
}
override func viewWillDisappear(_ animated: Bool) {
fplanUiView.destoy()
}
}
Stop UIFplanView.
After you finish working with UIFplanView, you need to stop it.
To do this, you need to call the ‘destroy’ function:
fplanUiView.destoy()
Offline mode
ExpoFP SDK provides the following offline modes:
-
Default - ExpoFP SDK itself caches all the necessary data during the initial loading of the plan.
-
Opening a zip archive with a plan - you can download the plan archive from the “Integration options” page (windows section), add this archive to your application (Resources.bundle) and then open this plan using the “openZip()” function.
Example:
import UIKit
import ExpoFpFplan
class ViewController: UIViewController {
var fplanUiView: UIFplanView!
override func loadView() {
fplanUiView = UIFplanView()
self.view = fplanUiView
}
override func viewDidLoad() {
super.viewDidLoad()
let zipFilePath = Bundle.main.path(forResource: "Resources.bundle/demo", ofType: "zip")!
fplanUiView.openZip(zipFilePath)
}
override func viewWillDisappear(_ animated: Bool) {
fplanUiView.destoy()
}
}
Functions
Open plan:
fplanUiView.load("https://demo.expofp.com")
Stop UIFplanView:
fplanUiView.destoy()
Select booth:
fplanUiView.selectBooth("720")
Select exhibitor:
fplanUiView.selectExhibitor("RPMXPO")
Build route:
fplanUiView.selectRoute(Route(from: "720", to: "751", exceptInaccessible: false))
Set current position(Blue-dot):
fplanUiView.setCurrentPosition(BlueDotPoint(x: 22270, y: 44900), true)
Clear floor plan:
fplanUiView.clear()
Events
Floor plan ready event
This event is called when the plan initialization process has successfully completed.
fplanUiView.setOnFpReadyCallback {
print("[OnFpReady]")
}
Floor plan init error event
This event is called when an error occurs while initializing the plan.
fplanUiView.setOnFpErrorCallback { errorCode, description in
print("[OnFpError] errorCode=\(errorCode); description=\(description)")
}
Select booth event
This event is called when a booth is clicked.
fplanUiView.setOnBoothClickCallback { id, name in
print("[OnBoothClick] id=\(id); name=\(name)")
}
Route create event
This event is called when the route is successfully built.
fplanUiView.setOnBuildDirectionCallback { direction in
print(direction)
}
Details open event
This event is called when opening a panel with information, it can be a panel with information about an open booth, a route, etc.
fplanUiView.setOnDetailsClickCallback { details in
print("[OnDetailsClick]")
print(details)
}
Exhibitor custom button click event
This event is called after clicking a custom button in the panel with information about the exhibitor.
fplanUiView.setOnExhibitorCustomButtonClickCallback { externalId, buttonNumber, buttonUrl in
print("[OnExhibitorCustomButtonClick] externalId=\(externalId); buttonNumber=\(buttonNumber); buttonUrl=\(buttonUrl)")
}
SwiftUI
Usage
import SwiftUI
import ExpoFpFplan
@main
struct FplanApp: App {
var fplanView = FplanView()
var body: some Scene {
WindowGroup {
VStack
{
fplanView.onAppear{
fplanView.load("https://demo.expofp.com")
}
.onDisappear {
fplanView.destoy()
}
}
}
}
}
Stop FplanView.
After you finish working with FplanView, you need to stop it.
To do this, you need to call the ‘destroy’ function:
fplanView.destoy()
Offline mode
ExpoFP SDK provides the following offline modes:
-
Default - ExpoFP SDK itself caches all the necessary data during the initial loading of the plan.
-
Opening a zip archive with a plan - you can download the plan archive from the “Integration options” page (windows section), add this archive to your application (Resources.bundle) and then open this plan using the “openZip()” function.
Example:
import SwiftUI
import ExpoFpFplan
@main
struct FplanApp: App {
var fplanView = FplanView()
var body: some Scene {
WindowGroup {
VStack
{
fplanView.onAppear{
let zipFilePath = Bundle.main.path(forResource: "Resources.bundle/demo", ofType: "zip")!
fplanView.openZip(zipFilePath)
}
.onDisappear {
fplanView.destoy()
}
}
}
}
}
Functions
Open plan:
fplanView.load("https://demo.expofp.com")
Stop FplanView:
fplanView.destoy()
Select booth:
fplanView.selectBooth("720")
Select exhibitor:
fplanView.selectExhibitor("RPMXPO")
Build route:
fplanView.selectRoute(Route(from: "720", to: "751", exceptInaccessible: false))
Set current position(Blue-dot):
fplanView.setCurrentPosition(BlueDotPoint(x: 22270, y: 44900), true)
Clear floor plan:
fplanView.clear()
Events
Floor plan ready event
This event is called when the plan initialization process has successfully completed.
import SwiftUI
import ExpoFpFplan
@main
struct FplanApp: App {
var fplanView = FplanView()
var body: some Scene {
WindowGroup {
VStack
{
fplanView.onFpReady {
print("[OnFpReady]")
}
.onAppear {
fplanView.load("https://demo.expofp.com")
}
.onDisappear {
fplanView.destoy()
}
}
}
}
}
Select booth event
This event is called when a booth is clicked.
import SwiftUI
import ExpoFpFplan
@main
struct FplanApp: App {
var fplanView = FplanView()
var body: some Scene {
WindowGroup {
VStack
{
fplanView.onBoothClick { id, name in
print("[OnBoothClick] id=\(id); name=\(name)")
}
.onAppear {
fplanView.load("https://demo.expofp.com")
}
.onDisappear {
fplanView.destoy()
}
}
}
}
}
Route create event
This event is called when the route is successfully built.
import SwiftUI
import ExpoFpFplan
@main
struct FplanApp: App {
var fplanView = FplanView()
var body: some Scene {
WindowGroup {
VStack
{
fplanView.onBuildDirection { direction in
print(direction)
}
.onAppear {
fplanView.load("https://demo.expofp.com")
}
.onDisappear {
fplanView.destoy()
}
}
}
}
}
Details open event
This event is called when opening a panel with information, it can be a panel with information about an open booth, a route, etc.
import SwiftUI
import ExpoFpFplan
@main
struct FplanApp: App {
var fplanView = FplanView()
var body: some Scene {
WindowGroup {
VStack
{
fplanView.onDetailsClick { details in
print("[OnDetailsClick]")
print(details)
}
.onAppear {
fplanView.load("https://demo.expofp.com")
}
.onDisappear {
fplanView.destoy()
}
}
}
}
}
Exhibitor custom button click event
This event is called after clicking a custom button in the panel with information about the exhibitor.
import SwiftUI
import ExpoFpFplan
@main
struct FplanApp: App {
var fplanView = FplanView()
var body: some Scene {
WindowGroup {
VStack
{
fplanView.onExhibitorCustomButtonClick { externalId, buttonNumber, buttonUrl in
print("[OnExhibitorCustomButtonClick] externalId=\(externalId); buttonNumber=\(buttonNumber); buttonUrl=\(buttonUrl)")
}
.onAppear {
fplanView.load("https://demo.expofp.com")
}
.onDisappear {
fplanView.destoy()
}
}
}
}
}
Navigation
There are 2 ways to use navigation in FplanView. The first way is to explicitly specify the provider. In this case, FplanView will start and stop the LocationProvider on its own.
let locationProvider: LocationProvider = ...
fplanView.load(URL, locationProvider: locationProvider)
The second way is to run in the background using GlobalLocationProvider when the program starts.
GlobalLocationProvider
Very often needed to run a location provider in the background, ExpoFP SDK has a GlobalLocationProvider for this. The GlobalLocationProvider runs once at program startup and work in the background.
let locationProvider: LocationProvider = ...
GlobalLocationProvider.initialize(locationProvider)
GlobalLocationProvider.start()
Using the GlobalLocationProvider in the UIFplanView(UIKit):
fplanUiView.load(URL, useGlobalLocationProvider: true)
Using the GlobalLocationProvider in the FplanView(SwiftUI):
fplanView.load(URL, useGlobalLocationProvider: true)
When the program terminates, the GlobalLocationProvider must also be stopped:
GlobalLocationProvider.stop();
CrowdConnected location provider
Setup
Сocoapods:
pod 'ExpoFpCrowdConnected', '4.1.5'
Import:
import ExpoFpCrowdConnected
Permissions(in Info.plist file):
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
<key>NSLocationAlwaysUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
Initialization:
let locationProvider: LocationProvider = CrowdConnectedProvider(Settings("APP_KEY", "TOKEN", "SECRET"))
Recommended use
When using CrowdConnectedProvider, it is recommended to run it in the background (when the program starts) using the GlobalLocationProvider.
let locationProvider: LocationProvider = CrowdConnectedProvider(Settings("APP_KEY", "TOKEN", "SECRET"))
GlobalLocationProvider.initialize(locationProvider)
GlobalLocationProvider.start()
On initial startup, the CrowdConnectedProvider checks for permissions, if the permissions are delegated by the user then the CrowdConnectedProvider starts running, if there are no permissions, the CrowdConnectedProvider waits for any plan to open and requests the necessary permissions after the plan is opened. When opening a plan, you must specify “useGlobalLocationProvider” in the settings:
UIFplanView(UIKit):
fplanUiView.load(URL, useGlobalLocationProvider: true)
FplanView(SwiftUI):
fplanView.load(URL, useGlobalLocationProvider: true)
When the program terminates, the GlobalLocationProvider must also be stopped:
GlobalLocationProvider.stop();
Aliases
let settings = ExpoFpCrowdConnected.Settings("APP_KEY", "TOKEN", "SECRET")
settings.addAlias("KEY_1", "VALUE_1")
settings.addAlias("KEY_2", "VALUE_2")
let locationProvider: LocationProvider = CrowdConnectedProvider(settings)
IndoorAtlas location provider
Setup
Сocoapods:
pod 'ExpoFpIndoorAtlas', '4.1.5'
Import:
import ExpoFpIndoorAtlas
Permissions(in Info.plist file):
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
<key>NSLocationAlwaysUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
<key>NSBluetoothAlwaysUsageDescription</key>
<string>Bluetooth requested for better positioning experience.</string>
<key>NSBluetoothPeripheralUsageDescription</key>
<string>Bluetooth requested for better positioning experience.</string>
Initialization:
let locationProvider: LocationProvider = IndoorAtlasProvider(Settings("API_KEY", "API_SECRET_KEY"))
ExpoFP-GPS location provider
Setup
Сocoapods:
pod 'ExpoFpGpsProvider', '4.1.5'
Import:
import ExpoFpGpsProvider
Permissions(in Info.plist file):
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
<key>NSLocationAlwaysUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Platform location requested for better indoor positioning experience.</string>
Initialization:
let locationProvider: LocationProvider = new GpsProvider(getApplication())