Newsstand后台下载 断点续传见解

编写ios的杂志应用,首先需要配置info.plist文件以及配置itunes Connect

1 Application presents content in Newsstand 需要设置为YES  这样以后应用在后台或者关闭 应用图标都会在Newsstand的文件夹中


2 Newsstand Icon设置杂志的图标  在icon files之中 现在应用的图标会主动变为最后杂志显示的视图


3 Required background modes 设置后台运行的模式 一般都需要在后台可以继续下载  在此我选择App processes Newsstand Kit downloads 也可以选其他的 关键是看具体需求


经过以上三个步骤就可以区别于其他app

下面就得将Newsstandkit.frameWork框架,剩下的问题都得靠他解决,首先的引入该框架,再来进行了解

报刊组件框架有三个类:

以下是报刊下载的流程:

首先客户端需要从服务端请求到杂志文件列表,杂志文件中包含时间,描述,id,下载URl等等,然后根据文件的唯一Id,每个文件的id都不相同,通过

NKIssue *nkIssue = [nkLib issueWithName:name];

生成NKIssue,然后再通过

NKLibrary *nkLib = [NKLibrary sharedLibrary];

[nkLib addIssueWithName:name date:date];

NKIssue添加到NKLibrary中,由此就完成了文件列表到杂志库的迁移,以后都可以用NKLibrary与杂志列表,进行对应的操作。

1客户端应用程序与服务器通过url通信来定位报刊的下载,它可能还需要从服务器获得报刊的名称和日期,在这个阶段也验证用户可以获得订阅或执行任何其他必要的授权。

2客户端获取共享NKLibrary实例和发送一个addIssueWithName:消息,将报刊的名称和日期记录。此步骤创建一个NKIssue对象代表这一问题,并将其添加到库中,成功的将报刊添加到报刊库中,方便以后统一管理。

3根据URL定位应用程序的服务器上下载,客户端创建一个NSURLRequest对象。

4对于每一个可下载的报刊,然后发送一个addAssetWithRequest:消息NKIssue对象传入NSURLRequest对象。这个调用返回一个NKAssetDownload对象,这就获得下载中得报刊。

5然后调用downloadWithDelegate:NKAssetDownload对象,通过委托对象,采用NSURLConnectionDownloadDelegate协议,管理报刊的下载状况。

6委托监测报刊的下载和更新进度。当下载完成后,它处理下载报刊,在沙盒中处理可能涉及压缩存档或其他操作之前的报刊。


报刊被下载时,应用程序可能会暂停甚至终止例如,没有足够的内存或用户强制退出应用程序,应用程序(假设它有newsstand-content属性)后重新进入后台处理完成下载任。在这种情况下的处理如下:

1当应用程序启动时,它可以使用UIApplicationLaunchOptionsNewsstandDownloadsKey launchOptions中取出NKLibrary中断的报刊数组重新下载 实现断点续传 。

2NSURLConnectionDownloadDelegate对象能正常处理报刊的下载。


此处我是使用第三方的封装类MagazineManager  更加方便快捷 

首先需要在appdelegate中声明下次进来是继续失败的下载

 MagazineManager *manager = [MagazineManager sharedInstance];
 [manager resumeAnyFailedDownload];

 //声明杂志下载管理
 self.manager = [MagazineManager sharedInstance];

 self.manager.bookcaseDelegate = self;

 //将杂志添加到管理器中
 [self.manager getIssuesListSuccess:nil failure:nil];

将具体的杂志数据添加到library中去

- (void)addIssuesInNewsstand
{
    NKLibrary *nkLib = [NKLibrary sharedLibrary];
    [self.issueArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
     {
         NSString *name = [[(NSDictionary *)obj objectForKey:@"magazineId"] stringValue];
         if(name)
         {
             NKIssue *nkIssue = [nkLib issueWithName:name];
             if(!nkIssue)
             {
                 NSDateFormatter * format = [[NSDateFormatter alloc]init];
                 [format setDateFormat:@"YYYY-mm-dd"];
                 NSDate * date = [format dateFromString:[obj objectForKey:@"publishDttm"]];
                 [nkLib addIssueWithName:name date:date];
                
                 [self saveLatestIssue:name];
             }
             
         }
     }];
}

点击下载按钮时响应下载方法 同时设置代理

- (void)downloadIssue:(NSString *)issueName     //下载
           indexPath:(NSIndexPath *)indexPath

控制器中响应代理方法

- (void)downloadingProgressForIndexPath:(NSIndexPath *)indexPath    //实现下载进度管理
                           didWriteData:(long long)bytesWritten
                      totalBytesWritten:(long long)totalBytesWritten
                     expectedTotalBytes:(long long)expectedTotalBytes


- (void)downloadingResumedForIndexPath:(NSIndexPath *)indexPath   //断点续传
                     totalBytesWritten:(long long)totalBytesWritten
                    expectedTotalBytes:(long long)expectedTotalBytes
{
    
}

- (void)downloadingFinishedForIndexPath:(NSIndexPath *)indexPath  //下载完成调用
                                  issue:(NKIssue *)issue
                         destinationURL:(NSURL *)destinationURL

三个代理可以实现杂志的下载进度检测,后台下载,断点续传 以及下载完成后的数据解析 以及之后的数据展示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的卖报机程序的有限状态机实现。 首先,我们定义状态: - 等待投币状态(WAIT) - 投币状态(INSERT_COIN) - 选择报纸状态(CHOOSE_PAPER) - 出售报纸状态(SELL_PAPER) 然后,我们定义状态转移: - WAIT -> INSERT_COIN:当用户投币时 - INSERT_COIN -> CHOOSE_PAPER:当用户投币后,进入选择报纸状态 - CHOOSE_PAPER -> SELL_PAPER:当用户选择报纸后,进入出售报纸状态 - SELL_PAPER -> WAIT:当报纸售出后,进入等待投币状态 最后,我们编写代码实现状态机: ```python class Newsstand: def __init__(self): self.state = 'WAIT' self.coins = 0 self.papers = { 'A': 10, 'B': 5, 'C': 2 } def insert_coin(self): if self.state == 'WAIT': self.state = 'INSERT_COIN' print('请投币') elif self.state == 'INSERT_COIN': print('已经投币,请选择报纸') else: print('不能投币') def choose_paper(self, paper): if self.state == 'INSERT_COIN': if paper in self.papers: if self.coins >= self.papers[paper]: self.coins -= self.papers[paper] self.state = 'SELL_PAPER' print('出售报纸:{}'.format(paper)) else: print('余额不足,请投币') else: print('没有这种报纸') elif self.state == 'CHOOSE_PAPER': print('已经选择报纸,请投币') else: print('不能选择报纸') def sell_paper(self): if self.state == 'SELL_PAPER': self.state = 'WAIT' print('请取走报纸') else: print('不能出售报纸') def add_coin(self, coin): if self.state == 'INSERT_COIN': self.coins += coin print('投入{}元,当前余额:{}元'.format(coin, self.coins)) elif self.state == 'WAIT': print('请先选择报纸') else: print('不能投币') ``` 使用方法: ```python newsstand = Newsstand() newsstand.insert_coin() newsstand.add_coin(5) newsstand.choose_paper('A') newsstand.sell_paper() ``` 输出结果: ``` 请投币 投入5元,当前余额:5元 出售报纸:A 请取走报纸 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值