TJJupiterSDK is an iOS SDK that provides Jupiter-based indoor service features such as service lifecycle management, positioning result delivery, navigation destination updates, routing requests, and mocking mode support.
TJJupiterSDK is an iOS SDK that provides Jupiter-based indoor positioning and navigation services.
It delivers real-time indoor location results, navigation routing, and movement tracking using BLE signals and sensor fusion.
- 📍 Indoor positioning (BLE + Sensor fusion)
- 🚶 Pedestrian / 🚗 Vehicle mode support
- 🧭 Navigation routing (start / destination / waypoint)
- 🔄 Real-time positioning result stream
- 🏢 Indoor / Outdoor state detection
- iOS 15.0+
- Swift 5.0+
- Info.plist
- Privacy - Motion Usage Description
- Privacy - Bluetooth Peripheral Usage Description
- Privacy - Bluetooth Always Usage Description
- Privacy - Location When In Usage Description
- Required device capabilities
- item : Accelerometer
- item : Gyroscope
- item : Magnetometer
- item : Bluetooth Low Energy
- Required background modes
- App communicates using CoreBluetooth
- App registers for location updates
pod 'TJJupiterSDK'- If you need a more detailed guide, please refer to this link.
- https://www.notion.so/tjlabs/TJLABS-TJJupiterSDK-Guide-336aef6d5b728030b9f2d6354a6e23ca?source=copy_link
import TJJupiterSDKTJJupiterAuth.shared.auth(
accessKey: "YOUR_ACCESS_KEY",
secretAccessKey: "YOUR_SECRET_ACCESS_KEY"
) { code, success in
print("Auth:", success)
}let manager = JupiterServiceManager(id: "USER_ID")
manager.delegate = selfmanager.startService(
region: JupiterRegion.KOREA.rawValue,
sectorId: 123,
mode: .MODE_AUTO,
debugOption: false
)manager.stopService { success, message in
print("Stopped:", success)
}extension ViewController: JupiterServiceManagerDelegate {
func onJupiterSuccess(_ isSuccess: Bool, _ code: JupiterErrorCode?) {}
func onJupiterReport(_ code: JupiterServiceCode, _ msg: String) {}
func onJupiterResult(_ result: JupiterResult) {}
func isJupiterInOutStateChanged(_ state: InOutState) {}
func isUserGuidanceOut() {}
func isNavigationRouteChanged(_ routes: [(String, String, Int, Float, Float)]) {}
func isNavigationRouteFailed() {}
func isWaypointChanged(_ waypoints: [[Double]]) {}
}public struct JupiterResult: Codable {
public var mobile_time: Int
public var index: Int
public var building_name: String
public var level_name: String
public var jupiter_pos: Position
public var navi_pos: Position?
public var llh: LLH?
public var velocity: Float
public var is_vehicle: Bool
public var is_indoor: Bool
public var validity_flag: Int
}public struct Position {
public var x: Float
public var y: Float
public var heading: Float
}public struct LLH {
public var lat: Double
public var lon: Double
public var heading: Double
}public enum JupiterRegion: String {
case KOREA
case US_EAST
case CANADA
}public enum UserMode: String {
case MODE_PEDESTRIAN = "PDR"
case MODE_VEHICLE = "DR"
case MODE_AUTO = "AUTO"
}public enum InOutState: Int {
case OUT_TO_IN = 0
case INDOOR = 1
case IN_TO_OUT = 2
case OUTDOOR = 3
case UNKNOWN = -1
}public enum JupiterErrorCode: Int {
case INVALID_ID
case INVALID_MODE
case NETWORK_DISCONNECT
case DUPLICATED_SERVICE
case LOGIN_FAIL
case GENERATOR_FAIL
case CALC_INIT_FAIL
}public enum JupiterServiceCode: Int {
case SERVICE_FAIL
case SERVICE_SUCCESS
case BECOME_BACKGROUND
case BECOME_FOREGROUND
case BLUETOOTH_UNAVAILABLE
case BLUETOOTH_OFF
case BLUETOOTH_SCAN_STOP
case NETWORK_DISCONNECT
}- Since Jupiter performs positioning based on TJLABS' BLE beacons, it cannot receive indoor location data outside of the actual service area.
- If you use the mocking mode below, you can receive a randomly defined JupiterResult even outside the service area.
manager.setMockingMode()- Sample code is below.
- For a more detailed example, please refer to the demo project at the link below.
- https://github.com/tjlabs/TJJupiter-demo-ios
final class ViewController: UIViewController, JupiterServiceManagerDelegate {
private var manager: JupiterServiceManager?
override func viewDidLoad() {
super.viewDidLoad()
TJJupiterAuth.shared.auth(
accessKey: "KEY",
secretAccessKey: "SECRET"
) { [weak self] _, success in
guard success else { return }
let manager = JupiterServiceManager(id: "USER_ID")
manager.delegate = self
manager.startService(
region: JupiterRegion.KOREA.rawValue,
sectorId: 123,
mode: .MODE_AUTO,
debugOption: false
)
self?.manager = manager
}
}
}TJJupiterSDK is proprietary software provided by TJLabs under a separate commercial license agreement. Redistribution is not permitted except as agreed in writing.