下载强制退出应用后,恢复下载数据

1.download map.put(id,task) && map.get(id); id from database.JS MAP “{}”;check if exist!

2.create a database,id—downloadTask.

Step:

  1. Create database when init,Create a map in JS .

  2. Create download object,then store it to map which can be getted from rd.downloader (JS Engine) and store it to database.Last return the object through getting object from map.

  3. When execute callback function,get object from map,then set properties of the object,and the same time store it to database.Then execute callback.

  4. When enumerate downloads,get downloads from database,if the js map does not contain download,then store it.

  5. When clear downloads,clear local map, clear map and clear database,

  6. GetTaskById a new API.First get task from js map. Get task through database,then store it to js map if js map does not contain it //wait to modify!

  7. Background Configuration

Proplem:

  1. getTask I think getTask from map collection first,if not,from database

  2. about enumerate, from database;

  3. getTaskById,need to modify,it should be object,not just json simply!

  4. restrict the speed of download,kb/s(限速 )! setSpeed!

  5. remember add a column plugin.m_id!(do not do that,plugin.m_id is used in runtime.Create a download task,then get plugin.m_id)

  6. get object from collection,not create a new one

  7. In system callback function,download tasks are from local collection!Not sure if turn to JS MAP.

  8. How to judge object is nil in JS in IOS?

  9. about m_id ,in runtime map?

  10. enumerate and startAll store download task from database!

  11. JS MAP does not equal the local array?why?

  12. Why use a database to store download?

  13. getTaskById if the local array does not contain m_id,then create a new download ,then modify the properties of download.

  14. Enumerate,enumerate from database,then enumerate the local array to check if the m_id of download exist in the local array,If not ,create a new download!

  15. StartAll,start all the tasks from local array?

  16. How the JS Map bind the local array?

  17. store resume data to a file where in sandbox!

  18. According URL to check where to store the info to id(taskDescription store id from database,then get the id to store info)

  19. When you create a new one ,then start, sometimes it will crash.

  20. getTaskById first time return NULL,second time return a task! *****

  21. getTaskById and enumerate use a common method which will do get task from JS Map first,then local array,last database.

  22. remove task,remove each JS MAP of web view.

  23. downloadTaskID from 1. getMaxID!

  24. Above 9,can resume task directly,create a new one,then resume.In 8.0 ,move file to TMP,in 7.0,setting the correct path to key.

  25. CreateDownload URL and Path same,

  26. 插入数据失败: column dradeId is not unique

Complete:

  1. same task.Test in callback function

  2. database store the download info.

  3. getTaskById need to write int RDUnility.m

Test:

  1. First ,createDownload. Create a download,JS Map add a new download,Database add a new one.

  2. Enumerate func:Enumerate from database,the same time,JS MAP contain download tasks.

  3. StartAll how to define all?From database,or JS MAP,or local collection?

  4. Clear func:Clear local,clear JS MAP,clear database.

  5. Remove : remove local,JS MAP,database

  6. getTaskById:First from JS MAP,If not exist,get from database,then store it to JS MAP.

  7. When download start,pause,resume and so on,the download in JS MAP change,database change too!

//Check if the resumeData is valid to use

//The data argument is passed by the method as below

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

- (NSData *)turnValidResumeData:(NSData *)data

{

if (!data || [data length] < 1) return nil;

NSError *error;

NSDictionary *resumeDictionary = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:NULL error:&error];

if (!resumeDictionary || error) return nil;

NSString *localTmpFilePath;

int download_version = [[resumeDictionary objectForKey:@"NSURLSessionResumeInfoVersion"] intValue];

if(download_version==1)

{

localTmpFilePath = [resumeDictionary objectForKey:@"NSURLSessionResumeInfoLocalPath"];

if ([localTmpFilePath length] < 1) return nil;

}

else if(download_version==2)

{

localTmpFilePath = [resumeDictionary objectForKey:@"NSURLSessionResumeInfoTempFileName"];

if ([localTmpFilePath length] < 1) return nil;

}

NSString *localCachePath;

NSString *localLastName = [localTmpFilePath lastPathComponent];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

NSString *cachesDir = [paths objectAtIndex:0];

float version = [[[UIDevice currentDevice] systemVersion] floatValue];

if(version>=9.0)

{

return data;

}

else if(version>=8.0&&version<9.0)

{

NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier];

NSString * _localCachePath = [[[cachesDir stringByAppendingPathComponent:@"com.apple.nsurlsessiond/Downloads"]stringByAppendingPathComponent:bundleIdentifier]stringByAppendingPathComponent:localLastName];

if([[NSFileManager defaultManager] fileExistsAtPath:_localCachePath])

localCachePath = _localCachePath;

NSString *temp = NSTemporaryDirectory();

temp = [temp stringByAppendingPathComponent:localLastName];

if([[NSFileManager defaultManager] fileExistsAtPath:temp])

localCachePath = localLastName;

}

else

{

localCachePath = [[cachesDir stringByAppendingPathComponent:@"com.apple.nsnetworkd"]stringByAppendingPathComponent:localLastName];

}

[resumeDictionary setValue:localCachePath forKey:@"NSURLSessionResumeInfoLocalPath"];

data = [NSPropertyListSerialization dataWithPropertyList:resumeDictionary format:NSPropertyListXMLFormat_v1_0 options:0 error:NULL];

return data;

}

你可能感兴趣的:(下载强制退出应用后,恢复下载数据)