본문 바로가기
iOS_Swift 앱개발👍

[iOS_Swift] QRCode Generator Framework로 만들기! _ 39

by 개발하는윤기사 2023. 10. 30.
728x90
반응형

안녕하세요~~ 개발하는 윤기사입니다!! 

 

이번 포스팅에서는 직전에 만들었던 QR_Code_Generator를 Framework로 만들어보려고 합니다!

 

이전에 만들어 놓은 클래스를 다른 프로젝트에서 사용하고 싶을 때 종종 사용한답니다! 

 

Framework 파일만 import 하면 바로 접근해서 사용할 수 있으니, 아주 편하겠죠?

 

1. Framework 파일 생성&빌드

2. 내부 로직 구성

3. 외부 모듈에서 사용하기

 

순서로 진행해보도록 할게요!

 

바로 시작해보겠습니다!!

 

이미지 출처 ㅣ https://programmingwithswift.com/create-a-swift-framework/

 

 

1️⃣ Xcode > File > New > Project > Framework를 선택해 줍니다!

2️⃣ 사용하실 Framework 이름을 Product Name에, App Bundle ID를 설정해 주시고 Next로 갑니다!

3️⃣ 그렇게 되면 .header file이 생성이 됩니다. 헤더 파일이 속해있는 폴더에 .swift 파일을 구성하면 됩니다.

 

 

4️⃣ .swift 파일 구성이 다 되었다면, Run Destination은 Any iOS Device(arm64) 설정! > Product > Build For > Profiling을 실행합니다.

 

5️⃣ Product > Show Build Folder in Finder > Products > Release-iphoneos > .framework 파일 확인!

6️⃣ 이제 앞에서 생성된 Framework 파일을 프로젝트에 넣어줄 겁니다!

- TARGETS > General > Frameworks, Libraries, and Embedded Content > + 클릭

- Add Other > Add Files > .framework 파일 선택

- 아래와 같이 선택 후 Finish!

 

7️⃣ 추가한 후 Embed Type을 Embed & Sign으로 설정하면 사용할 준비 끝!

 

 

8️⃣ QRGenerator.framework

- generateCode의 return 타입을 CIImage로 반환함으로써 외부에서 사용가능하도록 구현.

- framework 파일을 외부 모듈에서 사용하기 위해 public class로 선언.

- generateCode 메서드를 외부에서도 재정의하거나 상속받을 수 있도록 open 키워드로 설정.

import UIKit

public class QRCodeGenerator {
    
    /**
     사용법:
     UIImage(ciImage: qrGenerator.generateCode("yourString"), scale: 2.0, orientation: .up).withRenderingMode(.alwaysTemplate)
     **/
    public init() { }
    
    open func generateCode(_ string: String) -> CIImage {
        
        let filter = CIFilter(name: "CIQRCodeGenerator")
        let data = string.data(using: .utf8)
        
        guard let filter = filter else { return CIImage.empty() }
        /**
         The data to be encoded as a QR code. An NSData object whose display name is Message.
         */
        filter.setValue(data, forKey: "inputMessage")
        
        /**
         A single letter specifying the error correction format. An NSString object whose display name is CorrectionLevel.
         "L" : 7%
         "M" : 15% - default
         "Q" : 25%
         "H" : 30%
         */
        filter.setValue("M", forKey: "inputCorrectionLevel")
        
        guard let ciImage = filter.outputImage else { return CIImage.empty() }
        
        let transformed = ciImage.transformed(by: CGAffineTransform.init(scaleX: 10, y: 10))
        
        let invertFilter = CIFilter(name: "CIColorInvert")
        invertFilter?.setValue(transformed, forKey: kCIInputImageKey)
        
        let alphaFilter = CIFilter(name: "CIMaskToAlpha")
        alphaFilter?.setValue(invertFilter?.outputImage, forKey: kCIInputImageKey)
        
        guard let outputImage = alphaFilter?.outputImage else { return CIImage.empty() }
            
        return outputImage
    }
}

 

9️⃣ QRGeneratorVC.swift에서 import QRGenerator후 사용하기!

import UIKit
import QRGenerator

class QRGeneratorVC: UIViewController {
	
	//QRCodeGenerator 인스턴스 생성
    let qrGenerator = QRCodeGenerator()
	
    let qrImageView = UIImageView()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .systemBackground
        
        //ImageView에 CIImage로 설정!
        qrImageView.image = UIImage(ciImage: qrGenerator.generateCode("개발하는 윤기사"), scale: 2.0, orientation: .up).withRenderingMode(.alwaysTemplate)
        
    }

}

 

 

🔥 Framework 파일을 만드실 때 가장 주의할 점은 "접근 제어자를 어떤 걸 쓰느냐"입니다!

  • Default값인 internal을 접근제어자로 설정하면 외부 모듈에서 사용할 수 없음!
  • Framework를 만들 때는 public과 open을 사용함

앱 개발은 private, fileprivate, internal을 사용하고, 프레임워크 개발에는 public, open을 사용한다고 명시되어 있네요!

 

참고하시면 좋을 것 같습니다~~

 

이상 포스팅을 마칩니다. 😎

728x90
반응형