制作推送的证书
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
相关推荐
iOS端的无限后台实现,在iOS7上面实际测试过,iOS8还没有来得及测试。之前传的被csdn删了还是怎么的,找不到了,看到下载量有点大,再上传一个。
IOS开发Swift用NSURLSessionDownloadTask实现后台下载
Demo介绍:实现文件下载功能,包含大文件下载,后台下载,杀死进程,重新启动时继续下载,设置下载并发数,监听网络改变等。 开发语音:Objective-C CSDN博客:...
IOS 后台的可持续定位,遵循苹果的机制,后台会10分钟唤醒一次,给10S的执行时间,然后关闭。这样一直循环。
iOS实现从后台向手机客户端推送消息的代码[参考].pdf
下载管理类(TYDownLoadDataManager和TYDownloadSessionManager) 支持多文件断点下载和后台下载 封装了NSURLSessionDataTask和NSURLSessionDownloadTask,提供进度更新和状态改变bloc 和 delegate。 ...
ios app 后台运行备份,ios的app运行在后台的代码实现。
对于某些用户来说,越狱可能只是为了能够装破解盗版软件。其实越狱真正的意义并非如此,而是能够打破苹果系统自身的桎梏,安装各种系统类的插件,实现IOS系统自身无法实现的功能,让iPhone变得更强大。
应用 beginBackgroundTaskWithExpirationHandler 实现播放器的后台工作
###先上效果图 ###github地址 ###说明 之前坐过几版下载的demo,要么不支持多任务、要么不支持后台...通过NSURLSession配置backgroundSessionConfigurationWithIdentifier,实现后台下载 通过NSURLSession配置defaul
iOS后台定位实现代码
iOS后台运行的几种方式例子,完美实现无限后台,
完整版Java写IOS后台推送,添加证书,换下DeviceToken就可以实现苹果后台推送链接
ios适用于iOS 5、iOS 6和iOS 7的自定义NavigationBar UICoreTextView-CoreText文字渲染 列表个性化列表项 利用 Core Text 实现代码根据语法高亮显示效果 利用CoreText展示连接、电话、邮箱 后台获取功能 导航及底部...
iOS NotificationServiceExtension实现VoiceBroadcast,处理ios12.1以上系统,后台消息推送语音播报问题:【app处于后台/被杀死的状态仍可进行语言播报】iOS12.1以上在后台或者被杀死无法语音播报的解决方案
一般APP在按下Home键被挂起后,这时APP的 backgroundTimeRemaining 也就是后台运行时间大约只有3分钟,如果在退出APP后,过十几二十二分钟或者更长时间再回到APP,APP就会回到刚打开时的状态,也就是首页;...
以java写的iOS 后台服务器实现推送的小demo
IOS后台消息PUSH,VS2008实现的,包括OPENSSL配置
实现后台定时提醒,可添加多个及删除,画面精美简洁,内含指针时钟以及自定义动态闪屏,供朋友们学习参考!