`

ios7实现后台下载

    博客分类:
  • ios7
 
阅读更多

 

制作推送的证书

1、新建一个工程BackgroundDownload

2、钥匙串访问->证书助理->从证书颁发机构请求证书,将CertificateSigningRequest.certSigningRequest文件存到磁盘上。

3、登陆开发者中心,新建一个AppID,设置好名字等,然后勾选Push Notifications,点continue,点submit

4、在App IDs下找到我们刚刚新建得appid,然后选择,点edit,点Create certificate...,点continue,点choosefile..选择CertificateSigningRequest.certSigningRequest,点submit,现在证书做好了,我们点击Download,下载后点击安装。

 

现在我们要制作的是获取设备deviceToken的证书

1、在开发者中心点击Provisioning Profiles,下边的Development,然后新建一个provisioning profile,点击ios App Development,然后continue,接着我们选择我刚刚新建的appid,点continue,然后勾选证书,然后勾选设备,然后起名字,点Generate。下载安装到我们的手机。

 

制作pem文件,用来推送。

 

进入到钥匙串,点击登陆,我的证书,找到我们刚才从appid下载下来的证书,然后右键导出,最好不要输入密码,起名为cert.p12。

 

如果你的cert.p12在桌面,那么cd Desktop,执行下面命令:

openssl pkcs12 -in cert.p12 -out apple_push_notification.pem -nodes -clcerts

 这样在桌面上生成了一个pem文件。

 

然后我们下载一个gem包,houston。

 

下面编写我们的工程

在AppDelegate.m文件中

- (void)applicationDidFinishLaunching:(UIApplication *)application {
  // ...

  [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}

 上面的代码指明推送的类型。

 

获得我们设备的DeviceToken,把deviceToken转换为NSString,打印出来然后copy下来。

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
   
}

  进行后台下载配置

 

//初始化一个NSURLSession
- (NSURLSession*)backgroundURLSession
{
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^{
    
    NSString *identifier = @"identifier";
        NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];
        session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    });
    return session;
}
//实现NSURLSessionDelegate
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
 didResumeAtOffset:(int64_t)fileOffset
expectedTotalBytes:(int64_t)expectedTotalBytes
{
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
      didWriteData:(int64_t)bytesWritten
 totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
  didFinishDownloadingToURL:(NSURL *)location
{
    NSData *data = [NSData dataWithContentsOfURL:location];
    UIImage *image = [UIImage imageWithData:data];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
    [self.viewController.view addSubview:imageView];
}
//应用接到通知的时候触发此函数,需要注意的是这里的推送是有要求的必须符合如下格式
{
    "aps" : {
        "content-available" : 1 //必须有这项
    },
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
    NSURL *url = [[NSURL alloc] initWithString:@"http://simg.cocoachina.com/201111220746561330.jpg"];
    NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
    NSURLSessionDownloadTask *task = [[self backgroundURLSession] downloadTaskWithRequest:request];
    [task resume];
    NSLog(@"接到了推送");
    completionHandler(UIBackgroundFetchResultNewData);
}
//在NSURLSessionDelegate触发前会触发先在applicationDelegate
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler
{
    //实际上我们暂存了一个完成处理程序,等下载完成后执行这个block,生成快照,这个block存在一个字典中
    [self addCompletionHandler:completionHandler :identifier];
}
- (void)addCompletionHandler :(void (^)())handler :(NSString*)identifier
{
    if([self.completionHandlerDictionary objectForKey:identifier])
    {
        NSLog(@"error");
        return;
    }
    [self.completionHandlerDictionary setObject:handler forKey:identifier];
}

//实现NSURLSessionDelegate的一个methond
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session
{
     NSLog(@"Background URL session %@ finished events.\n", session);
//生成快照
    [self callCompletionHandlerForSession:session.configuration.identifier];
}
- (void)callCompletionHandlerForSession :(NSString*)identifier
{
    CompletionHandlerType handler = [self.completionHandlerDictionary objectForKey:identifier];
    if(handler)
    {
        [self.completionHandlerDictionary removeObjectForKey:identifier];
    }
    handler();
    
}

 注意

需要将Capabilities下的Background Modes打开,勾选Background fetch,和Remote notifications。

在命令行进行推送

 

apn push "<13f01d3e0dbfc75b1c273f6db6af867d36004694597df496cdc562f87e2...>" -c /Users/用户名/Desktop/apple_push_no_download.pem -n -m "hello world"

 当应用接到这个通知的时候,会进行后台下载那张图片,这种类型的通知根据苹果的官方文档来说每天最好发送10条以下。

houston是个gem包,所以机器应改配置ruby和rails

 

demo:https://github.com/aiyuelian/ios7BackgroundDownload

分享到:
评论

相关推荐

    基于matlab实现实现了基于项目的协同过滤代码,MATLAB实现.rar

    基于matlab实现实现了基于项目的协同过滤代码,MATLAB实现.rar

    各地区年末城镇登记失业人员及失业率.xls

    数据来源:中国劳动统计NJ-2023版

    企业固定资产信息管理系统设计与实现.doc

    企业固定资产信息管理系统设计与实现.doc

    node-v11.14.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v8.9.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v12.10.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于VB实现的学生成绩管理系统(源代码+系统+开题报告+答辩PPT).zip

    【作品名称】:基于VB实现的学生成绩管理系统(源代码+系统+开题报告+答辩PPT) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    银行信贷管理系统设计与实现-(毕业设计)1.docx

    银行信贷管理系统设计与实现-(毕业设计)1.docx

    基于VB实现的银行代扣代发工资系统(源代码+系统+开题报告).zip

    【作品名称】:基于VB实现的银行代扣代发工资系统(源代码+系统+开题报告) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    (更新至2022年)全国镇分年龄、性别的人口数.xls

    数据来源:中国人口与就业统计NJ-2023版

    基于Java的考试管理系统

    java,大学课后作业

    数据更新至2020年分地区发电装机容量增速(风电).xls

    数据来源:中国电力统计NJ-2021版

    基于VB实现的网上餐饮管理系统设计(论文+源代码+开题报告+英文文献).zip

    【作品名称】:基于VB实现的网上餐饮管理系统设计(论文+源代码+开题报告+英文文献) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    基于matlab实现烟花算法进行函数最小-最大值寻优,对十多个测试函数进行了寻优,效果良好,代码附带详细说明.rar

    基于matlab实现烟花算法进行函数最小_最大值寻优,对十多个测试函数进行了寻优,效果良好,代码附带详细说明.rar

    数据更新至2020年分地区单机6000千瓦及以上 水力发电机组分类情况(合计).xls

    数据来源:中国电力统计NJ-2021版

    基于VB实现的商场管理系统设计(源代码+系统).zip

    【作品名称】:基于VB实现的商场管理系统设计(源代码+系统) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    (更新至2022年)全国按年龄、性别分的就业人员受教育程度构成.xls

    数据来源:中国劳动统计NJ-2023版

    数据更新至2020年分地区6000千瓦及以上电厂发电量(太阳能发电).xls

    数据来源:中国电力统计NJ-2021版

    数据更新至2020年分地区发电装机容量增速(合计).xls

    数据来源:中国电力统计NJ-2021版

    各地区劳动能力鉴定情况(2022年).xls

    数据来源:中国劳动统计NJ-2023版

Global site tag (gtag.js) - Google Analytics