美文网首页iOS 开发继续加油iOS Developer
ios sdk.framework静态库制作 看这篇就够了

ios sdk.framework静态库制作 看这篇就够了

作者: Tang_shuya | 来源:发表于2017-04-11 17:05 被阅读1069次

    一、主要讲解.framework静态库制作(包含build文件).由于.a静态库制作比较简单,这篇就不介绍了.
    二、简单制作.framework静态库(不包含build文件)。
    
    公司需求:写一个类似于微信授权登录功能的sdk静态库工程,提供给第三方app调用.
    
    分析:1.需要用到url_scheme,以便实现app之间的跳转(下篇详细介绍).
         2.sdk静态库里需要封装网络请求工具类,即静态库里封装静态库包.
         3.需求需要sdk中封装界面,搭建ui,加载图片等,所以需要build资源文件,制作.framework静态库.
         4.如果是只封装方法,暴露头文件给第三方app使用,制作简单的.a静态库即可.
     实现方式: 制作.framework静态库.
          假设 (环保执法) 是第三方app,我们自己的app叫做vPort.  
          点击vPort身份按钮,使用sdk跳转vPort,使用vPort进行登录.
     需要达到的效果是这样的:
    
    IMG_0439 2.PNG

    需要sdk跳转应用vport,调起vport的第三方登录界面.


    IMG_0440.PNG
    制作.framework的详细步骤:
            1.搭建bundle工程,打包资源文件.
    
    屏幕快照 2017-03-29 上午10.25.46.png 屏幕快照 2017-03-29 上午10.27.16.png
    2.工程设置:
        2.1. 工程里面只有两个文件,Info.plist和BuildSFVportApp.bundle文件,接下来我们将进行一些设置,选中项目文件,然后点击TARGETS->Build Setting,直接搜Architectures,然后将Base SDK改为Latest iOS.
    
    屏幕快照 2017-03-29 上午10.42.22.png
         2.2. 接着设置,搜索Mach -O Type
    
    屏幕快照 2017-03-29 上午10.44.50.png
         2.3. 接着设置,搜索linking
    
    屏幕快照 2017-03-29 上午10.48.40.png
         2.4.接着上一步继续设置.
    
    屏幕快照 2017-03-29 上午10.51.26.png
           2.5. 接着设置,搜索packaging
                   设置完,你会发现注意,Products下文件名就变成BuildSFVportApp.framework了,继续我们的设置.
    
    屏幕快照 2017-03-29 上午10.55.56.png
          2.6. 接着设置,搜索linking 
    
    屏幕快照 2017-03-29 上午10.59.58.png
          2.7. 接着设置,搜索 skip install
    
    屏幕快照 2017-03-29 上午11.04.16.png
            2.8. 设置infoPlist文件
    
    屏幕快照 2017-03-29 上午11.06.50.png
        2.9.选中Build Phases,在下方空白处点一下,然后editor -> add build path -> add header build path,如图:
    
    屏幕快照 2017-03-29 上午11.11.11.png
         2.10.紧接着在Link Binary With Libraries将UIKit引入
    
    屏幕快照 2017-03-29 上午11.24.37.png
            2.11. 经过这一步之后Build path下多处了一项,名为Headers,目前里面有0个项目,点击左边的三角形会发现里面有三项,Public, Private, Project. 
     需要对外暴露的头文件就放在Public下,其他的就放到Project下,待会儿就会看到怎么去用。在这里我们是为了存放源程序库,里面是二机制代码,不能够存放诸如xib,图片,等资源文件。
     所以我们还要另外创建一个包去存放我们的图片,选中TARGETS下BuildSFVportApp,点击Editor -> Add Target选择bundle.
     将bundle命名为BuildSFVportResource
    
    屏幕快照 2017-03-29 上午11.37.02.png
     2.12. 创建好后整个工程看上去应该是这样的:
           选择BuildSFVportResource,进行设置.
           选中刚刚创建的那个Target,点击Build Phase,点击右边的删除图标,将Compile Sources, Link Binary With Libraries删除掉.
           删除的原因是如果不删除,上传到App Store时苹果会报错,说你的包里面无源文件.
    
    屏幕快照 2017-03-29 上午11.38.39.png
         2.13.删除完成后是这样的:
    
    屏幕快照 2017-03-29 上午11.43.42.png
          2.14. 有时,就算你在这里进行了删除,苹果还会报另外一个错,为了保险起见选中BuildSFVportResource 下的 Info.plist文件里面的CFBundleExecutable这个key,进行删除.
          删除这两行:
           <key>CFBundleExecutable</key>
           <string>$(EXECUTABLE_NAME)</string>
    
    ![屏幕快照 2017-03-29 上午11.49.36.png](https://img.haomeiwen.com/i1619319/985f60f688df62ab.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
          2.15. 继续选中BuildSFVportResource这个TARGET,点击Build Settings, 搜索COMBINE_,将其值设为NO.
    
    屏幕快照 2017-03-29 上午11.55.06.png
         2.16. 接着设置,搜索Base Sdk,设置成latest iOS.
    
    屏幕快照 2017-03-29 上午11.56.33.png
         2.17. 由于当我们给客户提供包时资源库的名字一般和SDK的名字是一样的,所以最后搜索product name,将其改为BuildSFVportApp.这个名字跟你写的sdk名字一致即可.
    
         2.18. 基本设置完毕,由于sdk中需要用到图片,先将图片拖入到BuildSFVportResource目录下.
    
    屏幕快照 2017-03-30 上午11.26.52.png
         2.19. 现在就可以建立项目了,新建一个类,继承NSObject,在里面去写实现.
         选中BuildSFVportApp文件夹,添加一个cocoa的class,让他继承于NSObject,将其命名为WFVportAllowLogin,简单写两个方法在头文件中对外暴露接口.
    
    屏幕快照 2017-03-30 下午2.25.03.png
       2.20. 添加方法,加载图片,静态库中使用图片跟普通工程加载图片有所不同,需要引入NSBundle进行加载.
       使用控制器+xib封装到sdk也是一样,注意NSBundle的使用,这时不能传nil了.
    
    屏幕快照 2017-03-30 下午2.37.44.png
        2.21. 由于这个+(NSString *)url类方法是让其他app去调用的,所以,选中BuildSFVportApp在Build phase下将WFVportAllowLogin从Project下拖到Public下.
    
    屏幕快照 2017-03-30 下午2.46.10.png
        2.22.  最后的设置.
    
    屏幕快照 2017-03-30 下午2.48.41.png
       2.23. 至此,就完成了所有的工作.把两个target都编译一下.
       product下的文件就变成了灰色,就是可以运行了.
    
    屏幕快照 2017-03-30 下午2.55.57.png
       2.24. 生成模拟器和真机都可以运行的sdk环境.
        选中Product下的文件,右键 Show in Finder查看。
        由于规范需要,我将sdk工程名BuildSFVportApp改名为了BuildSFVportSdk.
        所以下面大家看到的sdk静态库包名为BuildSFVportSdk.framework了.
        生成模拟器和真机均可运行的sdk,本质就是改变二进制文件的编译.
        打开终端,cd到Products目录下,执行命令:
       lipo -create 真机二进制文件的路径(二进制文件在.framework包中)  模拟器二进制文件的路径 -output  BuildSFVportSdk(最终生成通用二进制文件的名称).
    
    屏幕快照 2017-04-11 下午4.13.42.png 屏幕快照 2017-04-11 下午4.14.39.png
       2.25. 执行完命令后,在Products包下会生成通用的二进制文件BuildSFVportSdk.
       执行命令为:lipo -create /Users/tangshuya/Library/Developer/Xcode/DerivedData/BuildWFVportSdk-bdhubopldatlubhgzurjhyczojlr/Build/Products/Debug-iphoneos/BuildWFVportSdk.framework/BuildWFVportSdk 
        /Users/tangshuya/Library/Developer/Xcode/DerivedData/BuildWFVportSdk-bdhubopldatlubhgzurjhyczojlr/Build/Products/Debug-iphonesimulator/BuildWFVportSdk.framework/BuildWFVportSdk
        -output BuildWFVportSdk
    
    屏幕快照 2017-04-11 下午4.31.47.png 屏幕快照 2017-04-11 下午4.32.08.png
       3.0. 使用sdk.
       BuildWFVportSdk.framework的制作已经完成,接下来就是使用他们了,这里我们新创建一个single view application,取名为PoliceFoShan.
       然后将我们刚刚生成的.framework文件以及.bundle文件拖到这个项目中。
    
    屏幕快照 2017-04-11 下午4.38.05.png
       3.1. 由于sdk中使用了第三方依赖库,所以需要将依赖库添加到项目中,目前需要添加的依赖库为:AFNetworking和SVProgressHUD.
       可以下载安装包添加,也可以通过cocopods集成.
    
        3.2. 在需要使用sdk的地方,导入头文件进行使用就可以了.
        #import <BuildWFVportSdk/WFVPortAllowLogin.h>
    

    二、如果是制作简单的.framework静态库,不需要build资源文件,按照以下步骤可以很轻松的实现:
    1.创建工程--选择 “Cocoa Touch Framework”

    1642454-f6cbf644793c09e3.png
    2.设置Mach-O的编译方式,选择工程--Build Settings,搜索mach
    这步很重要,这一步决定我们制作出来的是静态库还是动态库,默认选择的是Dynamic Library,要手动选择Static Library。
    3.继续搜索--Build Active Architectures--设置为NO。
    设置为NO的时候,会编译支持的所有的版本
    设置为YES的时候,是为Debug的时候速度更快,它只编译当前的architecture 版本。
    4.搜索Architectures--点击+号,添加armv7s,支持真机类型。
    5.搜索link with
    将Link With Standard Libraries设置为NO.
    6.如果导入第三方库,.a静态库(AFNetworking等),不要选择添加target。
    这样避免了,别人项目在引入相同的第三库不会报错。 1642454-76744bf837210a25.png

    相关文章

      网友评论

        本文标题:ios sdk.framework静态库制作 看这篇就够了

        本文链接:https://www.haomeiwen.com/subject/ktijottx.html