Friday, 16 April 2021

Read contacts in iOS using Swift with error handling

Just copy and paste the below code

Pre-step before pasting the below code
Add below line in AppDelegate.swift file below import statement

let kAppDelegate = UIApplication.shared.delegate as! AppDelegate

 

import Foundation
import UIKit
import Contacts

class Permission {
    
    static func askPermissionForEvent(authorised: (_ authorised: Bool) -> ()) {
        let authorizationStatus = EKEventStore.authorizationStatus(for: .event);
        switch authorizationStatus {
        case .restricted:
            openNotificationInSettings()
            
        case .denied:
            print("denied")
            
        case .authorized:
            authorised(true)
            
        default:
            authorised(true)
        }
        
    }
    
    static func openNotificationInSettings() {
        let alertController = UIAlertController(title: "Title", message: "Your message here", preferredStyle: .alert)
        let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
            guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
                return
            }
            if UIApplication.shared.canOpenURL(settingsUrl) {
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                    })
                } else {
                    // Fallback on earlier versions
                }
            }
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
        alertController.addAction(cancelAction)
        alertController.addAction(settingsAction)
        DispatchQueue.main.async {
            kAppDelegate.window?.rootViewController?.present(alertController, animated: true, completion: nil)
            
        }
    }
    
    static func requestForContactAccess(completionHandler: @escaping (_ accessGranted: Bool) -> Void) {
        let authorizationStatus = CNContactStore.authorizationStatus(for: CNEntityType.contacts)
        switch authorizationStatus {
            
        case .authorized:
            completionHandler(true)
            
        case .denied:
            completionHandler(false)
            self.openSettings()
            
        case .notDetermined:
            let store = CNContactStore()
            store.requestAccess(for: CNEntityType.contacts, completionHandler: { (access, accessError) -> Void in
                completionHandler(access)
                
                print(accessError?.localizedDescription ?? "")
            })
            
        default:
            completionHandler(false)
        }
    }
    
    static func openSettings() {
        let alertController = UIAlertController(title: "Title", message: "Your message here", preferredStyle: .alert)
        let settingsAction = UIAlertAction(title: "Settings", style: .cancel) { (_) -> Void in
            guard let settingsUrl = URL(string: UIApplicationOpenSettingsURLString) else {
                return
            }
            if UIApplication.shared.canOpenURL(settingsUrl) {
                if #available(iOS 10.0, *) {
                    UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                    })
                } else {
                    // Fallback on earlier versions
                }
            }
        }
        let cancelAction = UIAlertAction(title: "Cancel", style: .default, handler: nil)
        alertController.addAction(cancelAction)
        alertController.addAction(settingsAction)
        DispatchQueue.main.async {
            kAppDelegate.window?.rootViewController?.present(alertController, animated: true, completion: nil)
            
        }
    }
}

Sunday, 26 August 2018

Asynchronous Image Loader [Swift 4] - PERFECTLY WORKING

Create a new swift file and copy paste the below class

It also store images in cache and when you load the image next time with this class it will be load quickly.


import UIKit

class ImageLoader {
    
    var cache = NSCache<AnyObject, AnyObject>()
    
    class var sharedInstance : ImageLoader {
        struct Static {
            static let instance : ImageLoader = ImageLoader()
        }
        return Static.instance
    }
    
    func imageForUrl(urlString: String, completionHandler:@escaping (_ image: UIImage?, _ url: String) -> ()) {
            let data: NSData? = self.cache.object(forKey: urlString as AnyObject) as? NSData
            
            if let goodData = data {
                let image = UIImage(data: goodData as Data)
                DispatchQueue.main.async {
                    completionHandler(image, urlString)
                }
                return
            }
        
        let downloadTask: URLSessionDataTask = URLSession.shared.dataTask(with: URL.init(string: urlString)!) { (data, response, error) in
            if error == nil {
                if data != nil {
                    let image = UIImage.init(data: data!)
                    self.cache.setObject(data! as AnyObject, forKey: urlString as AnyObject)
                    DispatchQueue.main.async {
                        completionHandler(image, urlString)
                    }
                }
            } else {
                completionHandler(nil, urlString)
            }
        }
        downloadTask.resume()
    }
}


Usage:

// Call this class for a single image or Run the below code inside a for loop and pass URL Strings in a loop to this class. Works Smoothly for both.

ImageLoader.sharedInstance.imageForUrl(urlString: "Your_Path_To_Image_URL") { (image, urlString) in

            if image != nil {

                // Set Your Image Here

            }

        }


Read contacts in iOS using Swift with error handling

Just copy and paste the below code Pre-step before pasting the below code Add below line in AppDelegate.swift file below import statement ...