Last modified by Simon Morlat on 2024/01/29 10:38

Getting started with our tutorials

With the release of the linphone SDK 5.0, you will also find a set of Swift liblinphone tutorials for IOS. Use them to experiment with simple applications that covers the most common usages : call, chat, push notifications..

Adding the liblinphone dependency to your iOS project

Liblinphone for iOS is available using Cocoapods, the de-facto standard in the Apple developer world for "dependency management for Swift and Objective-C". Liblinphone can also be compiled from the sources.

Using Cocoapods

For a project named "Myproject"

open Myproject/, use commands:

pod init

Modify the generated Podfile according to your project:

# Uncomment the next line to define a global platform for your project

##For macosx
# platform :osx, '10.9'
#source ""

#For iOS
platform :ios, '9.0'
source ""

target 'Myproject' do

  # Pods for Myproject
 pod 'linphone-sdk' , '~>5.3.0'

 To install or update the liblinphone version, do the following command 

pod repo update
pod install

And you're done.

Some alpha (development versions) of liblinphone may also be available. To get them, replace the line:

pod 'linphone-sdk' , '~>5.3.0'


pod 'linphone-sdk', '> 5.4.0-alpha' 

followed by:

pod install

Compiling linphone-sdk

Linphone-sdk is the name of the git project that contains liblinphone and all its dependencies.

Compilation instructions of the SDK are available at: linphone-sdk/

Once done, cocoapods needs to be invoked to update the Xcode workspace to use your locally built linphone-sdk, as follows:

PODFILE_PATH=<path to linphone-sdk-ios> pod install
where <path to linphone-sdk-ios>  is your build directory of the linphone-sdk project, containing the linphone-sdk.podspec file and a linphone-sdk output directory comprising built frameworks and resources.

Using liblinphone

Liblinphone has a C API, suitable to be used with Objective-C, and a modern Swift API. To use in swift, import the liblinphone swift module in your source file using

import linphonesw

API documentation

You can find the liblinphone C API documentation here.

For Swift, online documentation is available here . In addition, this iOS sample app shows how to use liblinphone in a Swift project.

SDK 5.0 and newer features

Automatic iterate()

The newly added auto iterate mode is enabled by default on Android & iOS, but you can disable it with either core.setAutoIterateEnabled(false) method.

You can also configure that behavior in the config file like this:


If you forgot to disable it in the Core and you kept your existing code for scheduling the iterate nevermind, it will be of no consequence.

Foreground / Background modes

Previously developpers had to create code to detect whether the app was in foreground or background and call core.enterBackground() or core.enterForeground() accordingly.

This is no longer required as the liblinphone will do it by itself.

Integrating push notifications and CallKit

Push notifications integrations are a more advanced features, and you will find explanations in great detailsĀ here. It is heavily recommended that you have a look at the CallKit tutorial and the Remote Notifications tutorial if you wish for a simple integration of these features in your app.

Handling liblinphone log

In order to see liblinphone logs in your IOS app (for example in your Xcode console) follow these steps :

Put in your code at the launching of the app :


This will make the liblinphone logs to call your_log_handler and so be processed as a log from your app.

You can set the liblinphone log level by using the functions documented here.

IOS log handler for liblinphone

Once you have set your log handler, you need to process liblinphone log in order to incorporate them into your app logs.

Here is a short example of how to manage liblinphone log into an IOS app :

void linphone_iphone_log_handler(const char *domain, OrtpLogLevel lev, const char *fmt, va_list args) {
NSString *format = [[NSString alloc] initWithUTF8String:fmt];
NSString *formatedString = [[NSString alloc] initWithFormat:format arguments:args];
NSString *lvl;

if (!domain)
  domain = "lib";
// since \r are interpreted like \n, avoid double new lines when logging network packets (belle-sip)
// output format is like: I/ios/some logs. We truncate domain to **exactly** DOMAIN_SIZE characters to have
// fixed-length aligned logs
switch (lev) {
   lvl = @"Fatal";
   lvl = @"Error";
   lvl = @"Warning";
   lvl = @"Message";
   lvl = @"Debug";
   lvl = @"Trace";
if ([formatedString containsString:@"\n"]) {
 NSArray *myWords = [[formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]
 for (int i = 0; i < myWords.count; i++) {
  NSString *tab = i > 0 ? @"\t" : @"";
  if (((NSString *)myWords[i]).length > 0) {
    NSLog(@"[%@] %@%@", lvl, tab, (NSString *)myWords[i]);
 } else {
  NSLog(@"[%@] %@", lvl, [formatedString stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]);