Photo by Tai Bui / Unsplash

Üçüncü Parti kütüphaneleri projeden bağımlılıklarını gizleyerek kullanma

Swift Oct 22, 2022

Mobil projelerimizde çoğunlukla üçüncü parti kütüphaneler kullanmaktayız. Her ne kadar projede kendi kodlarımızı yazsak da bazı kısımlarda güvenilir üçüncü parti kütüphaneler kullanmak proje sürecini hızlandırmaktadır. Ancak swift sürümünde güncellemelerde bu kütüphanelerin de güncellenmesi gerekebilmektedir. Bu durumu da göz önünde bulundurmak fayda vardır.

Üçüncü Parti kütüphaneleri projeden bağımlılıklarını 2 yöntem ile yapılabilmektedir.

1.Extension'ları kullanma

Direk örnek vererek ilerleyeceğim. Projede fotoğrafları çekmek için bir kütüphane kullandığımızı varsayalım ancak kütüphane desteğini çektiğini duyurdu yada ihtiyaçları karşılamadığı için değişikliğe gidilmek istenildi. Bu durumda tüm projede değişiklik yapmak gerekecektir ve bu oldukça eforlu bir iş haline gelebilir.

Peki nasıl bir kullanım yapılabilir ? Burada yöntemlerden birisi olan Extension'lar kullanılabilir. Kingfisher bu kütüphanelerden birisidir ve görselleri set eden bir kod eklemek istersek, aşağıdaki ornek kodda UIImageView'e bir setImage fonksiyonu verilerek  bağımlılıklarını gizleyebiliriz.


import UIKit
import Kingfisher

extension UIImageView {
    func setImage(from url: URL) {
        kf.setImage(with: url)
    }
}

GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web.
A lightweight, pure-Swift library for downloading and caching images from the web. - GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web.

2.Protocol'ları kullanma

Üçüncü parti kütüphanesinin projeden bağımlılıklarını gizlemek için kullanılabilecek bir diğer yöntemdir. Yine bir örnek üzerinden gitmek gerekirse KeychainSwift örnek verebilir.

Normalde aşağıdaki gibi kullanılmaktadır.


let keychain = KeychainSwift()
keychain.set("hello world", forKey: "my key")
keychain.get("my key") // Returns "hello world"

Ancak bu şekilde kullanmak istemiyoruz. Protocol ile birlikte bir KeychainSwift nesnesine uyumlu hale getirilerek AuthenticationService içerisinde tanımlanarak kullanılmak isteniyor. Aşağıda bir servis isteginden dönen token'ların keychain de tutulmasına ornek gösterilmiştir.

Protocol - TokenStore


protocol TokenStore {
    var accessToken: String { get set }
    var refreshToken: String { get set }
}

Extension - KeychainSwift


extension KeychainSwift: TokenStore {
    private enum Keys {
        static let accessToken = "accessToken"
        static let refreshToken = "refreshToken"
    }

    var accessToken: String {
        get { return get(Keys.accessToken) }
        set { set(newValue, forKey: Keys.accessToken) }
    }

    var refreshToken: String {
        get { return get(Keys.refreshToken) }
        set { set(newValue, forKey: Keys.refreshToken)}
    }
}

Class - AuthenticationService


class AuthenticationService {
    private let tokenStore: TokenStore

    init(tokenStore: TokenStore) {
        self.tokenStore = tokenStore
    }

    func fetchToken(for credentials: Credentials) {
//        Save tokens here
//        tokenStore.accessToken =
//        tokenStore.refreshToken =
    }
}
GitHub - evgenyneu/keychain-swift: Helper functions for saving text in Keychain securely for iOS, OS X, tvOS and watchOS.
Helper functions for saving text in Keychain securely for iOS, OS X, tvOS and watchOS. - GitHub - evgenyneu/keychain-swift: Helper functions for saving text in Keychain securely for iOS, OS X, tvOS...


Referans

Hiding third-party dependencies with protocols and extensions
There are plenty of discussions on the Internet about using third-party dependencies in your apps. The first part of developers suggest ignoring the usage of libraries and write all the code yourself. The second part recommends using third-party dependencies to speed up app development.

Tags

Furkan Ozoglu

iOS Developer & Geomatics Engineer