Skip to content
Snippets Groups Projects

Elixxir dApps Swift SDK

Swift 5.6 platform iOS

📖 Usage

Add ElixxirDAppsSDK library as a dependency to your project using Swift Package Manager.

For usage examples, checkout included example iOS application.

▶️ Instantiating client

Create a new client and store it on disk:

let downloadNDF: NDFDownloader = .live
let createClient: ClientCreator = .live
try createClient(
  directoryURL: ...,
  ndf: try downloadNDF(.mainnet),
  password: ...
)

Load existing client from disk:

let loadClient: ClientLoader = .live
let client = try loadClient(
  directoryURL: ..., 
  password: ...
)

You can also use a convenient ClientStorage wrapper to manage a client stored on disk:

let storage: ClientStorage = .live(
  passwordStorage: .init(
    save: { password in
      // securely save provided client's password
    },
    load: {
      // load securely stored client's password
    }
  )
)
let client: Client
if storage.hasStoredClient() {
  client = try storage.loadClient()
} else {
  client = try storage.createClient()
}

Check out included example iOS application for the PasswordStorage implementation that uses the iOS keychain.

▶️ Connecting to the network

Start network follower:

let client: Client = ...
try client.networkFollower.start(timeoutMS: 10_000)

Wait until connected:

let client: Client = ...
let isNetworkHealthy = client.waitForNetwork(timeoutMS: 30_000)

▶️ Making a new identity

Use the client to make a new identity:

let client: Client = ...
let myIdentity = try client.makeIdentity()

▶️ Connecting to remote

Perform auth key negotiation with the given recipient to get the Connection:

let client: Client = ...
let connection = try client.connect(
  withAuthentication: false,
  recipientContact: ..., 
  myIdentity: ...
)

Pass true for the withAuthentication parameter if you want to prove id ownership to remote as well.

▶️ Sending messages

Send a message to the connection's partner:

let connection: Connection = ...
let report = try connection.send(
  messageType: 1, 
  payload: ...
)

Check if the round succeeded:

let client: Client = ...
try client.waitForDelivery(roundList: ..., timeoutMS: 30_000) { result in
  switch result {
    case .delivered(let roundResults):
      ...
    case .notDelivered(let timedOut):
      ...
  }
}

▶️ Receiving messages

Use connection's message listener to receive messages from partner:

let connection: Connection = ...
connection.listen(messageType: 1) { message in
  ...
}

▶️ Using rest-like API

Use RestlikeRequestSender to perform rest-like requests:

let client: Client = ...
let connection: Connection = ...
let sendRestlike: RestlikeRequestSender = .live(authenticated: false)
let response = try sendRestlike(
  clientId: client.getId(),
  connectionId: connection.getId(),
  request: ...
)

Pass true for the authenticated parameter if you want to perform authenticated requests.

🛠️ Development

Open ElixxirDAppsSDK.xcworkspace in Xcode (≥13.4).

Project structure

ElixxirDAppsSDK [Xcode Workspace]
 ├─ elixxir-dapps-sdk-swift [Swift Package]
 |   └─ ElixxirDAppsSDK [Library]
 └─ Example [Xcode Project]
     ├─ ExampleApp (iOS) [iOS App Target]
     ├─ example-app [Swift Package]
     |   ├─ AppFeature [Library]
     |   └─ ...
     └─ example-app-icon [Swift Package] 
         ├─ ExampleAppIcon [Library]
         └─ example-app-icon-export [Executable]

Build schemes

  • Use exlixxir-dapps-sdk-swift scheme to build and test the package with ElixxirDAppsSDK library.
  • Use ExampleApp (iOS) to build and run the example app.
  • Use example-app scheme to build and test the example app package with all contained libraries.
  • Use ExampleAppIcon scheme with macOS target to build and preview the example app icon.
  • Use example-app-icon-export scheme with macOS target to build and update the example app icon.
  • Use other schemes, like AppFeature, for building and testing individual libraries in isolation.

📄 License

Copyright © 2022 xx network SEZC

License