diff --git a/configure.ac b/configure.ac
index 3e2381d6139d7c6aeb7e50d95e12fc7103decd07..46aab00349027273084d0fe38b040a9f4a4ad89e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -102,7 +102,7 @@ AM_CONDITIONAL(HAVE_IOS,   test "${HAVE_IOS}" = "1")
 
 dnl FIXME this should be deduced automatically
 AC_DEFINE_UNQUOTED([HAVE_COREAUDIO],
-                    `if test "${HAVE_OSX}" = "1"; then echo 1; else echo 0; fi`,
+                    `if test "${HAVE_OSX}" = "1" || test "${HAVE_IOS}" = "1"; then echo 1; else echo 0; fi`,
                     [Define if you have CoreAudio])
 
 dnl Android is linux, but a bit different
diff --git a/src/media/audio/Makefile.am b/src/media/audio/Makefile.am
index 0b4a8de7e97633aff22cd37ad54d6dd85682056b..b26233d9b03649bc9c2d14dc7c88361b88158e40 100644
--- a/src/media/audio/Makefile.am
+++ b/src/media/audio/Makefile.am
@@ -24,6 +24,10 @@ if HAVE_OSX
 SUBDIRS += coreaudio
 endif
 
+if HAVE_IOS
+SUBDIRS += coreaudio
+endif
+
 if HAVE_PORTAUDIO
 SUBDIRS += portaudio
 endif
@@ -89,6 +93,10 @@ if HAVE_OSX
 libaudio_la_LIBADD += ./coreaudio/libcoreaudiolayer.la
 endif
 
+if HAVE_IOS
+libaudio_la_LIBADD += ./coreaudio/libcoreaudiolayer.la
+endif
+
 if BUILD_OPENSL
 libaudio_la_LIBADD += ./opensl/libopensl.la
 libaudio_la_LDFLAGS += -lOpenSLES
diff --git a/src/media/audio/coreaudio/Makefile.am b/src/media/audio/coreaudio/Makefile.am
index 1969b70316e52011e4950a219db9ccb840aa921b..be060ee9618ef6a077639d1c16a3041809b3f429 100644
--- a/src/media/audio/coreaudio/Makefile.am
+++ b/src/media/audio/coreaudio/Makefile.am
@@ -4,5 +4,9 @@ if HAVE_OSX
 noinst_LTLIBRARIES = libcoreaudiolayer.la
 endif
 
+if HAVE_IOS
+noinst_LTLIBRARIES = libcoreaudiolayer.la
+endif
+
 libcoreaudiolayer_la_SOURCES = corelayer.cpp corelayer.h audiodevice.cpp audiodevice.h
 libcoreaudiolayer_la_CXXFLAGS = -I$(top_srcdir)/src
diff --git a/src/media/audio/coreaudio/audiodevice.cpp b/src/media/audio/coreaudio/audiodevice.cpp
index 2241acaf11e102cf098e27b8180ee257bfb98253..7389c60deb7f5c6ee9b7b7f8594d0ae96acffbd6 100644
--- a/src/media/audio/coreaudio/audiodevice.cpp
+++ b/src/media/audio/coreaudio/audiodevice.cpp
@@ -20,6 +20,8 @@
 
 #include "audiodevice.h"
 
+#if !TARGET_OS_IPHONE
+
 namespace ring {
 
 AudioDevice::AudioDevice(AudioDeviceID devid, bool isInput)
@@ -168,3 +170,5 @@ std::string AudioDevice::getName() const
 }
 
 } // namespace ring
+
+#endif // TARGET_OS_IPHONE
diff --git a/src/media/audio/coreaudio/audiodevice.h b/src/media/audio/coreaudio/audiodevice.h
index ba24605c8ff59241a9c213b8afd1a00cf030d6d3..f309bbcfa69033e034a3b2ad16981a3280c47264 100644
--- a/src/media/audio/coreaudio/audiodevice.h
+++ b/src/media/audio/coreaudio/audiodevice.h
@@ -21,14 +21,19 @@
 #ifndef AUDIO_DEVICE_H
 #define AUDIO_DEVICE_H
 
+#import <TargetConditionals.h>
+
+#if !TARGET_OS_IPHONE
 #include <CoreServices/CoreServices.h>
 #include <CoreAudio/CoreAudio.h>
+#endif
 
 #include <string>
 
 namespace ring {
 
 class AudioDevice {
+#if !TARGET_OS_IPHONE
 public:
     AudioDevice() : id_(kAudioDeviceUnknown) { }
     AudioDevice(AudioDeviceID devid, bool isInput);
@@ -48,6 +53,7 @@ public:
 private:
     int     countChannels() const;
     std::string  getName() const;
+#endif
 };
 
 }
diff --git a/src/media/audio/coreaudio/corelayer.cpp b/src/media/audio/coreaudio/corelayer.cpp
index c07f70fa302265ff1976bdc901e14ac0735cec65..5912bba21a4649c6dd68b83a3030244931d6d9b8 100644
--- a/src/media/audio/coreaudio/corelayer.cpp
+++ b/src/media/audio/coreaudio/corelayer.cpp
@@ -57,8 +57,10 @@ std::vector<std::string> CoreLayer::getCaptureDeviceList() const
 {
     std::vector<std::string> ret;
 
+#if !TARGET_OS_IPHONE
     for (auto x : getDeviceList(true))
         ret.push_back(x.name_);
+#endif
 
     return ret;
 }
@@ -67,10 +69,10 @@ std::vector<std::string> CoreLayer::getPlaybackDeviceList() const
 {
     std::vector<std::string> ret;
 
+#if !TARGET_OS_IPHONE
     for (auto x : getDeviceList(false))
-    {
         ret.push_back(x.name_);
-    }
+#endif
 
     return ret;
 }
@@ -175,6 +177,7 @@ void CoreLayer::initAudioLayerIO()
 
     // Input buffer setup. Note that ioData is empty and we have to store data
     // in another buffer.
+#if !TARGET_OS_IPHONE
     UInt32 bufferSizeFrames = 0;
     size = sizeof(UInt32);
     checkErr(AudioUnitGetProperty(ioUnit_,
@@ -183,6 +186,14 @@ void CoreLayer::initAudioLayerIO()
                 outputBus,
                 &bufferSizeFrames,
                 &size));
+#else
+    Float32 bufferDuration;
+    UInt32 propSize = sizeof(Float32);
+    AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration,
+                            &propSize,
+                            &bufferDuration);
+    UInt32 bufferSizeFrames = audioInputFormat_.sample_rate * bufferDuration;
+#endif
 
     UInt32 bufferSizeBytes = bufferSizeFrames * sizeof(Float32);
     size = offsetof(AudioBufferList, mBuffers[0]) +
@@ -392,6 +403,7 @@ void CoreLayer::updatePreference(AudioPreference &preference, int index, DeviceT
 std::vector<AudioDevice> CoreLayer::getDeviceList(bool getCapture) const
 {
     std::vector<AudioDevice> ret;
+#if !TARGET_OS_IPHONE
     UInt32 propsize;
 
     AudioObjectPropertyAddress theAddress = {
@@ -422,7 +434,7 @@ std::vector<AudioDevice> CoreLayer::getDeviceList(bool getCapture) const
         }
     }
     delete[] devids;
-
+#endif
     return ret;
 }
 
diff --git a/src/media/audio/coreaudio/corelayer.h b/src/media/audio/coreaudio/corelayer.h
index 51afd5ac7f7109d0e3378ee84f30efdd365d854b..b0a00b863e186c7c23bea085ee59776846e812bf 100644
--- a/src/media/audio/coreaudio/corelayer.h
+++ b/src/media/audio/coreaudio/corelayer.h
@@ -25,7 +25,9 @@
 #include "noncopyable.h"
 #include <CoreFoundation/CoreFoundation.h>
 #include <AudioToolbox/AudioToolbox.h>
+#if !TARGET_OS_IPHONE
 #include <CoreAudio/AudioHardware.h>
+#endif
 
 #define checkErr( err) \
     if(err) {\