How to Record and Play Audio in iPhone using swift 4 - Swift 4 Tutorials W3Schools

Hot

Post Top Ad

27 Nov 2017

How to Record and Play Audio in iPhone using swift 4

In this article we are going to learn about recording sound using Swift 4. Not only recording but also playing the recorded file.

Here we are using AVAudioRecorder for recording audio and AVAudioPlayer for playing the sound.

It's an easy to record using AVAudioRecorder. We will explain step by step how to record an audio.

For testing this we need a device, because simulator don't has microphone.

How to Record and Play Audio in iPhone using swift 4

Getting Started:

Firstly create a new Xcode project and name it as 'VoiceRecorder' and save.

Before getting into code we need to add Microphone usage description in Info.plist.

Open Info.plist and add 'Privacy - Microphone Usage Description' key, othersiwe app will creash.

Next open ViewController.swift file and import the following AVFoundation framework:

import AVFoundation

Next add the following properties to the view controller:

var recordButton = UIButton()
var playButton = UIButton()
var isRecording = false
var audioRecorder: AVAudioRecorder?
var player : AVAudioPlayer?

Record button is to start or stop the recording, play button is to play the recorded sound, isRecoding is an Bool to know the state, audio Recorder is to handle the actual reading and saving of data and finally player to handle the actual playing or stopping the audio.

Microphone Permission:

Next step is we need to ask the user's permission for accessing the microphone in order to stop malicious apps doing malicious things. If the user grant permission we will add the record and play button UI.

Add the following code inside viewDidLoad() method:

view.backgroundColor = UIColor.black

// Asking user permission for accessing Microphone
AVAudioSession.sharedInstance().requestRecordPermission () {
    [unowned self] allowed in
    if allowed {
        // Microphone allowed, do what you like!
        self.setUpUI()
    } else {
        // User denied microphone. Tell them off!
        
    }
}

Add the following methods for setting up the UI:

// Adding play button and record buuton as subviews
func setUpUI() {
    recordButton.translatesAutoresizingMaskIntoConstraints = false
    playButton.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(recordButton)
    view.addSubview(playButton)
    
    // Adding constraints to Record button
    recordButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    recordButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    let recordButtonHeightConstraint = recordButton.heightAnchor.constraint(equalToConstant: 50)
    recordButtonHeightConstraint.isActive = true
    recordButton.widthAnchor.constraint(equalTo: recordButton.heightAnchor, multiplier: 1.0).isActive = true
    recordButton.setImage(#imageLiteral(resourceName: "record"), for: .normal)
    recordButton.layer.cornerRadius = recordButtonHeightConstraint.constant/2
    recordButton.layer.borderColor = UIColor.white.cgColor
    recordButton.layer.borderWidth = 5.0
    recordButton.imageEdgeInsets = UIEdgeInsetsMake(-20, -20, -20, -20)
    recordButton.addTarget(self, action: #selector(record(sender:)), for: .touchUpInside)
    
    // Adding constraints to Play button
    playButton.heightAnchor.constraint(equalToConstant: 60).isActive = true
    playButton.widthAnchor.constraint(equalTo: playButton.heightAnchor, multiplier: 1.0).isActive = true
    playButton.trailingAnchor.constraint(equalTo: recordButton.leadingAnchor, constant: -16).isActive = true
    playButton.centerYAnchor.constraint(equalTo: recordButton.centerYAnchor).isActive = true
    playButton.setImage(#imageLiteral(resourceName: "play"), for: .normal)
    playButton.addTarget(self, action: #selector(play(sender:)), for: .touchUpInside)
}

@objc func record(sender: UIButton) {

}

@objc func play(sender: UIButton) {
    
}

Here we added button using auto layout constraints programmatically.

Build and Run, next allow the Microphone for recording. Then the screen looks like below:

Play and stop button for recording swift 4

Start recording:

All buttons setting up done, next step is to start recording.

Add the following method to record an audio:

func startRecording() {
    //1. create the session
    let session = AVAudioSession.sharedInstance()
    
    do {
        // 2. configure the session for recording and playback
        try session.setCategory(AVAudioSessionCategoryPlayAndRecord, with: .defaultToSpeaker)
        try session.setActive(true)
        // 3. set up a high-quality recording session
        let settings = [
            AVFormatIDKey: Int(kAudioFormatMPEG4AAC),
            AVSampleRateKey: 44100,
            AVNumberOfChannelsKey: 2,
            AVEncoderAudioQualityKey: AVAudioQuality.high.rawValue
        ]
        // 4. create the audio recording, and assign ourselves as the delegate
        audioRecorder = try AVAudioRecorder(url: getAudioFileUrl(), settings: settings)
        audioRecorder?.delegate = self
        audioRecorder?.record()
        
        //5. Changing record icon to stop icon
        isRecording = true
        recordButton.setImage(#imageLiteral(resourceName: "stop"), for: .normal)
        recordButton.imageEdgeInsets = UIEdgeInsetsMake(5, 5, 5, 5)
        playButton.isEnabled = false
    }
    catch let error {
        // failed to record!
    }
}

Here we created AVAudioSession and creating audio recording. Add the following method for getting the path to save or retrieve the audio.

// Path for saving/retreiving the audio file
func getAudioFileUrl() -> URL{
    let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
    let docsDirect = paths[0]
    let audioUrl = docsDirect.appendingPathComponent("recording.m4a")
    return audioUrl
}

Next step is to conform to AVAudioRecorderDelegate protocol as follow:

class ViewController: UIViewController, AVAudioRecorderDelegate {

Next add the following code inside record() method:

Stop Recording:

Add the following method to stop recording an audio.

// Stop recording
func finishRecording() {
    audioRecorder?.stop()
    isRecording = false
    recordButton.imageEdgeInsets = UIEdgeInsetsMake(-20, -20, -20, -20)
    recordButton.setImage(#imageLiteral(resourceName: "record"), for: .normal)
}

Just needs to call either startRecording() or finishRecording() depending on the isRecording state.

Next add the following code inside record() method:

if isRecording {
    finishRecording()
}else {
    startRecording()
}

Before you're done, there's one more thing to be aware of: iOS might stop your recording for some reason out of your control, such as if a phone call comes in. We use the delegate of the audio recorder, so if this situation crops up you'll be sent a audioRecorderDidFinishRecording() message that you can pass on to finishRecording() like this:

func audioRecorderDidFinishRecording(_ recorder: AVAudioRecorder, successfully flag: Bool) {
    if flag {
        finishRecording()
    }else {
        // Recording interrupted by other reasons like call coming, reached time limit.
    }
    playButton.isEnabled = true
}

That's it recording an audio successfully completed.

Play Audio:

For playing sound we are using AVAudioPlayer, so add the following method:

func playSound(){
    let url = getAudioFileUrl()
    
    do {
        // AVAudioPlayer setting up with the saved file URL
        let sound = try AVAudioPlayer(contentsOf: url)
        self.player = sound
        
        // Here conforming to AVAudioPlayerDelegate
        sound.delegate = self
        sound.prepareToPlay()
        sound.play()
        recordButton.isEnabled = false
    } catch {
        print("error loading file")
        // couldn't load file :(
    }
}

Conform to the AVAudioPlayerDelegate protocol as follow:

class ViewController: UIViewController, AVAudioRecorderDelegate, AVAudioPlayerDelegate {

Next call the following method inside play() method as follow:

@objc func play(sender: UIButton) {
    playSound()
}

Add the AVAudioPlayerDelegate delegate method audioPlayerDidFinishPlaying() as follow to know whether audio finished playing or interrupted by an reason.

func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
    if flag {
        
    }else {
        // Playing interrupted by other reasons like call coming, the sound has not finished playing.
    }
    recordButton.isEnabled = true
}

Great we are done, it's time to run and test.

Download sample project with example :

140 comments:

  1. The weblog appears very appealing. It attracted a number of humans toward its patter of writing similarly to useful records added through this blog may be very useful for maximum of its readers. Online meditations services

    ReplyDelete
  2. Sweet web site , super layout, real clean and utilize pleasant. Mega888 apk download

    ReplyDelete
  3. 918kiss official enforces this link for you to download with android and ios apk for security protected 918kiss, so you get the original 918kiss game.kiss918 apk

    ReplyDelete
  4. iMarketing Malaysia's best SEO agency pays full attention to the analysis of keywords for your website.seo services malaysia - Our SEO experts' main aim is to ensure your website ranks ...

    ReplyDelete
  5. Original group buy seo share 100+ quality SEO Tools: Spy Tools, Ahrefs, Semrush with the cheapest, compared to all other providers.

    ReplyDelete
  6. Its a great pleasure reading your post.Its full of information I am looking for and I love to post a comment that "The content of your post is awesome" Great work. agencja rekrutacyjna

    ReplyDelete
  7. That is the excellent mindset, nonetheless is just not help to make every sence whatsoever preaching about that mather. Virtually any method many thanks in addition to i had endeavor to promote your own article in to delicius nevertheless it is apparently a dilemma using your information sites can you please recheck the idea. thanks once more. Fox News Live Stream USA

    ReplyDelete
  8. This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free. สมัคร 918kiss

    ReplyDelete
  9. Its as if you had a great grasp on the subject matter, but you forgot to include your readers. Perhaps you should think about this from more than one angle. Play Free slots

    ReplyDelete
  10. A very awesome site. agario unblocked at school game. agario unblocked

    ReplyDelete
  11. Thank you for very usefull information.. 音響店

    ReplyDelete
  12. Really your content is so impressive and helpful.
    Spy Camera India offers a wide array of audio surveillance and digital voice recorders. Best hidden spy audio voice recorder device for many uses contact +91-9999332499, 9999332099.

    ReplyDelete
  13. Awesome article! I want people to know just how good this information is in your article. It’s interesting, compelling content. Your views are much like my own concerning this subject. 台北音響店

    ReplyDelete
  14. I just want to let you know that I just check out your site and I find it very interesting and informative.. Tech with Gadgets

    ReplyDelete
  15. I am very much pleased with the contents you have mentioned. I wanted to thank you for this great article. 音響店

    ReplyDelete
  16. Spy Shop Online – the best Spy Camera Shop in Delhi is there to help and guide you explore the fantastic range at the most affordable rates. You will also get the FREE DEMO to enjoy the benefits at its fullest.

    ReplyDelete
  17. This is a great post. I like this topic.This site has lots of advantage.I found many interesting things from this site. It helps me in many ways.Thanks for posting this again. 桃園 音響

    ReplyDelete
  18. Thanks for taking the time to discuss this, I feel strongly that love and read more on this topic. If possible, such as gain knowledge, would you mind updating your blog with additional information? It is very useful for me. ทดลองเล่นสล็อต

    ReplyDelete
  19. I have read a few of the articles on your website now, and I really like your style of blogging. I added it to my favorites blog site list and will be checking back soon. Please check out my site as well and let me know what you think. eVisa India

    ReplyDelete
  20. Great post, you have pointed out some excellent points, I as well believe this is a very superb website. คาสิโนออนไลน์

    ReplyDelete
  21. I’ve read some good stuff here. Definitely worth bookmarking for revisiting. I surprise how much effort you put to create such a great informative website. 소액결제 현금화

    ReplyDelete
  22. Nice Post, Thanks for sharing with us
    When you want to try out the latest hidden spy apps for android and other devices, just come to Spy Shop Online. Get in touch with us NOW and get the FREE TRIAL LINK today.

    ReplyDelete
  23. I really loved reading your blog. It was very well authored and easy to understand. Unlike other blogs I have read which are really not that good.Thanks alot! หนังไทย

    ReplyDelete
  24. Thanks for sharing this information. I really like your blog post very much. You have really shared a informative and interesting blog post with people.. 가라오케

    ReplyDelete
  25. Outstanding article! I want people to know just how good this information is in your article. Your views are much like my own concerning this subject. I will visit daily your blog because I know. It may be very beneficial for me. 레깅스룸

    ReplyDelete
  26. This particular papers fabulous, and My spouse and i enjoy each of the perform that you have placed into this. I’m sure that you will be making a really useful place. I has been additionally pleased. Good perform! 소액결제 현금화

    ReplyDelete
  27. Thank you so much for the post you do. I like your post and all you share with us is up to date and quite informative, i would like to bookmark the page so i can come here again to read you, as you have done a wonderful job. ดูหนังฟรี

    ReplyDelete
  28. I found this is an informative and interesting post so i think so it is very useful and knowledgeable. I would like to thank you for the efforts you have made in writing this article. Indien Visa Uwendung

    ReplyDelete
  29. This particular papers fabulous, and My spouse and i enjoy each of the perform that you have placed into this. I’m sure that you will be making a really useful place. I has been additionally pleased. Good perform! movie review

    ReplyDelete
  30. You have done a great job on this article. It’s very readable and highly intelligent. You have even managed to make it understandable and easy to read. You have some real writing talent. Thank you. คาสิโน

    ReplyDelete
  31. Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! baccarat

    ReplyDelete
  32. Only aspire to mention ones content can be as incredible. This clarity with your post is superb and that i may think you’re a guru for this issue. High-quality along with your concur permit me to to seize your current give to keep modified by using approaching blog post. Thanks a lot hundreds of along with you should go on the pleasurable get the job done. 토토커뮤니티

    ReplyDelete
  33. What a thrilling post, you have pointed out some excellent points, I as well believe this is a superb website. I have planned to visit it again and again. เล่นบาคาร่า เว็บไหนดี

    ReplyDelete
  34. Yes i am totally agreed with this article and i just want say that this article is very nice and very informative article.I will make sure to be reading your blog more. You made a good point but I can't help but wonder, what about the other side? !!!!!!Thanks แทงบอล

    ReplyDelete
  35. Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. ข่าวฟุตบอล

    ReplyDelete
  36. I want looking at and I believe this website got some really useful stuff on it! . New Lahore City

    ReplyDelete
  37. I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article. exp watches

    ReplyDelete
  38. Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! congressional candidates 2022 nj

    ReplyDelete
  39. Admiring the time and effort you put into your blog and detailed information you offer!.. 音響店

    ReplyDelete
  40. Thanks for taking the time to discuss that, I feel strongly about this and so really like getting to know more on this kind of field. Do you mind updating your blog post with additional insight? It should be really useful for all of us. Canon PIXMA iP4600 Driver Download

    ReplyDelete
  41. Versatile house fix is a very surprising encounter when contrasted with fixing a non-trailer. Mobile Alabama iphone repair shop near me

    ReplyDelete
  42. Thank you for taking the time to publish this information very useful! hotstar168vips

    ReplyDelete
  43. Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Thank you for sharing with us,I too always learn something new from your post. 音響店推薦

    ReplyDelete
  44. Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Thank you for sharing with us,I too always learn something new from your post. 音響店

    ReplyDelete
  45. Thanks for the nice blog. It was very useful for me. I'm happy I found this blog. Thank you for sharing with us,I too always learn something new from your post. 音響店 新竹

    ReplyDelete
  46. สิ่งดีๆ ที่คุณมีและคอยอัปเดตพวกเราทุกคน
    หนัง hd

    ReplyDelete
  47. This particular is usually apparently essential and moreover outstanding truth along with for sure fair-minded and moreover admittedly useful My business is looking to find in advance designed for this specific useful stuffs… sexxy บาคาร่า

    ReplyDelete
  48. Thanks for a very interesting blog. What else may I get that kind of info written in such a perfect approach? I’ve a undertaking that I am simply now operating on, and I have been at the look out for such info. เดิมพันบอล 10 บาท

    ReplyDelete
  49. I would like to thank you for the efforts you have made in writing this article. I am hoping the same best work from you in the future as well. Thanks... 音響 新竹

    ReplyDelete
  50. Wow, What an Outstanding post. I found this too much informatics. It is what I was seeking for. I would like to recommend you that please keep sharing such type of info.If possible, Thanks. สูตรบาคาร่า sa

    ReplyDelete
  51. Great post but I was wondering if you could write a little more on this subject? I’d be very thankful if you could elaborate a little bit further. Thanks in advance! Fed up quotes

    ReplyDelete
  52. The post is written in very a good manner and it contains many useful information for me. 메이저사이트

    ReplyDelete
  53. I just found this blog and have high hopes for it to continue. Keep up the great work, its hard to find good ones. I have added to my favorites. Thank You. Listnr AppSumo Lifetime Deal

    ReplyDelete
  54. I really like your take on the issue. I now have a clear idea on what this matter is all about.. 토토사이트

    ReplyDelete
  55. I have recently started a blog, the info you provide on this site has helped me greatly. Thanks for all of your time & work. casino dinheiro real

    ReplyDelete
  56. I am happy to find your distinguished way of writing the post. Now you make it easy for me to understand and implement the concept. Thank you for the post. sexygame66

    ReplyDelete
  57. cell phone repair can be very convenient, but before you sign a contract for wireless phone service, be sure to ask a number of questions: Where can you make and receive calls? Most providers now promote their plans as local, regional or national. A local plan offers a low-cost option if most of your calls are near home.

    ReplyDelete
  58. Thanks for an interesting blog. What else may I get that sort of info written in such a perfect approach? I have an undertaking that I am just now operating on, and I have been on the lookout for such info. writing my essay

    ReplyDelete
  59. I was looking at some of your posts on this website and I conceive this web site is really instructive! Keep putting up.. สล็อตjokerในมือถือ

    ReplyDelete
  60. Your site is truly cool and this is an extraordinary moving article. 강남레깅스룸

    ReplyDelete
  61. Actually I read it yesterday but I had some thoughts about it and today I wanted to read it again because it is very well written. your bizzare adventure codes

    ReplyDelete
  62. Nice knowledge gaining article. This post is really the best on this valuable topic. paris city break deals

    ReplyDelete
  63. I would like to say that this blog really convinced me to do it! Thanks, very good post. hamburg city break deals

    ReplyDelete
  64. You make so many great points here that I read your article a couple of times. Your views are in accordance with my own for the most part. This is great content for your readers. copenhagen city breaks

    ReplyDelete
  65. I learn some new stuff from it too, thanks for sharing your information. Skrotpræmie (Car junk )

    ReplyDelete
  66. I'm also visiting this site regularly, this web site is really nice and the users are genuinely sharing good thoughts.
    Regards: https://www.infopadd.com/subject/it-s-worse-than-the-rabid-accustomed--13253

    ReplyDelete
  67. I really loved reading your blog. It was very well authored and easy to undertand. Unlike additional blogs I have read which are really not tht good. I also found your posts very interesting. In fact after reading, I had to go show it to my friend and he ejoyed it as well! ทางเข้าสมัครUFABET

    ReplyDelete
  68. I recently came across your blog and have been reading along. I thought I would leave my first comment. I don't know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often. last minute hotel deals

    ReplyDelete
  69. Hi! This is my first visit to your blog! We are a team of volunteers and new initiatives in the same niche. Blog gave us useful information to work. You have done an amazing job! مسلسل دايما عامر

    ReplyDelete
  70. I am thankful to you for sharing this plethora of useful information. I found this resource utmost beneficial for me. Thanks a lot for hard work. the icon group

    ReplyDelete
  71. Your website is really cool and this is a great inspiring article. แทง บอล ufabet

    ReplyDelete
  72. Awesome article! I want people to know just how good this information is in your article. It’s interesting, compelling content. Your views are much like my own concerning this subject. sweeper

    ReplyDelete
  73. Great post, and great website. Thanks for the information! https://ufcstreaminglinks.website/

    ReplyDelete
  74. Thanks for taking the time to discuss this, I feel strongly about it and love learning more on this topic. If possible, as you gain expertise, would you mind updating your blog with extra information? It is extremely helpful for me. https://redditmmastreaming.live/

    ReplyDelete
  75. I think that thanks for the valuabe information and insights you have so provided here. https://mmastreaminglinks.website/

    ReplyDelete
  76. Wow, cool post. I'd like to write like this too - taking time and real hard work to make a great article... but I put things off too much and never seem to get started. Thanks though. https://redditmlbstreaming.live/

    ReplyDelete
  77. I think this is an informative post and it is very useful and knowledgeable. therefore, I would like to thank you for the efforts you have made in writing this article. https://mlbstreaminglinks.website/

    ReplyDelete
  78. Wow, cool post. I’d like to write like this too – taking time and real hard work to make a great article… but I put things off too much and never seem to get started. Thanks though. https://redditnbastreaming.live/

    ReplyDelete
  79. Nice post! This is a very nice blog that I will definitively come back to more times this year! Thanks for informative post. https://redditnhlstreaming.live/

    ReplyDelete
  80. Positive site, where did u come up with the information on this posting? I'm pleased I discovered it though, ill be checking back soon to find out what additional posts you include. https://redditufcstream.live/

    ReplyDelete
  81. Thanks for the blog filled with so many information. Stopping by your blog helped me to get what I was looking for. Now my task has become as easy as ABC. ambbet

    ReplyDelete
  82. You make so many great points here that I read your article a couple of times. Your views are in accordance with my own for the most part. This is great content for your readers. เว็บพนัน ufaxs

    ReplyDelete
  83. I found that site very usefull and this survey is very cirious, I ' ve never seen a blog that demand a survey for this actions, very curious... บาคาร่าไม่มีขั้นต่ำ

    ReplyDelete
  84. Hyll on Holland by FEC. Hotline 61009266. Get Discounts, Direct Developer Price, Brochure, Floor Plan, Price List and More. Former Hollandia & Estoril Singapore Hyll on holland showflat

    ReplyDelete
  85. Very efficiently written information. It will be beneficial to anybody who utilizes it, including me. Keep up the good work. For sure i will check out more posts. This site seems to get a good amount of visitors. ไฮโลไทย

    ReplyDelete
  86. Thanks for sharing very informative article.
    Regards: fire guard services nyc

    ReplyDelete
  87. Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! บัญชี Demo ทดลองฟรี

    ReplyDelete
  88. You have performed a great job on this article. It’s very precise and highly qualitative. You have even managed to make it readable and easy to read. You have some real writing talent. Thank you so much. รถกระบะรับจ้าง

    ReplyDelete
  89. Positive site, where did u come up with the information on this posting?I have read a few of the articles on your website now, and I really like your style. Thanks a million and please keep up the effective work. un curso de milagros

    ReplyDelete
  90. Hey There. I found your blog using msn. This is a very well written article. I’ll be sure to bookmark it and come back to read more of your useful info. Thanks for the post. I’ll definitely return. เล่นสล็อต เว็บไหนดี pantip

    ReplyDelete
  91. This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free. DEWACASINO

    ReplyDelete
  92. Thanks for the blog loaded with so many information. Stopping by your blog helped me to get what I was looking for. TOGEL88

    ReplyDelete
  93. This article was written by a real thinking writer without a doubt. I agree many of the with the solid points made by the writer. I’ll be back day in and day for further new updates.
    Car Servicing Reading

    ReplyDelete
  94. You made such an interesting piece to read, giving every subject enlightenment for us to gain knowledge. Thanks for sharing the such information with us to read this... natalia pimenova

    ReplyDelete
  95. The quantity of individuals who flow into via the INSS groups could be very big and, due to this, fixing easy troubles finally ends up turning into some thing gradual and bureaucratic. como dar entrada na aposentadoria

    ReplyDelete
  96. Took me time to read all the comments, but I really enjoyed the article. It proved to be Very helpful to me and I am sure to all the commenters here! It’s always nice when you can not only be informed, but also entertained! recarga jogo

    ReplyDelete
  97. Great post i must say and thanks for the information. Education is definitely a sticky subject. However, is still among the leading topics of our time. I appreciate your post and look forward to more. curso de milagros

    ReplyDelete
  98. I really like your writing style, great information, thankyou for posting.
    Mechanic Sonning Common

    ReplyDelete
  99. Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place.. zeustek.com/get-your-own-job-board-today

    ReplyDelete
  100. This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value. Im glad to have found this post as its such an interesting one! I am always on the lookout for quality posts and articles so i suppose im lucky to have found this! I hope you will be adding more in the future... As An Example

    ReplyDelete
  101. We specialize in sofa and furniture re-upholstery change sofa cover and fabric, restoration and repairing services. We’re a skilled and experienced team of craftsman providing a range of upholstery services in Dubai to discerning clients in United Arab Emirates. Visit our site for more details at,
    Upholstery Sofa.

    ReplyDelete
  102. This is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value. Im glad to have found this post as its such an interesting one! I am always on the lookout for quality posts and articles so i suppose im lucky to have found this! I hope you will be adding more in the future... best betting sites germany

    ReplyDelete
  103. I wanted to thank you for this great read!! I definitely enjoying every little bit of it I have you bookmarked to check out new stuff you post. สล็อตออนไลน์

    ReplyDelete
  104. Great articles and great layout. Your blog post deserves all of the positive feedback it’s been getting.
    Bitcoin

    ReplyDelete
  105. The content is utmost interesting! You are great, and your efforts are outstanding!
    Weightloss

    ReplyDelete

  106. All your hard work is much appreciated. Nobody can stop to admire you. Lots of appreciation.
    Food License Mumbai

    ReplyDelete
  107. Hey, I am so thrilled I found your blog, I am here now and could just like to say thank for a tremendous post and all round interesting website. Please do keep up the great work. I cannot be without visiting your blog again and again. Messagerie Hotmail

    ReplyDelete
  108. Nice knowledge gaining article. This post is really the best on this valuable topic. เว็บสล็อตออนไลน์

    ReplyDelete
  109. บริการเกมสล็อตออนไลน์ปี 2022 เกมให้เลือกเล่นมากกว่า 1,000 เกมซุปเปอร์สล็อตเล่นผ่านเว็บ f

    ReplyDelete
  110. บริการเกมสล็อตออนไลน์ปี 2022 เกมให้เลือกเล่นมากกว่า 1,000 เกมสล็อตออนไลน์ d

    ReplyDelete
  111. I am impressed. I don't think Ive met anyone who knows as much about this subject as you do. You are truly well informed and very intelligent. You wrote something that people could understand and made the subject intriguing for everyone. Really, great blog you have got here. human Interaction

    ReplyDelete
  112. Backlinks are one of Google’s ranking determinants, as we all know.To get the right choice of picking up the backlinks just visit our site for the guidelines at,
    off-page-seo-strategies

    ReplyDelete
  113. Thank you for taking the time to publish this information very useful!
    Biohazard

    ReplyDelete
  114. Yes, I am entirely agreed with this article, and I just want say that this article is very helpful and enlightening. I also have some precious piece of concerned info !!!!!!Thanks. car air conditioner explained

    ReplyDelete
  115. Wow, this is fascinating reading. I am glad I found this and got to read it. Great job on this content. I liked it a lot. Thanks for the great and unique info.
    Home Car Servicing Caversham Park Village

    ReplyDelete

  116. Thank you for sharing a bunch of this quality contents, I will be back for more quality contents.
    먹튀검증사이트

    ReplyDelete
  117. I haven’t any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us. 经济作业代写

    ReplyDelete
  118. Thanks for taking the time to discuss this, I feel strongly that love and read more on this topic. If possible, such as gain knowledge, would you mind updating your blog with additional information? It is very useful for me. r语言代写

    ReplyDelete
  119. I wanted to thank you for this excellent read!! I definitely loved every little bit of it. I have you bookmarked your site to check out the new stuff you post. รีโนเวทบ้าน

    ReplyDelete
  120. We are really grateful for your blog post. You will find a lot of approaches after visiting your post. I was exactly searching for. Thanks for such post and please keep it up. Great work. largest charitable organizations in the world

    ReplyDelete
  121. Positive site, where did u come up with the information on this posting? I'm pleased I discovered it though, ill be checking back soon to find out what additional posts you include. boom iz

    ReplyDelete
  122. I can set up my new idea from this post. It gives in depth information. Thanks for this valuable information for all,.. Plastic Surgery

    ReplyDelete
  123. I haven’t any word to appreciate this post.....Really i am impressed from this post....the person who create this post it was a great human..thanks for shared this with us. Pengeluaran Bullseye

    ReplyDelete
  124. I would like to say that this blog really convinced me to do it! Thanks, very good post. Consultant in UK

    ReplyDelete
  125. Thanks for sharing, Awesome Tutorial

    ReplyDelete
  126. Thank you so much for posting a unique content!
    Get the Newest the Best Voice Recorder Device in India with high quality voice/sound recording for security purposes. Spy Camera India offers all types of Audio Devices at a reasonable price with free shipping. If you have any technical issues please contact us 9999332099, 9999332499.

    ReplyDelete
  127. Thanks for your insight for your fantastic posting. I’m glad I have taken the time to see this. buy dogecoin

    ReplyDelete
  128. Thank you very much for writing such an interesting article on this topic. This has really made me think and I hope to read more. best pet taxi in Europe

    ReplyDelete
  129. Thank you so much for sharing this great blog.Very inspiring and helpful too.Hope you continue to share more of your ideas.I will definitely love to read. pet transport within uk

    ReplyDelete
  130. The website is looking bit flashy and it catches the visitors eyes. Design is pretty simple and a good user friendly interface. best pet taxi in uk

    ReplyDelete
  131. I like your post. It is good to see you verbalize from the heart and clarity on this important subject can be easily observed... slugging calculator

    ReplyDelete
  132. Superbly written article, if only all bloggers offered the same content as you, the internet would be a far better place.. insights uae

    ReplyDelete
  133. Thanks for a very interesting blog. What else may I get that kind of info written in such a perfect approach? I’ve a undertaking that I am simply now operating on, and I have been at the look out for such info. Rishta Kya Kehlata Hai Episode

    ReplyDelete

  134. This informative blog post on "How to Record and Play Audio in iPhone using Swift 4" is a game-changer for iOS developers looking to enhance their apps with audio capabilities. The step-by-step instructions and code snippets provided make it easy to implement recording and playback functionality. Thanks for sharing this valuable resource to empower developers in creating immersive audio experiences on the iPhone platform. TraffMagic is a leading digital marketing company offer quality services like you can buy genuine Website traffic, Email marketing and SEO. We have a huge client base around the world.

    ReplyDelete
  135. Visit Nehru Place is a well-known electronics market in Delhi, India. Spy Shop Online is the Best Audio Voice Recorder In Nehru Place You can physically visit the market and explore various electronics shops to check out the available audio voice recorder options. Order Now 9999332099

    ReplyDelete
  136. Meet 9999332099 - our best-performing spy voice recorder device, ranking as one of the top 10 in its category for design, functionality, and reliability. Designed discreetly, it is compact yet powerful. It can record clear, noise-free voices. Visit the website www.spyshoponline.in

    ReplyDelete
  137. Welcome to the world of superior audio clarity with the View Best Audio Voice Recorder in Delhi. Spy Shop Online with us at Spy Shop Online and experience the superior performance of the finest audio voice recorder in Delhi. Contact at 9999332099

    ReplyDelete

Post Top Ad