🧑🏽💻
The iOS Headless SDK provides the same core payment APIs and capabilities as Android, but does not support UI customization. The reader UI is handled by iOS system.
iOS Embedded Payment SDK Quickstart
Add dependency via Swift Package Manager
Add the Headless SDK package Please setup the MineSec github release as source https://github.com/theminesec/ms-registry-ios (opens in a new tab) into your iOS project.
if you dont have MineSec git access PAT. please contact support (support@minesecsoftpos.com)

Start Pre-requisite
- You’ll need an iOS entitlement before you can use the iOS headless SDK.
- for developer, please download and install iOS Certification configuration file (opens in a new tab) for development and testing
License File Setup
Before initializing the Headless SDK and reader, you need to include a license file in your iOS project.
- Place your license file, e.g.,
public-test.license, into your Xcode project bundle (e.g.,root of your target). - Ensure that the file is included in the app target.
The iOS Headless SDK requires the license file name when calling initSoftPOS. The SDK will load, verify signature, and decrypt the license using the internal LicenseLoader.
Initialize SDK and reader
@State private var service = HeadlessService()
Task {
let result = await service.initSoftPOS(profileId: "prof_01K1FKGYYT5EMAYJZEDDBMJHQ4", licenseFile: "public-test")
switch result {
case .success(let info):
print("✅ Reader initialized with ID: \(info.headlessId)")
print("Version: \(info.headlessVersion)")
print("License ID: \(info.licenseId)")
print("Customer ID: \(info.customerId)")
// Start observing events
Task {
for await event in service.events {
print("📡 Event: \(event)")
}
}
case .failure(let error):
print("❌ Init failed: \(error)")
}
}Launch a Sale action
let poi = PoiRequest(
tranType: .sale,
amount: Amount(value: "100", currency: "USD"),
profileId: "prof_01K8SFE6NZ0NDD6FR1K52DT8V7",
posReference: getPosReference(),
cvmSignatureMode: .signOnPaper
)
let result = await service.launchRequest(poi)
switch result {
case .success(let success):
print("✅ Transaction Completed, tranId: \(success.tranId)")
let encoder = JSONEncoder()
encoder.outputFormatting = [.prettyPrinted, .sortedKeys]
if let jsonData = try? encoder.encode(success),
let jsonString = String(data: jsonData, encoding: .utf8) {
print("TransactionResponse:\n\(jsonString)")
}
case .failure(let error):
print("❌ Transaction failed: \(error)")
}Launch other actions
// Void last transaction
await service.actionVoid(tranId: "lastTranId")
// Linked refund
await service.actionLinkedRefund(tranId: "lastTranId")
// Query transaction
await service.actionQuery(tranId: "lastTranId")