The following sample code shows how to download an object body with the Background Transfer service.
Swift:
class delegate : NSObject , URLSessionDataDelegate , URLSessionDownloadDelegate {
func downloadObjectBody (){
// Check if a KiiUser is logged in.
if KiiUser . current () == nil {
return
}
// Instantiate the target KiiObject.
let object = KiiObject ( uri : "Set the URI of an existing KiiObject here" ) !
// Prepare a URLSession object to download the object body in the background.
let downloadRequest = object . generateDownloadRequest () !
let uuidStr = UUID () . uuidString
let randomSessionIdentifier = uuidStr . lowercased ()
let sessionConfig : URLSessionConfiguration
sessionConfig = URLSessionConfiguration . background ( withIdentifier : randomSessionIdentifier )
sessionConfig . allowsCellularAccess = true
let session = URLSession ( configuration : sessionConfig , delegate : self , delegateQueue : OperationQueue . main )
// Create a download task.
let downloadTask = session . downloadTask ( with : downloadRequest )
// Start or resume the task.
downloadTask . resume ()
}
@objc fileprivate func urlSession ( _ session : URLSession , downloadTask : URLSessionDownloadTask , didWriteData bytesWritten : Int64 , totalBytesWritten : Int64 , totalBytesExpectedToWrite : Int64 ) {
// The download is in progress.
print ( "Progress : \( Float ( totalBytesWritten / totalBytesExpectedToWrite ) ) " )
}
@objc fileprivate func urlSession ( _ session : URLSession , downloadTask : URLSessionDownloadTask , didFinishDownloadingTo location : URL ) {
// Note: The file will be downloaded in a temporary area. Move the downloaded file to a persistent area if needed.
// Specify the file destination.
let targetDirectory : NSString = ( NSHomeDirectory () as NSString ) . appendingPathComponent ( "Documents" ) as NSString
let downloadFilePathStr = targetDirectory . appendingPathComponent ( "sample.mp4" )
let downloadFilePath = URL ( fileURLWithPath : downloadFilePathStr )
let fileManager = FileManager . default
do {
try fileManager . moveItem ( at : location , to : downloadFilePath )
} catch ( let error ){
print ( "File move is failed \( error ) " )
return
}
print ( "Download succeeded" )
}
@objc fileprivate func urlSession ( _ session : URLSession , task : URLSessionTask , didCompleteWithError error : Error ? ){
if error != nil {
// Handle the error.
print ( "Background transfer is failed" )
return
}
// Check the HTTP status code.
let response = task . response as! HTTPURLResponse
if response . statusCode >= 300 {
print ( "Background transfer is failed, status code: \( response . statusCode ) " )
return
}
print ( "Background transfer succeeded" )
}
}
class delegate : NSObject , URLSessionDataDelegate , URLSessionDownloadDelegate {
func downloadObjectBody (){
// Check if a KiiUser is logged in.
if KiiUser . current () == nil {
return
}
// Instantiate the target KiiObject.
let object = KiiObject ( uri : "Set the URI of an existing KiiObject here" ) !
// Prepare a URLSession object to download the object body in the background.
let downloadRequest = object !. generateDownloadRequest () !
let uuidStr = UUID () . uuidString
let randomSessionIdentifier = uuidStr . lowercased ()
let sessionConfig : URLSessionConfiguration
sessionConfig = URLSessionConfiguration . background ( withIdentifier : randomSessionIdentifier )
sessionConfig . allowsCellularAccess = true
let session = URLSession ( configuration : sessionConfig , delegate : self , delegateQueue : OperationQueue . main )
// Create a download task.
let downloadTask = session . downloadTask ( with : downloadRequest )
// Start or resume the task.
downloadTask . resume ()
}
@objc fileprivate func urlSession ( _ session : URLSession , downloadTask : URLSessionDownloadTask , didWriteData bytesWritten : Int64 , totalBytesWritten : Int64 , totalBytesExpectedToWrite : Int64 ) {
// The download is in progress.
print ( "Progress : \( Float ( totalBytesWritten / totalBytesExpectedToWrite ) ) " )
}
@objc fileprivate func urlSession ( _ session : URLSession , downloadTask : URLSessionDownloadTask , didFinishDownloadingTo location : URL ) {
// Note: The file will be downloaded in a temporary area. Move the downloaded file to a persistent area if needed.
// Specify the file destination.
let targetDirectory : NSString = ( NSHomeDirectory () as NSString ) . appendingPathComponent ( "Documents" ) as NSString
let downloadFilePathStr = targetDirectory . appendingPathComponent ( "sample.mp4" )
let downloadFilePath = URL ( fileURLWithPath : downloadFilePathStr )
let fileManager = FileManager . default
do {
try fileManager . moveItem ( at : location , to : downloadFilePath )
} catch ( let error ){
print ( "File move is failed \( error ) " )
return
}
print ( "Download succeeded" )
}
@objc fileprivate func urlSession ( _ session : URLSession , task : URLSessionTask , didCompleteWithError error : Error ? ){
if error != nil {
// Handle the error.
print ( "Background transfer is failed" )
return
}
// Check the HTTP status code.
let response = task . response as! HTTPURLResponse
if response . statusCode >= 300 {
print ( "Background transfer is failed, status code: \( response . statusCode ) " )
return
}
print ( "Background transfer succeeded" )
}
}
Objective-C:
- ( void ) downloadObjectBody {
// Check if a KiiUser is logged in.
if ([ KiiUser currentUser ] == nil ) {
return ;
}
// Instantiate the target KiiObject.
KiiObject * object = [ KiiObject objectWithURI : @"Set the URI of an existing KiiObject here" ];
// Prepare an NSURLSession object to download the object body in the background.
NSURLRequest * downloadRequest = [ object generateDownloadRequest ];
CFUUIDRef uuid = CFUUIDCreate ( kCFAllocatorDefault );
NSString * uuidStr = ( __bridge_transfer NSString * ) CFUUIDCreateString ( kCFAllocatorDefault , uuid );
CFRelease ( uuid );
NSString * randomSessionIdentifier = [ uuidStr lowercaseString ];
NSURLSessionConfiguration * sessionConfig ;
sessionConfig = [ NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier : randomSessionIdentifier ];
sessionConfig . allowsCellularAccess = YES ;
NSURLSession * session = [ NSURLSession sessionWithConfiguration : sessionConfig
delegate : self
delegateQueue : [ NSOperationQueue mainQueue ]];
// Create a download task.
NSURLSessionDownloadTask * downloadTask = [ session downloadTaskWithRequest : downloadRequest ];
// Start or resume the task.
[ downloadTask resume ];
}
- ( void ) URLSession : ( NSURLSession * ) session downloadTask : ( NSURLSessionDownloadTask * ) downloadTask didWriteData : ( int64_t ) bytesWritten totalBytesWritten : ( int64_t ) totalBytesWritten totalBytesExpectedToWrite : ( int64_t ) totalBytesExpectedToWrite {
// The download is in progress.
NSLog ( @"Progress : %f" , ( float ) totalBytesWritten / totalBytesExpectedToWrite );
}
- ( void ) URLSession : ( NSURLSession * ) session downloadTask : ( NSURLSessionDownloadTask * ) downloadTask didFinishDownloadingToURL : ( NSURL * ) location {
// Note: The file will be downloaded in a temporary area. Move the downloaded file to a persistent area if needed.
// Specify the file destination.
NSString * targetDirectory = [ NSHomeDirectory () stringByAppendingPathComponent : @"Documents" ];
NSString * downloadFilePathStr = [ targetDirectory stringByAppendingPathComponent : @"sample.mp4" ];
NSURL * downloadFilePath = [ NSURL fileURLWithPath : downloadFilePathStr ];
NSFileManager * fileManager = [ NSFileManager defaultManager ];
NSError * moveError = nil ;
[ fileManager moveItemAtURL : location toURL : downloadFilePath error :& moveError ];
if ( moveError != nil ) {
// Handle the error.
NSLog ( @"File move is failed" );
return ;
}
}
- ( void ) URLSession : ( NSURLSession * ) session task : ( NSURLSessionTask * ) task didCompleteWithError : ( NSError * ) error {
if ( error != nil ) {
// Handle the error.
NSLog ( @"Background transfer is failed" );
return ;
}
// Check the HTTP status code.
NSHTTPURLResponse * response = ( NSHTTPURLResponse * ) task . response ;
if ([ response statusCode ] >= 300 ) {
NSLog ( @"Background transfer is failed, status code: %ld" , ( long )[ response statusCode ]);
return ;
}
NSLog ( @"Background transfer succeeded" );
}
- ( void ) downloadObjectBody {
// Check if a KiiUser is logged in.
if ([ KiiUser currentUser ] == nil ) {
return ;
}
// Instantiate the target KiiObject.
KiiObject * object = [ KiiObject objectWithURI : @"Set the URI of an existing KiiObject here" ];
// Prepare an NSURLSession object to download the object body in the background.
NSURLRequest * downloadRequest = [ object generateDownloadRequest ];
CFUUIDRef uuid = CFUUIDCreate ( kCFAllocatorDefault );
NSString * uuidStr = ( __bridge_transfer NSString * ) CFUUIDCreateString ( kCFAllocatorDefault , uuid );
CFRelease ( uuid );
NSString * randomSessionIdentifier = [ uuidStr lowercaseString ];
NSURLSessionConfiguration * sessionConfig ;
sessionConfig = [ NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier : randomSessionIdentifier ];
sessionConfig . allowsCellularAccess = YES ;
NSURLSession * session = [ NSURLSession sessionWithConfiguration : sessionConfig
delegate : self
delegateQueue : [ NSOperationQueue mainQueue ]];
// Create a download task.
NSURLSessionDownloadTask * downloadTask = [ session downloadTaskWithRequest : downloadRequest ];
// Start or resume the task.
[ downloadTask resume ];
}
- ( void ) URLSession : ( NSURLSession * ) session downloadTask : ( NSURLSessionDownloadTask * ) downloadTask didWriteData : ( int64_t ) bytesWritten totalBytesWritten : ( int64_t ) totalBytesWritten totalBytesExpectedToWrite : ( int64_t ) totalBytesExpectedToWrite {
// The download is in progress.
NSLog ( @"Progress : %f" , ( float ) totalBytesWritten / totalBytesExpectedToWrite );
}
- ( void ) URLSession : ( NSURLSession * ) session downloadTask : ( NSURLSessionDownloadTask * ) downloadTask didFinishDownloadingToURL : ( NSURL * ) location {
// Note: The file will be downloaded in a temporary area. Move the downloaded file to a persistent area if needed.
// Specify the file destination.
NSString * targetDirectory = [ NSHomeDirectory () stringByAppendingPathComponent : @"Documents" ];
NSString * downloadFilePathStr = [ targetDirectory stringByAppendingPathComponent : @"sample.mp4" ];
NSURL * downloadFilePath = [ NSURL fileURLWithPath : downloadFilePathStr ];
NSFileManager * fileManager = [ NSFileManager defaultManager ];
NSError * moveError = nil ;
[ fileManager moveItemAtURL : location toURL : downloadFilePath error :& moveError ];
if ( moveError != nil ) {
// Handle the error.
NSLog ( @"File move is failed" );
return ;
}
}
- ( void ) URLSession : ( NSURLSession * ) session task : ( NSURLSessionTask * ) task didCompleteWithError : ( NSError * ) error {
if ( error != nil ) {
// Handle the error.
NSLog ( @"Background transfer is failed" );
return ;
}
// Check the HTTP status code.
NSHTTPURLResponse * response = ( NSHTTPURLResponse * ) task . response ;
if ([ response statusCode ] >= 300 ) {
NSLog ( @"Background transfer is failed, status code: %ld" , ( long )[ response statusCode ]);
return ;
}
NSLog ( @"Background transfer succeeded" );
}
Here is what is happening in the sample code:
Creates a KiiObject
instance.
Creates an NSURLRequest
instance by calling the generateDownloadRequest()
method.
Creates an NSURLSession
instance that can be run in the background.
Creates an NSURLSessionDownloadTask
instance by calling the downloadTaskWithRequest(_:)
method with the NSURLRequest
instance.
Starts downloading by calling the resume()
method.
The downloaded file will be stored in a temporary space, and its path will be notified by the urlSession(_:downloadTask:didFinishDownloadingToURL:)
method of the NSURLSessionDownloadDelegate
class. Move the file to the desired place as needed.
The result will be notified by the urlSession(_:task:didCompleteWithError:)
method of the NSURLSessionDownloadDelegate
class.