SDK的製作詳解

来源:http://www.cnblogs.com/fcug/archive/2016/07/14/5670234.html
-Advertisement-
Play Games

一個簡單的SDK製作是很容易的,複雜的sdk其實就和複雜化的應用一樣,都是從簡單開始的,這裡介紹一下sdk的簡單製作 步驟: 1.創建sdk,公開文件 2.編譯、獲取sdk文件 3.導入工程,配置文件 4.解決錯誤,完成 1.創建sdk,公開文件 然後起個需要的名字 創建出這樣的sdk,自動生成的文 ...


一個簡單的SDK製作是很容易的,複雜的sdk其實就和複雜化的應用一樣,都是從簡單開始的,這裡介紹一下sdk的簡單製作

步驟:

1.創建sdk,公開文件

2.編譯、獲取sdk文件

3.導入工程,配置文件

4.解決錯誤,完成

 

1.創建sdk,公開文件

然後起個需要的名字

創建出這樣的sdk,自動生成的文件和普通工程的viewController一樣都是可以刪的,不喜歡的可以儘管刪

介紹使用sdk裡面的類和帶xib的控制器

先說類,用這個自動生成的,在類裡面添加一個列印的方法

.h文件

#import <Foundation/Foundation.h>

@interface SDK : NSObject

-(void)sdkLog;

@end

.m文件

#import "SDK.h"

@implementation SDK

-(void)sdkLog
{
    NSLog(@"sdkAction");
}

@end

就是這樣普通,然後說下控制器

先創建一個控制器,名為:

SDKViewController  記得勾選添加xib,等下要說明一下暴露文件的

然後在xib上隨便添加點什麼東西,等下跳轉

自己能確定跳轉來的是我們sdk里的這個控制器就行了

接下來的比較重要,我們做一個sdk靜態庫就是為了保護和不讓人看見裡面的實現內容,但如果是需要被人調用的部分,還是需要暴露出來的,那怎麼做呢?

按圖操作就能把文件暴露出來,暴露需要被調用的頭文件,註意,如果暴露的頭文件里包括控制器,而且控制器是有xib文件的,那麼xib一定也得暴露出來,否則等下在其他工程里調用的時候,找不到xib的

 

到這裡sdk製作就告一段落,sdk包分三種:真機sdk包,虛擬機sdk包,兩種包的合併,合併的就不說了,有興趣的百度下,一般真正在使用時是不用合併包的,用微博,qq什麼sdk的時候就知道,都是把兩種包分開的,因為合併的包比較大這樣會導致打包後的ipa包變大,引起用戶的不滿,浪費用戶流量。

 

 

2.編譯、獲取sdk文件

接下去-> 編譯,選擇真機或者Geneic iOS Device編譯出來的就是真機sdk,選擇虛擬機編譯出來的就是虛擬機sdk

真機sdk:

 

選擇真機或者Geneic iOS Device編譯,原本紅色的libSDK.a就變成灰色,表示文件存在

選中libSDK.a點擊右鍵選擇show in finder就能看到內容了,

註意這裡文件夾的名字,Debug-iphoneos文件夾是真機sdk文件夾,等下看看虛擬機sdk文件夾的名字

這裡include文件夾裡面的文件就是暴露的文件,在把libsdk.a加進工程時也要把裡面的文件一起加進去的,真機和虛擬機sdk使用是一樣的,先看虛擬機的問題

 

虛擬機sdk:

這裡先clear一下,把剛纔編程的真機sdk包清理掉才能看到xcode7虛擬機帶來的問題,清理完後libSDK.a就是紅色的了,不存在

然後選擇虛擬機編譯,如果你用的是xcode7,你會發現怎麼編譯,libSDK.a都是紅色的,這個是xcode7的bug,之前有人說xcode7沒法編譯虛擬機的sdk,這是錯的,不用著急,照樣可以生成,如果編譯提示success其實虛擬機sdk還是成功生成的,只是在xcode上看不到,這時不用clear,把真機sdk包也一起編譯了,生成了真機的sdk,這裡點擊libsdk.a文件show in finder,這裡就看到的是上面那種情況

註意 

之前提過文件夾的名字,現在看到的文件夾還是真機sdk的文件夾,就是你再點虛擬機的編譯多一次進來,也會發現是真機的文件夾,這時候按  command+⬆️,返回上層文件夾

現在就看到兩個文件夾了,左邊的是真機sdk文件夾,右邊的是虛擬機sdk文件夾,點擊虛擬機文件夾進去就能看到和真機sdk一樣的內容,xcode7可以通過這種方式來找虛擬機sdk文件夾的

 

 

3.導入工程,配置文件

用虛擬機示範下

創建一個新工程,例如命名test

把include裡面的文件夾還有.a文件拉到工程裡面如果沒勾選要記得勾選add to targets

 

然後配置一下,選擇在配置里搜索search,如果裡面的library search paths為空,那麼雙擊空處箭頭的地方給它添加一個庫的尋找路徑,給.a文件路徑如 $(PROJECT_DIR)/text/libSDK.a

或者自己加可以找到.a文件的其他路徑也可以

不然會找不到.a文件

再搜索other linker,給other linker flags加上  -Objc  和   -all_load,-all_load視情況加,可不加下麵有說明

Other Linker Flags:其他鏈接標簽

設為"-ObjC"

當導入的靜態庫使用了類別,需要設為-ObjC,就算沒有使用也給配上,預防以後使用其他的sdk裡面有

補充:Other Linker Flags設置的值介紹

-ObjC:加了這個參數後,鏈接器就會把靜態庫中所有的Objective-C類和分類都載入到最後的可執行文件中

-all_load:會讓鏈接器把所有找到的目標文件都載入到可執行文件中,但是千萬不要隨便使用這個參數!假如你使用了不止一個靜態庫文件,然後又使用了這個參數,那麼你很有可能會遇到ld: duplicate symbol錯誤,因為不同的庫文件裡面可能會有相同的目標文件,所以建議在遇到-ObjC失效的情況下使用-force_load參數。
-force_load:所做的事情跟-all_load其實是一樣的,但是-force_load需要指定要進行全部載入的庫文件的路徑,這樣的話,你就只是完全載入了一個庫文件,不影響其餘庫文件的按需載入

 

這樣就配置完了

最後是校驗是否能使用sdk了

可以在appdelegate裡面這樣寫

AppDelegate.m文件里先導入工程使用的控制器

#import "ViewController.h"

在下麵這個方法里添加導航控制器,因為要跳轉到sdk裡面的控制器需要

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    
    ViewController *rootViewController = [[ViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:rootViewController];
    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
    return YES;
}

 

然後在viewController.m裡面

或者你如果想看得更明顯一點自己加button,加跳轉事件才去跳轉到sdk里,這裡我就偷懶一下了

 1 #import "ViewController.h"
 2 #import "SDK.h"
 3 #import "SDKViewController.h"
 4 
 5 @interface ViewController ()
 6 
 7 @end
 8 
 9 @implementation ViewController
10 
11 - (void)viewDidLoad {
12     [super viewDidLoad];
13     
14     
15     SDK *sdk = [[SDK alloc]init];
16     [sdk sdkLog];
17     
18     SDKViewController *sdkCtl = [[SDKViewController alloc]init];
19     [self.navigationController pushViewController:sdkCtl animated:YES];
20 }
21 
22 @end

 完成編譯運行

 

4.解決錯誤,完成

 寫完編譯工程,如果出現類似這樣的情況

那是因為虛擬機sdk的編譯包也有不同的像i386,x86_64,arm,arm64等,這是我們所需要包的Charts.framework不對,這裡不細說了,想瞭解的可以百度i386,x86_64,arm,arm64的區別,這裡最簡單直接的解決辦法是在編譯sdk時選擇什麼虛擬機,那運行時也用什麼虛擬機,但如果sdk編譯時用5s、6、6 plus、6s、6s plus編譯,那麼這些的sdk在這些虛擬機上都能通用,這樣也不用考慮那麼多了。

framework製作靜態庫可以和.a是一樣的

想製作全部通用的虛擬機sdk包可以參考http://blog.csdn.net/lizhongfu2013/article/details/12648633

 

最後運行列印出了

sdkAction

界面上顯示了sdk里控制器里的界面,恭喜你完成了。

看上面似乎很多內容,其實做多幾次瞭解之後就知道是很簡單的,frameword製作靜態庫時也是這樣,動態庫就不一樣了,也不推薦工程里用自己做的動態庫,app store會審核不通過的,然後是debug和release模式,製作真正的sdk時應該在product->scheme->edit scheme的Build Configuration裡面把Debug切換為release然後再編譯使用,和工程裡面是一樣的道理,如果都完成了應該換。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 槽和普通成員函數一樣,可以是虛函數、被重載,可以是公有、私有、保護的。它可以被其它C++成員函數調用。 槽連接了信號,當發射這個信號時,槽會被自動調用。 連接函數: bool QObject::connect ( const QObject * sender, const char * signal ...
  • 一、概念 生產者與消費者問題是一個金典的多線程協作的問題.生產者負責生產產品,並將產品存放到倉庫;消費者從倉庫中獲取產品並消費。當倉庫滿時,生產者必須停止生產,直到倉庫有位置存放產品;當倉庫空時,消費者必須停止消費,直到倉庫中有產品。 解決生產者/消費者問題主要用到如下幾個技術:1.用線程模擬生產者 ...
  • 1. 從官網下載最新版Python 3.X 後安裝;由於Mac OS X EI Capitan中預設已經集成了 Python 2.7,因此需要在Terminal中輸入 Python3 來檢測是否安裝成功,使用Python命令預設調用的是Python 2.7。 2. 安裝pip;從官網頁面下載get- ...
  • function myBrowser() { var userAgent = navigator.userAgent; //取得瀏覽器的userAgent字元串 var isOpera = userAgent.indexOf("Opera") > -1; //判斷是否Opera瀏覽器 var isI ...
  • 用百度編輯器——Ueditor(版本1.4.3.3,2016-05-18日上線)插入錨點的時候,每次總是失敗,百思不得其解。通過分析Ueditor的代碼ueditor.all.js,可以看出Ueditor插入錨點的過程,實際上是一個img標簽和a標簽相互轉換的過程,其代碼如下: 'anchor':{ ...
  • 主要練習一下GridView MainActivity.java activity_main.xml main_grid_item.xml ...
  • ObjC中怎麼判斷可變和不可變 怎麼判斷NSString和NSMutableString呢? 請聽題 這很簡單當然選B的,字元串常量是NSString。所以正確答案是A,是不是有種高考題的趕腳。建議這題出面試。 首先應該百度objc的類簇概念,然後是工廠模式。這篇筆記只講怎麼判斷,開個傳送門自己去打 ...
  • 在如今的互聯網時代,微信已是一個超級App。這篇通過ViewPager + Fragment實現一個類似於微信的界面,之前有用FragmentTabHost實現過類似界面,ViewPager的實現方式相對於FragmentTabHost的方式更簡單明瞭。 ViewPager: ViewPager繼承 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...