2

NSURLSessionUploadTask を使用して複数のファイルをアップロードしています。バックグラウンドで同じプロセスを実行したいのですが、現在のファイルでは問題なく動作します。現在のファイルが正常にアップロードされるまで、アプリは中断されません。これで、2 番目のファイルがアップロードされると、再度起動するかアプリがアクティブになるまでアップロード プロセスが開始されません。アップロードが間に合っていないのは良いことです。最初のアップロード プロセスが終了したときに、次のアップロード プロセスを開始する方法はありますか。2 番目のアップロードもバックグラウンドで開始されますが、アプリがバックグラウンドに入ってから最大 3 分で動作します。ここに私のコードを示します:

AppDelegate.h
@property (nonatomic, copy) void(^backgroundTransferCompletionHandler)();

AppDelegate.m
- (void)applicationDidEnterBackground:(UIApplication *)application{
    __block UIBackgroundTaskIdentifier backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{

    NSLog(@"Background Time:%f",[[UIApplication sharedApplication] backgroundTimeRemaining]);

    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskIdentifier];
    backgroundTaskIdentifier = backgroundTaskIdentifier;
    `enter code here`}];
    }

-(void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{
    self.backgroundTransferCompletionHandler = completionHandler;
    NSLog(@"handleEventsForBackgroundURLSession called");
}

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
    AppDelegate *appDelegate2 = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSLog(@"URLSessionDidFinishEventsForBackgroundURLSession call in app delegate");
    [session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) {
        NSLog(@"uploadTasks: %@",uploadTasks);
        if ([uploadTasks count] == 0) {
            if (appDelegate2.backgroundTransferCompletionHandler != nil) {
                // Copy locally the completion handler.
                void(^completionHandler)() = appDelegate2.backgroundTransferCompletionHandler;

                // Make nil the backgroundTransferCompletionHandler.
                appDelegate2.backgroundTransferCompletionHandler = nil;

                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                // Call the completion handler to tell the system that there are no other background transfers.
                completionHandler();
                NSLog(@"All tasks are finished");
            }];
        }
    }
    else{

    }
}];
}


UploadView.m
- (NSURLSession *)backgroundSession {
    static NSURLSession *session = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    NSInteger randomNumber = arc4random() % 1000000;
    //        NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"com.example.apple-samplecode.SimpleBackgroundTransfer.BackgroundSession%d",(int)randomNumber]];
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"com.upload.myapp.BackgroundSession%d",(int)randomNumber]];

    sessionConfiguration.sessionSendsLaunchEvents = YES;
    sessionConfiguration.HTTPMaximumConnectionsPerHost = 1;
    // Define the Upload task
    [sessionConfiguration setHTTPAdditionalHeaders: @{@"Accept": @"text/html"}];
    sessionConfiguration.timeoutIntervalForRequest = 600.0;
//        sessionConfiguration.networkServiceType = NSURLNetworkServiceTypeBackground;
//        sessionConfiguration.discretionary = YES;
    sessionConfiguration.allowsCellularAccess = YES;
    session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
});
return session;
}

ViewDidLoad(){
....
self.uploadSession = [self backgroundSession];
....}


-UploadStart(){//here i am calling this function in loop. When first file got uploaded, control comes here for second task and then upload should continue.
    self.uploadTask = [self.uploadSession uploadTaskWithRequest:requestUpload fromFile:[NSURL fileURLWithPath:tmpfile]]; // self.uploadTask is an object of NSURLSessionUploadTask
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didSendBodyData:(int64_t)bytesSent totalBytesSent:(int64_t)totalBytesSent totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend {
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"didReceiveData Task: %@ upload complete", dataTask);
    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) self.uploadTask.response;
    if (httpResp.statusCode == 200) {
         uploadedFiles++; //an int value
         if(uploadedFiles==arrUpload.count){
             //all files uploaded here
         }
         else{
             //upload next file from here
         }
    }
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {

}

- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session{
    NSLog(@"URLSessionDidFinishEventsForBackgroundURLSession called");
    AppDelegate *appDelegate2 = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    if (appDelegate2.backgroundTransferCompletionHandler != nil) {
        // Copy locally the completion handler.
        void(^completionHandler)() = appDelegate2.backgroundTransferCompletionHandler;

        // Make nil the backgroundTransferCompletionHandler.
        appDelegate2.backgroundTransferCompletionHandler = nil;

        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            // Call the completion handler to tell the system that there are no other background transfers.
            completionHandler();
            NSLog(@"All tasks are finished");
        }];
    }
}

上記のコードは完全に機能していますが、アプリのバックグラウンド モードの 3 分後にバックグラウンドで次のファイルのアップロードが開始されないという問題があります。

どんな助けでも感謝します。前もって感謝します... 詳細については、私に連絡してください。

4

0 に答える 0