Huớng dẫn cách distribute framework bằng cocoapods

Đã có bao giờ các bạn thử hỏi là làm thế nào Google distribute các SDK IOS của mình bằng Cocoapods chưa, hôm nay mình sẽ hướng dẫn các bạn distribute dynamics framework của ios bằng cooapods (dynamic nhé không phải static :3). Để distribute được SDK các bạn cần tạo file podspec.

Giới Thiệu Về Podspec

Podspec là 1 file text đặc trưng cho 1 thư viện pod. Nó bao gồm tất cả các thông tin cần thiết để giúp bạn có thể fetch, những file thư viện sẽ được dùng, cài đặt cho bản build và thông tin metadata của thư viện ví dụ version, người tạo thư viện, trang chủ của thư viện.

Sau đây là 1 file podspec căn bản:

Pod::Spec.new do |s|
 
  # 1
  s.platform = :ios
  s.ios.deployment_target = '8.0'
  s.name = "SDKTest"
  s.summary = "Ban Test SDK"
  s.requires_arc = true
 
  # 2
  s.version = "0.1.0"
 
  # 3
  s.license = { :type => "MIT", :file => "LICENSE" }
 
  # 4 - Các bạn thay tên và mail của mình tại đây
  s.author = { "[name]" => "[email]" }
 
  # Ví dụ
  # s.author = { "Test" => "[email protected]" }
 
 
  # 5 - Homepage của lib 
  s.homepage = "[homepage URL]"
 
  #Ví dụ,
  # s.homepage = "https://github.com/nguyenhaidang/SDKTest"
 
 
  # 6 - Git URL
  s.source = { :git => "[git URL]", :tag => "#{s.version}"}
 
  # Ví dụ,
  # s.source = { :git => "https://github.com/nguyenhaidang/SDKTest.git", :tag => "#{s.version}"}
 
 
  # 7
  s.framework = "UIKit"
  s.dependency 'AFNetworking', '~> 3.0'

 
  # 8 Khai báo file code 
  s.source_files = "SDKTest/**/*.{h,m}"
 #Với swift thì:  s.source_files = "SDKTest/**/*.{swift}"
  # 9
  s.resources = "SDKTest/**/*.{png,jpeg,jpg,storyboard,xib}"
end

Sau đó các bạn copy file pod này vào thư mục root của project, và git push lên server git của mình. Khi user pod 'SDKTest', tự động SDK của bạn và các framework kèm theo sẽ tự động được kéo về như 1 thư viện cocoa pod bình thường.

Sample

Mình sẽ tạo 1 SDKTest có chức năng là cho user get config với cấu trúc của file podspec ở trên

{
    "id": 1,
    "name": "A green door",
    "price": 12.50,
    "tags": ["home", "green"]
}

**Bước 1: ** Chọn New Project -> Cocoa Touch Framework -> đặt tên project là SDKTest **Bước 2: ** Để minh hoạ cho việc sử dụng dependency framework mình sẽ sử dụng AFNetworking trong project

source 'https://github.com/CocoaPods/Specs.git'
platform:ios, "8.0"
	target 'SDKTest' do
    pod 'AFNetworking', '~> 3.0'
    end

**Bước 3: ** Tạo class SDKConfig

//
//  SDKConfig.m
//  SDKTest
//
//  Created by nguyen tuan dang on 3/27/17.
//  Copyright © 2017 Zi. All rights reserved.
//

#import "SDKConfig.h"
#import "AFNetworking.h"

@interface SDKConfig()

@property (nonatomic, strong) AFURLSessionManager *manager;

@end


@implementation SDKConfig

-(id) init {
    self = [super init];
    if (self != nil)
    {
        self.manager = [AFURLSessionManager new];
    }
    return self;
}

-  (void)getConfig:(void (^)(NSDictionary *, NSError *))handler {
    NSURL *url =  [NSURL URLWithString:@"https://raw.githubusercontent.com/nguyenhaidang/SDKTest/master/config"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    NSURLSessionDownloadTask *downloadTask = [_manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
        return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        NSData *raw = [[NSData alloc]initWithContentsOfURL:filePath];
        NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:raw options:NSJSONReadingMutableLeaves error:nil];
        handler(dic, error);
        
    }];
    [downloadTask resume];
}

@end

**Bước 4: ** Tạo File Podspec như trên

**Bước 5: ** Push project lên git

Bước 6: Test SDK với 1 project Test với file pods

source 'https://github.com/CocoaPods/Specs.git'
platform:ios, "8.0"
	target 'testSDK' do
    pod 'SDKTest', :git => 'https://github.com/nguyenhaidang/SDKTest.git'
    #Do thư viện này không được add vào spec repo của cocoapods nên bạn phải add trực tiếp đường dẫn git vào pod
    end

Bước 7: Kết quả

Resource

https://github.com/nguyenhaidang/TestSDK https://github.com/nguyenhaidang/SDKTest