iOS实时发版,动态库方式 不上App Store可以使用啊

iOS如果想要实现实时发版,据我了解现在基本上用的是两种方式

1:使用Lua脚本进行,基本上很多手游都是这样做的,再配合上Cocos2d-x这个框架使用起来也比较简单。

2:使用动态库  这里我说的就是这中方式。

先说下实现思路,在动态库中实现一个入口类,和入口方法,这个方法在主工程中调用

这里说下创建动态库的步骤:

下面直接上代码啦。

动态库中测试界面

VCOne.h

#import <UIKit/UIKit.h>

@interface VCOne :UIViewController
@property (retain, nonatomic) NSBundle *root_bundle;//保存framework的路径

@end

VCOne.m

- (void) viewDidLoad
{
    [super viewDidLoad];
    UILabel * label1 = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
    label1.text = @"第一个视图";
    [self.view addSubview:label1];
    self.view.backgroundColor = [UIColor whiteColor];

    UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[_root_bundle pathForResource:@"changmen" ofType:@"jpg"]]];
    image.frame = CGRectMake(100, 100, 300, 300);
    [self.view addSubview:image];

}

下面介绍与主工程交互的入口类。

FrameWorkStart.h

#import <Foundation/Foundation.h>

@interface FrameWorkStart : NSObject

/*
 * 主程序和此动态库的关系枢纽,也就是从“主程序”到“动态库内封装的程序”的入口方法
 */
- (void) startWithObject:(id)object withBundle:(NSBundle *)bundle;

@end

FrameWorkStart.m

#import "FrameWorkStart.h"
#import "VCOne.h"

@implementation FrameWorkStart

- (void) startWithObject:(id)object withBundle:(NSBundle *)bundle
{

    /*
     *初始化第一个controller

     *这里的重点是资源文件的加载
      通常我们在初始化的时候并不是很在意bundle:这个参数,
      其实我们所用到的图片、xib等资源文件都是在程序内部中获取的,也就是我们常用的[NSBundle mainBundle]中获取,所谓的NSBundle本质上就是一个路径,mainBundle指向的是.app下。
      而如果我们不指定bundle,则会默认从.app路径下去寻找资源。
      不过很显然,我们的动态库是放到“主程序”的document文件下的,所以资源文件是不可能在[NSbundle mainBundle]中获取到的,所以这里我们需要指定bundle参数,这也是传递framework的路径的意义所在
     */

    VCOne *vcone = [[VCOne alloc] init];
    vcone.root_bundle = bundle;
    //转换传递过来的mainCon参数,实现界面跳转
    UIViewController *viewCon = (UIViewController *)object;
    [viewCon presentViewController:vcone animated:YES completion:^{
        NSLog(@"跳转到动态更新模块成功!");
    }];

}

下面是主工程,当然就是创建的普通的iOS工程

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(30, 30, 100, 50);
    [btn setTitle:@"测试动态库" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];

}

- (void) test
{

    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    NSString *documentDirectory = nil;
    if ([paths count] != 0)
        documentDirectory = [paths objectAtIndex:0];
    NSLog(@"documentDirectory = %@",documentDirectory);
    //拼接我们放到document中的framework路径
    NSString *libName = @"Test1.framework";
    NSString *destLibPath = [documentDirectory stringByAppendingPathComponent:libName];

    //判断一下有没有这个文件的存在 如果没有直接跳出
    NSFileManager *manager = [NSFileManager defaultManager];
    if (![manager fileExistsAtPath:destLibPath]) {
        NSLog(@"There isn't have the file");
        return;
    }

    //复制到程序中
    NSError *error = nil;

    //加载方式二:使用NSBundle加载动态库
    NSBundle *frameworkBundle = [NSBundle bundleWithPath:destLibPath];
    if (frameworkBundle && [frameworkBundle load]) {
        NSLog(@"bundle load framework success.");
    }else {
        NSLog(@"bundle load framework err:%@",error);
        return;
    }

    /*
     *通过NSClassFromString方式读取类
     *FrameWorkStart 为动态库中入口类
     */
    Class pacteraClass = NSClassFromString(@"FrameWorkStart");
    if (!pacteraClass) {
        NSLog(@"Unable to get TestDylib class");
        return;
    }

    /*
     *初始化方式采用下面的形式
      alloc init的形式是行不通的
      同样,直接使用PacteraFramework类初始化也是不正确的
     *通过- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
      方法调用入口方法(startWithObject:withBundle:),并传递参数(withObject:self withObject:frameworkBundle)
     */
    NSObject *pacteraObject = [pacteraClass new];
    [pacteraObject performSelector:@selector(startWithObject:withBundle:) withObject:self withObject:frameworkBundle];

}

将动态库的工程编译一下,放入主工程的document的目录下

这里在记录下如果找到编译出来的静态库。

代码例子:http://download.csdn.net/detail/qqmcy/8569901

时间: 2024-08-29 16:49:01

iOS实时发版,动态库方式 不上App Store可以使用啊的相关文章

iOS XCode7制作.Framework动态库和.a静态库的总结

一.开发SDK时的支持情况: OC语言制作动态库时,支持iOS8+:OC语言制作静态库,支持iOS7+. Swift语言制作动态库时,支持iOS8+;Swift不支持静态库. 对于SDK来说,支持情况非常重要.像我就是一开始就被坑了,我使用Swift开发动态库的方式提供SDK,所以只能支持到iOS8+.但这意味着所有使用我的SDK的客户的APP都必须到iOS8+,这就坑爹了. 所以假如需要支持iOS7的话,只有使用OC语言开发.a静态库的一条路. 二.开发动态库的简易过程: 开发动态库时,只要通

iOS开发-编译使用动态库

bogon:AlipaySDK.framework loyinglin$ lipo -info AlipaySDK Architectures in the fat file: AlipaySDK are: i386 x86_64 armv7 armv7s arm64 bogon:lib loyinglin$ lipo -info libssl.a Architectures in the fat file: libssl.a are: armv7 armv7s i386 x86_64 arm6

iOS 使用 Xcode8 制作动态库及静态库

在使用第三方 SDK 时,经常遇到他们提供的仅仅只有一个动态或静态库,并不能获取源码.使用动态库 FrameWork 或 静态库 Lib,可以满足不想把核心代码的具体实现向使用者展示,又能避免其他人错改动代码. 一.动态库 FrameWork 的制作: 打开 Xcode,选中 Cocoa Touch FrameWork. 新建一个 PublicModel 文件,简单输出Log 若这个 PublicManager 文件想要对外公开头文件.需要 然后编译,得到动态库 FrameWork 到目前为止,

ios动态库

real framework中不可以使用类别 或 不可以不包含类文件 real framework 中直接调用NSClassFromString函数会返回null  需要强制加载指定类 或 直接通过类名引用 linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见

ios 开发中 动态库 与静态库的区别

使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库,多个应用程序共享内存中得同一份库文件,节省资源 3使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的. 从1可以得出,将整个应用程序分模块,团队合作,进行分工,影响比较小. 等其他好处, 从2可以看出,其实动态库应该叫共享库,那么从这个意义上来说,苹果禁止iOS开

iOS 静态库,动态库与 Framework

iOS 静态库,动态库与 Framework 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件.另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间. 上面提到库在使用的时候需要

转载:iOS静态库与动态库

一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库:在程序编译时会被完整地链接到目标代码中,程序运行时将不再需要改静态库.利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当然这也会成为他的缺点,因为如果静态函数库改变了,

iOS中创建动态库及调用方法

去年因需要用到动态库,自己就找了好多一些 资料,最终找到了一套方法,怎么创建与使用动态库,记录一下: Xcode提供了在iOS工程中创建静态库的功能,和在MAC上创建动态库和静态库的功能. 但是没有提供在iOS工程中创建动态库的功能(苹果官方不允许程序中存在动态库链接,这样的程序会被AppStore拒),如下图:  由于苹果不支持自己创建iOS动态库,所以要想创建动态库首先要修改Xcode的配置文件使其支持具备创建iOS 动态库的功能, 经过调研和查询网上的一些资料,并经过自己测试成功,以下是修

客户端单周发版下的多分支自动化管理与实践

背景 目前,互联网产品呈现出高频优化迭代的趋势,需求方希望尽早地看到结果,并给予及时反馈,所以技术团队需要用"小步快跑"的姿势来做产品,尽早地交付新版本.基于以上背景,美团客户端研发平台适时地推行了单周发版的迭代策略.单周版本迭代的优点可以概括为三个方面:更快地验证产品创意是否符合预期,更灵活地上线节奏,更早地修复线上Bug. 首先说一下美团平台的发版策略,主要变更点是由之前的每四周发一版改为每周都有发版.具体对比如下: (旧)三周迭代指的是2周开发+1周半测试,依赖固定的排期和测试时