TDLib for iOS, macOS, watchOS, tvOS and visionOS packed in XCFramework and SPM.

What's New


XCFramework based on TDLib-1.8.29 commit 12c1689b

ZIP Checksum 279ecf5d40e9fe443d145c7de842082d55e6cc4203c96df06d772a1c4ff35f3d



Project contains pre-compiled TDLib binary for iOS, macOS, watchOS, tvOS, visionOS and simulators in .xcframework bundle.

If you're looking for pure Swift library, check out TDLibKit


Xcode (SPM)

  1. Install latest Xcode
  2. Add as SPM dependency in Project > Swift Packages. This could take a while cause it downloads ~300mb zip file with xcframework.
  3. Add TDLibFramework as your target dependency.
  4. Code!

Cocoapods & Flutter

See the docs


Simple examples can be found in Tests directory.

Create client

let clientId: Int32 = td_create_client_id()

Make request object

let request = ["@type": "getTextEntities", "text": "@telegram /test_command", "@extra": ["5", 7.0, "\\u00e4"]] as [String: Any]

JSON Serialization and Deserialization

Small example for helper functions you will need to talk with TDLib

func dictToJSONString(_ dictionary: [String: Any]) -> String {
    let dictionaryData = try! dictionary)
    return String(data: dictionaryData, encoding: .utf8)!

func JSONStringToDict(_ string: String) -> [String: Any] {
    let responseData = .utf8)!
    return try! JSONSerialization.jsonObject(with: responseData, options: .allowFragments) as! [String: Any]

Synchronious requests

Only for methods with "Can be called synchronously" in docs

if let res = td_execute(dictToJSONString(request)) {
    let responseString = String(cString: res)
    let responseDict = JSONStringToDict(responseString)
    print("Response from TDLib \(responseDict)")

Async requests

let request = [
    "@type": "setTdlibParameters",
    "api_hash": "5e6d7b36f0e363cf0c07baf2deb26076",
    "api_id": 287311,
    "application_version": "1.0",
    "database_directory": "tdlib",
    "database_encryption_key": nil,
    "device_model": "iOS",
    "enable_storage_optimizer": true,
    "files_directory": "",
    "ignore_file_names": true,
    "system_language_code": "en",
    "system_version": "Unknown",
    "use_chat_info_database": true,
    "use_file_database": true,
    "use_message_database": true,
    "use_secret_chats": true,
    "use_test_dc": false,
] as [String: Any]
// Send request
td_send(clientId, dictToJSONString(request))

// Block thread and wait for response (not more 5.0 seconds)
if let response = td_receive(5.0) {
   let responseString = String(cString: res)
   let responseDict = JSONStringToDict(responseString)
   print("Async response from TDLib \(responseDict)")

Close client on exit

td_send(clientId, dictToJSONString(["@type": "Close"] as [String: String]))


You can find latest releases at Releases page.


You can find more about build process in Github Actions file.


Editing builder/Project.swift requires tuist. See installation instructions for more info.

Tuist's main distribution channel is the mise tool. Check their installation steps as well

mise install tuist
cd builder
tuist edit


  • Anton Glezman for Build Guide and basic implementation
  • Telegram Team for TDLib




  • Swift Tools 5.3.0
View More Packages from this Author


  • None
Last updated: Mon May 20 2024 09:17:31 GMT-0900 (Hawaii-Aleutian Daylight Time)