编写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框架,剩下的问题都得靠他解决,首先的引入该框架,再来进行了解
报刊组件框架有三个类:
-
NKLibrary
—代表应用程序的报刊库 -
NKIssue
—代表应用程序的报刊 -
NKAssetDownload
—代表从服务器下载过的报刊集合
以下是报刊下载的流程:
首先客户端需要从服务端请求到杂志文件列表,杂志文件中包含时间,描述,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
三个代理可以实现杂志的下载进度检测,后台下载,断点续传 以及下载完成后的数据解析 以及之后的数据展示