杂记

获取AppStore上的最新版本号http://itunes.apple.com/lookup?id=(app的id号)解析这个连接地址

以下为转载:http://www.finalshares.com/u-5398  Skyhunter的个人空间

由于存在较复杂的解耦,所以我将整个app写成一个Framework; 
1、这里是一个比较简单的app 首先需要写一个管理类去管理分配这些资源, 

复制代码

1
2
3
4
5
6
7
/**
  *  主程序和此动态库的关系枢纽,也就是从“主程序”到“动态库内封装的程序”的入口方法
  *
  *  @param rootViewController “主程序”中引导
  *  @param bundle             此动态库在document文件中的路径,用于xib的加载和图片的加载
  */
- ( void )bootLoader:(id)rootViewController WithBundle:(NSBundle *)bundle;
实现方法: 


复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- ( void )bootLoader:(id)rootViewController WithBundle:(NSBundle *)bundle
{
     /*
      *初始化第一个管理Controller
      *这里的重点是xib文件的加载
       通常我们在初始化xib的时候并不是很在意bundle:这个参数,一般情况下都会赋予nil值
       其实我们所用到的图片、xib等资源文件都是在程序内部中获取的,也就是我们常用的[NSBundle mainBundle]中获取,所谓的NSBundle本质上就是一个路径,mainBundle指向的是.app下。
       而如果我们不指定bundle,则会默认从.app路径下去寻找资源。
       不过很显然,我们的动态库是放到“主程序”的document文件下的,所以资源文件是不可能在[NSbundle mainBundle]中获取到的,所以这里我们需要指定bundle参数,这也是传递framework的路径的意义所在
      */
     _currentBundle = bundle;
     [DataCenter shareCenter].bootLoader = bundle;
     HZRootViewController *rooter = [[HZRootViewController alloc]initWithNibName:NSStringFromClass([HZRootViewController  class ]) bundle:bundle];
     //保存NSBundle
     rooter.bootLoader = bundle;
       
     [rootViewController presentViewController:rooter animated:YES completion:NULL];
       
     [self setRootViewController: [DataCenter shareCenter].uToken ? YES : NO WithRooter:rooter];
   
}
2、我们需要在app也就是这个程序壳里载入这部分代码 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
- ( void )setRooter
{
     NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
     NSString *documentDirectory = nil;
     if  ([paths count] != 0)
         documentDirectory = [paths objectAtIndex:0];
       
     //拼接放到document中的framework路径
     NSString *libName = @ "HZDelivery.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方式读取类
      *PacteraFramework 为动态库中入口类
      */
     Class pacteraClass = NSClassFromString(@ "HZDeliveryManager" );
     if  (!pacteraClass) {
         NSLog(@ "Unable to get TestDylib class" );
         return ;
     }
       
     /*
      *初始化方式采用下面的形式
       alloc init的形式是行不通的
       同样,直接使用PacteraFramework类初始化也是不正确的
      *通过- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
       方法调用入口方法(bootLoader:WithBundle:),并传递参数(withObject:self withObject:frameworkBundle)
      */
     NSObject *pacteraObject = [pacteraClass  new ];
     [pacteraObject performSelector:@selector(bootLoader:WithBundle:) withObject:self withObject:frameworkBundle];
}
在这里推荐做一些后台逻辑去验证文件的完整和正确性。 


也可以对生成的Framework进行加密压缩处理。 


综上所述:这就可以实现动态的更新包替换,但是更推荐分模块去加载,这样做的好处不用多说,但是存在一定的技术难度和对整个项目的把控,同样不要盲目的去实现,实现计算工程难度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值