2019-12-26 14:44:48 u012460084 阅读数 64
  • 如何学好webpack4.0?

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个  bundle。

    812 人正在学习 去看看 尹涛

 

目录

一、创建一个workspace项目

二、创建一个调试运行SDK的demo,放置在DapengSDK根目录文件夹里面

三、创建SDK工程,放置在DapengSDK根目录文件夹里面

四、修改SDK工程配置参数

五、创建图片资源.bundle

六、创建SDK和.bundle编译打包脚本

七、使用sdk

八、Demo下载地址


一、创建一个workspace项目

  1. 为什么要创建一个workspace项目

    workspace项目可以同时包含多个项目,我们就可以把“SDK打包项目”和“调试运行SDK的demo”放在一起同时管理使用。
     
  2. 创建一个根目录文件夹,用作放置workspace项目组管理文件、“SDK打包项目”、“调试运行SDK的demo”


     
  3. 创建workspace工作空间管理文件,放置在DapengSDK根目录文件夹里面




     

二、创建一个调试运行SDK的demo,放置在DapengSDK根目录文件夹里面

  1. 创建demo需要将支持系统版本改为最低版本,为了更好地测试我们开发的SDK,只能忍痛删除.storyboard相关的所有控件,将项目改为全代码工程
     
  2. 创建工程时需要为当前项目选择workspace项目组管理文件,先打开workspace文件,创建新工程:command + shift + N




三、创建SDK工程,放置在DapengSDK根目录文件夹里面

        先打开workspace文件,创建新工程: command + shift + N





四、修改SDK工程配置参数

  1. 创建一个测试类

  2. 修改工程支持系统版本

  3. 设置Build Setting参数 



     
  4. 设置Headers,将要公开的头文件拖到Public下,要隐藏的放到Private或Project下,隐藏的头文件不能被引用


    修改为:

     
  5. 在DapengSDK.h(必须是公开的,否则无法引用)中将所有要公开的.h引入


五、创建图片资源.bundle

  1. 在DapengSDK工程下创建.bundle




     
  2. 修改.bundle工程配置

    "Base SDK" 设置为 iOS


    "iOS Deployment Target" 设置为 iOS 8.0 (为了兼容性,最好选择最低版本)


    "Build Active Architecture Only" 设置为 "YES"


     Installation Directiotory 删除掉后面的路径


    Code Signing Identity 选择 开发


    "Skip Install" 设置为 "NO"


    "Strip Debug Symbols During Copy" 中"Release"模式设置为 "YES"


    "COMBINE_HIDPI_IMAGES" 设置为 "NO"

    buildSetting->Versioning Systems修改为none
  3. 删除Info.plist文件,buildSetting->搜索“Info.plist”删除路径配置

六、创建SDK和.bundle编译打包脚本

  1. 在SDK工程中创建脚本问文件




  2. 在脚本执行文件中填写sdk打包脚本 和 .bundle打包脚本
    #!/bin/sh
    # 工程文件所在的根目录
    SRCROOT='.'
    # sdk 编译过程的输出文件路径
    WRK_DIR=./build
    # 创建 sdk 输出路径
    mkdir -p ${SRCROOT}/Products
    
    
    
    
    
    # 编译静态库framework名字 警告!!!!!!需要修改
    FMK_NAME='DapengSDK'
    # 真机 framework 输出文件路径
    DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
    # 模拟器 framework 输出文件路径
    SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
    
    # 编译静态库framework
    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos build -UseModernBuildSystem=NO
    xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator  build -UseModernBuildSystem=NO
    
    # 最终 sdk 输出的文件路径
    INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
    # 清理之前生成的 sdk
    if [ -d "${INSTALL_DIR}" ]
    then
    rm -rf "${INSTALL_DIR}"
    fi
    # 移动一个 framework 到 SDK输出路径中
    cp -LR "${DEVICE_DIR}" "${INSTALL_DIR}"
    
    # 合并真机和模拟器的静态库.framework
    lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
    
    
    
    
    
    # 资源文件bundle名字 警告!!!!!!需要修改
    BUNDLE_NAME='DapengSDKResource'
    # 真机 bundle 输出文件路径
    BUNDLE_DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${BUNDLE_NAME}.bundle
    # 模拟器 bundle 输出文件路径
    BUNDLE_SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${BUNDLE_NAME}.bundle
    # 编译资源文件bundle
    xcodebuild -configuration "Release" -target "${BUNDLE_NAME}" -sdk iphoneos build -UseModernBuildSystem=NO
    xcodebuild -configuration "Release" -target "${BUNDLE_NAME}" -sdk iphonesimulator  build -UseModernBuildSystem=NO
    
    # 最终 资源文件 输出的文件路径
    BUNDLE_INSTALL_DIR=${SRCROOT}/Products/${BUNDLE_NAME}.bundle
    # 清理之前生成的 sdk
    if [ -d "${BUNDLE_INSTALL_DIR}" ]
    then
    rm -rf "${BUNDLE_INSTALL_DIR}"
    fi
    # 移动一个 budle 到 资源文件输出路径中
    cp -LR "${BUNDLE_DEVICE_DIR}" "${BUNDLE_INSTALL_DIR}"
    
    # 合并真机和模拟器的资源文件bundle
    lipo -create "${BUNDLE_DEVICE_DIR}/${BUNDLE_NAME}" "${BUNDLE_SIMULATOR_DIR}/${BUNDLE_NAME}" -output "${BUNDLE_INSTALL_DIR}/${BUNDLE_NAME}"
    
    
    
    
    
    # 清理编译文件
    rm -r "${WRK_DIR}"
    
    # 打开SDK目录
    open "${SRCROOT}/Products"

     

  3. 执行脚本,打包sdk .framework和资源文件 .bundle



    编译成功,自动弹出打包文件夹

     

七、使用sdk

  1. 将sdk文件夹导入到demo工程中


     
  2. 调用SDK代码


八、Demo下载地址

  demo下载传送门,点击传送----------->>>>>>>>>

2016-07-27 16:23:57 tianshats 阅读数 9881
  • 如何学好webpack4.0?

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个  bundle。

    812 人正在学习 去看看 尹涛


一、什么是库

       库实际上是一种代码共享的方式,主要用于代码重用和源码隐藏,通常分为动态库和静态库。

       静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

       动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存空间。


二、什么是.a、.bundle、.framework


       在iOS中静态库以.a和.framework的形式存在,动态库以.dylib和.framework的形式存在。

       之所以.framework既可能是动态库又可能是静态库,是因为苹果公司禁止用户级App使用动态库,而自己却又堂而皇之的使用动态库,这就造成了iOS中系统级的.framework是动态库,用户级的.framework是静态库

        二者区别不大,.a是纯二进制文件,.a文件不能单独使用,至少要有.h文件配合,而.framework除了二进制文件外,还包含一些资源文件(头文件,plist等),由于自身包含了头文件,所以.framework可以单独使用。

          .a和.framework两种静态库,通常都是把需要用的到图片或者xib文件存放在一个bundle文件中,而该bundle文件的名字和.a或.framework的名字相同。关于bundle文件的制作方法,后面有专门介绍。



三、静态库使用的必要性


   1>.  代码的共享与重用

    2>.  程序模块化

    3>.  分享给别人代码库时代码隐藏

    4>.  开发第三方SDK


四、.a静态库文件


1、点击创建Project


2、在.m和.h中进行代码编写

3、根据armv7和arm64打包两个.a进行合并

合并两个.a文件

lips -create /Users/tiansha/Desktop/libTestLibrary.a /Users/tiansha/Desktop/Demo/Shengshihuihai/ShengShiHuiHai/Resource/libTestLibrary.a -output /Users/tiansha/Desktop/libTestLibrary2.a

模拟器包和真机包也可以用该方法进行合并。


4、合并后导入到项目中,并把.h文件与.a 文件一起导入到项目中



5、编译项目,导融TestLibrary 即可调用.a中的方法



总结:.a文件需要模拟器和真机文件进行合并后项目中才都可以使用,避免切换造成的开发成本高的问题。


五、资源库.bundle


1、bundle资源库的特点

Bundle是静态的,也就是说,我们包含到包中的资源文件作为一个资源包是不参加项目编译的。也就意味着,bundle包中不能包含可执行的文件。它仅仅是作为资源,被解析成为特定的2进制数据。

2、新建.bundle


3、加入你需要编译在bundle中的资源文件。

当然,默认的配置也是可以的,如果你需要特定的优化或者特定的路径配置,你可以进行下面第4步的配置。
4、进行可选设置
资源包只需要编译不需要安装



5、编译即可生成.bundle文件,导入项目中


6、调用方式

    UIImageView *image = [[UIImageViewalloc]initWithFrame:CGRectMake(0,0,320,480)];

    image.backgroundColor = [UIColorredColor];

    image.image = [UIImageimageNamed:@"TestBundle.bundle/Contents/Resources/1.png"];

    [self.viewaddSubview:image];


五、.framework

1、创建


2、Build Phases -> Headers,可以看出有三个选项,分别是Public,Private,Project;把需要暴露给别人的.h文件拖到Public中,剩下的不要暴露的,即为隐藏的文件,放在Project中



3、把所有需要暴露的.h文件都用#import<TestFramework/TestLibrary.h>引入,记住一定要将所有的需要暴露的.h文件都写在给定的.h文件中,不然编译后生成的.framework在引用的时候会有警告。



4、新建一个Target,选择Other - >Aggregate



5、选中新建的Target,点击Build Pharas ,选中左上角的+,New Run Script Phase,添加脚本



脚本用于合并Framework,真机和模拟器版本,以及armv7 armv7s arm64等不同architectures

# Sets the target folders and the final framework product.

# 如果工程名称和FrameworkTarget名称不一样的话,要自定义FMKNAME

# 例如: FMK_NAME = "MyFramework"

FMK_NAME=${PROJECT_NAME}


# Install dir will be the final output to the framework.

# The following line create it in the root folder of the current project.

INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework


# Working dir will be deleted after the framework creation.

WRK_DIR=build

DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework

SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework


# -configuration ${CONFIGURATION}

# Clean and Building both architectures.

xcodebuild -configuration "Release" -target"${FMK_NAME}" -sdk iphoneos clean build

xcodebuild -configuration "Release" -target"${FMK_NAME}" -sdk iphonesimulator clean build


# Cleaning the oldest.

if [ -d "${INSTALL_DIR}" ]

then

rm -rf "${INSTALL_DIR}"

fi


mkdir -p "${INSTALL_DIR}"


cp -R "${DEVICE_DIR}/""${INSTALL_DIR}/"


# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.

lipo -create "${DEVICE_DIR}/${FMK_NAME}""${SIMULATOR_DIR}/${FMK_NAME}" -output"${INSTALL_DIR}/${FMK_NAME}"


rm -r "${WRK_DIR}"


open "${SRCROOT}/Products/"


6、选中Targets中的第一个Target,点击Build Setting -> Mach-O Type,选择Static Library,到这里会有一个问题存在,就是无法在iPhone5c上使用.framework,这是我们需要在Build Setting -> Architectures ->Architectures中添加armv7s




7、选中Aggregate,进行编译,编译成功后自动打开product文件夹



8、打开终端,可以查看支持的架构

lipo -info /Users/tiansha/Desktop/Demo/TestFramework/Products/TestFramework.framework/TestFramework




9、导入项目中即可使用



注意:运行的xcode版本是7.3


2015-05-14 09:24:15 xundh 阅读数 5023
  • 如何学好webpack4.0?

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个  bundle。

    812 人正在学习 去看看 尹涛

1.在xcode外创建一个文件夹,命令为app.bundle(必须为.bundle扩展名)

以后打开此文件夹,要鼠标右键-显示包内容,直接双击不行。

2.加到xcode项目里

3.代码获取里面文件路径:

资源路径:

NSString *bundlePath = [[NSBundle mainBundle] resourcePath];

文件路径:

  NSString *url=[[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"app.bundle/datas.sqlite"];

上一级路径:

NSString *secondParentPath = [[bundlePath stringByDeletingLastPathComponent] stringByDeletingLastPathComponent]

不通过bundle获取资源:

UIImage *img=[UIImage imageNamed:@"cellicon.png"];

获取自定义的文件路径:

    NSString *newPath=[NSString stringWithFormat:@"%@%@%@",[[NSBundle mainBundle]resourcePath],@"/",@"test.txt"];
    NSFileHandle *url2=[NSFileHandle fileHandleForReadingAtPath:newPath];

    NSString *newPath=[[NSBundle mainBundle] pathForResource:@"test" ofType:@"txt"];
    NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath:newPath];


2019-03-26 17:05:10 chenbinqq 阅读数 404
  • 如何学好webpack4.0?

    webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个  bundle。

    812 人正在学习 去看看 尹涛

打包.framework可以参考文章《将使用了CocoaPods的IOS项目打包为Framework+打包后的测试+PrefixHeader.pch使用

打包.bundle可以参考文章《IOS项目打包bundle

问题描述:

使用静态库项目已经将.framework、.bundle包打好,并且.framework中的代码使用了.bundle中的图片资源文件,.framework中对图片资源文件的加载是从原IOS项目中直接拷贝过来的。

现在要新建一个测试Demo,在测试Demo中添加.framework、.bundle,并在测试Demo中的ViewController.m中添加代码,推出.framework中的主操作界面。

因为静态库项目和测试demo中均存在ViewController.h、ViewController.m。因此,将测试Demo中的ViewController.h、ViewController.m重命名,如修改为ViewController1.h、ViewController1.m,并对应修改这两个文件内部代码中的ViewController为ViewController1。修改测试demo中Main.storyboard中关联的ViewController为ViewController1,如下图所示:

在ViewController.m中添加的推出.framework中主操作界面的代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    TabBarViewController *vc = [[TabBarViewController alloc]init];
    ((AppDelegate *)([UIApplication sharedApplication].delegate)).window.rootViewController = vc;
    
}

执行Command+B,编译成功build success。运行项目,在模拟器中可以推出.framework的主操作页面,但是页面中涉及到的所有图片都不显示。

解决方案:

.framework中涉及到的主页面中图片的加载方式需要进行修改,并且静态库项目中放置在Assets.xcassets中@2x,@3x的图片需要从Assets.xcassets中拷贝出来放置到静态库项目中,然后直接将这些图片添加到Bundle对应的Copy Bundle Resources中,重新打包.bundle

修改静态库项目中涉及到的上述所有图片加载方式的代码,可以使用全局搜索,如下图所示:

图片加载方式修改为如下:

NSString *bundlePath = [[NSBundle bundleForClass:[self class]].resourcePath
                                stringByAppendingPathComponent:@"/MyBundle.bundle"];
        NSBundle *resource_bundle = [NSBundle bundleWithPath:bundlePath];
        UIImage *image = [UIImage imageNamed:@"banner"
                                    inBundle:resource_bundle
               compatibleWithTraitCollection:nil];

例子如下:

静态库项目中,搜索出来的其中一处涉及到touxiang.png图片的原代码如下:

-(UIImageView *)touxiangImage{
    if (!_touxiangImage) {
        _touxiangImage = [[UIImageView alloc]initWithFrame:CGRectMake(35, 35, 50, 50)];
        _touxiangImage.layer.masksToBounds = YES;
        _touxiangImage.layer.cornerRadius = 23;
         touxiangImage.image = [UIImage imageNamed:@"touxiang"];
       
        [_touxiangImage.layer setBorderWidth:0.25];
        [_touxiangImage.layer setMasksToBounds:YES];
    }
    return _touxiangImage;
}

修改后的代码如下:

-(UIImageView *)touxiangImage{
    if (!_touxiangImage) {
        _touxiangImage = [[UIImageView alloc]initWithFrame:CGRectMake(35, 35, 50, 50)];
        _touxiangImage.layer.masksToBounds = YES;
        _touxiangImage.layer.cornerRadius = 23;
//        _touxiangImage.image = [UIImage imageNamed:@"touxiang"];

        NSString *bundlePath = [[NSBundle bundleForClass:[self class]].resourcePath
                                stringByAppendingPathComponent:@"/MyBundle.bundle"];
        NSBundle *resource_bundle = [NSBundle bundleWithPath:bundlePath];
        _touxiangImage.image = [UIImage imageNamed:@"touxiang"
                                          inBundle:resource_bundle
                     compatibleWithTraitCollection:nil];
        
       
        [_touxiangImage.layer setBorderWidth:0.25];
        [_touxiangImage.layer setMasksToBounds:YES];
    }
    return _touxiangImage;
}

同理,将bundle中所有图片在静态库项目中涉及的加载方式代码进行上述修改。然后,重新打包.framework、.bundle,导入到测试Demo中,再次尝试执行测试Demo,在测试Demo中推出的.framework的主操作页面中,图片显示正常。

 

 

没有更多推荐了,返回首页