制作推送的证书
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 7及更高版本中,苹果引入了`NSURLSession`框架,使得开发者能够实现后台下载任务,即使设备被锁定或者用户切换到其他应用,下载过程仍能继续。本篇文章将深入探讨如何在iOS 7中利用`NSURLSession`实现后台下载...
【仿iOS 7后台侧边菜单】是一种在Android平台上实现类似iOS 7系统风格的后台滑动侧边菜单的设计方式。这种设计模式在移动应用中非常常见,它为用户提供了一种方便快捷的方式来访问应用程序的不同功能或设置。在iOS 7...
实现后台持续定位需要遵循以下步骤: 1. **启用后台模式**: 在Xcode项目设置中,开发者需要勾选“Background Modes”选项,并选择“Location updates”。这使得应用有权限在后台运行定位服务。 2. **使用合适的...
iOS端的无限后台实现,在iOS7上面实际测试过,iOS8还没有来得及测试。之前传的被csdn删了还是怎么的,找不到了,看到下载量有点大,再上传一个。
在iOS开发中,实现多文件下载、后台下载和队列下载功能是常见需求,特别是对于应用需要下载大量数据或者更新资源的情况。`ios-ios多文件下载,后台下载,队列下载,断点下载.zip`这个压缩包提供的代码示例,`...
通过以上讨论,我们可以看到在iOS平台上实现“稳定无限后台运行”并非易事,需要充分理解并利用iOS的后台机制,同时考虑电池效率、用户体验和隐私保护等多个方面。在实际开发中,这往往需要开发者具备深厚的iOS开发...
本教程将深入讲解如何使用`NSURLSessionDownloadTask`在Swift中实现后台下载。 `NSURLSession`是Apple为iOS和OS X提供的网络编程接口,它支持HTTP/HTTPS协议以及其他网络协议。`NSURLSessionDownloadTask`是`...
Demo介绍:实现文件下载功能,包含大文件下载,后台下载,杀死进程,重新启动时继续下载,设置下载并发数,监听网络改变等。 开发语音:Objective-C CSDN博客:...
通常,应用程序在转入后台后有180秒(iOS 7)或600秒(iOS 6)的时间进行清理和保存工作。这段时间过后,应用可以申请额外的10分钟运行时间来执行未完成的任务。 然而,为了实现程序长时间后台运行,iOS提供了几种...
因此,在实现这样的后台运行Demo时,开发者必须确保其功能的必要性和合理性,以避免被App Store拒绝。 总之,"ios 程序在后台运行的demo"可能展示了如何利用iOS提供的各种机制,使得应用能在后台保持运行或者在后台...
7. **节能优化**:为了节省电池,应用在后台时应尽量减少不必要的资源消耗,例如关闭不必要的网络连接、降低GPS精度等。 8. **测试后台行为**:使用Xcode的模拟器和真机设备进行测试,确保应用在后台的行为符合预期...
下载管理类(TYDownLoadDataManager和TYDownloadSessionManager) 支持多文件断点下载和后台下载 封装了NSURLSessionDataTask和NSURLSessionDownloadTask,提供进度更新和状态改变bloc 和 delegate。 ...
总结来说,实现iOS播放器的后台播放功能涉及配置`AVAudioSession`、使用`beginBackgroundTaskWithExpirationHandler`管理后台任务,以及适当地处理音频会话的中断和恢复事件。通过这些技术,你可以为用户提供无缝的...
通过以上方法,开发者可以在iOS 8中实现后台持续定位,为用户提供持续的位置服务,同时尽可能减少对电池寿命的影响。然而,始终后台定位可能导致较高的电池消耗,因此开发者应谨慎权衡功能需求和用户体验。
3. **VoiceoverIP (VoIP)**:网络即时通讯类应用可以通过申请VoIP权限来实现后台运行。 4. **Newsstand downloads**:适用于报刊类应用下载内容。 5. **外部配件通信**:通过MFi认证的外设可通过蓝牙与应用进行通信...
3. **多任务处理**:iOS 7支持后台模式,如后台应用程序刷新、后台音频播放和定位服务等。开发者将了解如何利用这些功能,使应用即使在后台也能保持活跃,提供持续的服务。 4. **UI Dynamics**:iOS 7引入了物理...
在iOS应用开发中,实现一个应用在后台持续运行并播放音乐是一项挑战,因为iOS系统有严格的后台执行限制,主要是为了优化电池寿命和用户体验。本文将深入探讨如何在iOS App中实现音乐的永久后台运行,同时处理电话...
在iOS平台上,应用程序通常在用户离开应用时会进入暂停状态,但开发者可以通过特定的技术和策略来实现后台运行,以便在用户不直接与应用交互时也能执行任务。本篇将详细介绍几种实现iOS后台运行的方法,以及如何完美...
###先上效果图 ###github地址 ###说明 之前坐过几版下载的demo,要么不支持多任务、要么不支持后台...通过NSURLSession配置backgroundSessionConfigurationWithIdentifier,实现后台下载 通过NSURLSession配置defaul
6. **多线程编程**:如果源码中包含了后台处理或异步任务,那么会看到GCD(Grand Central Dispatch)或者NSOperationQueue的使用,这些都是iOS中处理并发的关键技术。 7. **iOS7特有功能**:由于源码基于iOS7,可能...