Xây dựng Universal Framework trong iOS sử dụng Swift

Ngắn gọn thôi, tôi cơ hội làm việc với Universal Framework trong iOS. Ban đầu có đôi chút khó khăn trong việc xây dựng Framework này. Nhưng qua tìm kiếm và đọc sâu các tài liệu, cuối cùng tôi cũng đã xây dựng một Universal framework. Tôi muốn chia sẻ cách xây dựng nó một cách dễ dàng.

Tạo dự án Framework

Mở Xcode, FileNewProject. Trong tab iOS, Chọn Framework & Library và chọn Cocoa Touch Framework nhấn "Next".

Nhập tên framework của bạn và nhấn "Next".

Chọn vị trí lưu project của bạn và tạo nó.

Trong project của bạn, chọn TargetProject Name → chọn tab Build Settings và luôn luôn gán "Enable Bitcode" thành "Yes" trước khi build Framework.

Tôi không nói quá nhiều về những tính năng và chức năng trong framework mà bạn sẽ xây dựng. Bạn có thể thêm vào các file .storyboard hoặc .xib vì nó project framework này cũng khá giống với project bình thường.

Sử dụng Cocoapods

Nhưng đợi đã, nếu dự án của bạn sử dụng một số thư viện bên thứ ba khác thông qua Cocoapods thì sao nhỉ?. Ồ! nó sẽ tạo file .xcworkspace trong dự án. Nhưng đừng lo, bạn vẫn có thể sử dụng Cocoapods khi xây dựng một framework.

Trong trường hợp này tôi có sử dụng thư việc AlamofireImage. Chúng ta tạo một "Podfile" và thực hiện "pod install" để cài đặt pods. Sau đó chúng ta có file .xcworkspace, mở nó ra và thao tác với project một cách bình thường.

Chú ý: Khi bạn sử dụng thư viện nào từ Cocoapods, thì bạn hãy chắc chắn rằng thư viện đó sẽ có trong project sử dụng Universal framework mà bạn tạo ra.

Tạo một Universal Framework

Bây giờ, chúng ta tạo một Universal Framework. Thêm mới một Target "Aggregate" và đặt tên nó là <FrameworkName>-Universal.

Trong Target mới thêm, tạo mới môt "Run script" trong tab "Build Phases".

Sau đó copy và paste nội dung dưới đây vào Run script mới tạo.

Trong đoạn mã bên trên, bạn có thể tìm thấy phần mã này:

“xcodebuild -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME}
-sdk iphonesimulator -configuration ${CONFIGURATION} clean build
CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator”

Nó được gọi hai lần, một cho "Simulator" và một cho "Device". Và chúng ta dùng lệnh "xcodebuild" để build Project.

Nếu project của bạn không có file .xcworkspace bạn hãy thay thế đoạn code trên thành đoạn code sau đây:

“xcodebuild -xcodeproj ${PROJECT_NAME}.xcodeproj -scheme ${PROJECT_NAME}
-sdk iphonesimulator -configuration ${CONFIGURATION} clean build
CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator”

Project được build hai lần và hai file .framework này được đặt ở hai thư mục khác nhau. Vì thế chúng ta cần dung lệnh "lipo" để nhóm chúng thành một file. Và đó là file chúng ta cần:

lipo “${SIMULATOR_LIBRARY_PATH}/${FRAMEWORK_NAME}” 
“${DEVICE_LIBRARY_PATH}/${FRAMEWORK_NAME}” -create -output 
“${FRAMEWORK}/${FRAMEWORK_NAME}”

Trong khi bạn build, bạn có thể gặp thông báo lỗi rằng xcodebuild không tìm thấy schemes. Sửa nó bằng cách, vào xCode menu "Product" → "Schemes" → "Manager schemes", tích vào schemes mà bạn muốn chia sẻ.

Và cuối cùng, bạn chọn schemes <FrameworkName>-Universal và build "Command + B". Bạn sẽ tìm thấy file .framework vừa build trong thư mục với đường dẫn "

/Output/directory" (nơi chứa file này bạn cũng có thể thay đổi nó).

Đã xong, bạn có thể lấy nó ra và sử dụng. Đây cũng là cách một số thư viện được buid như: Mixpanel, Fabric etc.

Một vài vấn đề và giải pháp

Có một vài vấn đề có thể xảy ra trong quá trình bạn tích hợp thư việc vào một project khác, bạn có thể tìm thấy ở đây.

Kết thúc

Trên đây là cách tôi tạo một Universal framework, đơn giản phải không. Hi vọng xẽ giúp ích chút it cho các bạn.

Sample project

Nguồn tham khảo.

Thank! 😃