UIwebView實現html的離線緩衝,uiwebview離線緩衝
1、html的緩衝主要採取ASIHTTPRequest的緩衝策略
(1)、設定緩衝策略
//設定緩衝 ASIDownloadCache *cache=[[ASIDownloadCache alloc] init]; self.myCache=cache; //設定緩衝路徑 NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); NSString *documentDirectory = [paths objectAtIndex:0]; //設定緩衝存放路徑 [self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]]; //ASIAskServerIfModifiedCachePolicy 與預設緩衝大致一樣,區別僅是每次請求都會 去伺服器判斷是否有更新 //ASIOnlyLoadIfNotCachedCachePolicy 如果有緩衝在本地,不管其到期與否,總會拿來使用 //ASIFallbackToCacheIfLoadFailsCachePolicy 這個選項經常被用來與其它選項組合使用。請求失敗時,如果有緩衝當網路則返回本機快取資訊 [self.myCache setDefaultCachePolicy:ASIFallbackToCacheIfLoadFailsCachePolicy]; //設定緩衝策略
(2)、設定非同步緩衝
NSURL *Requesturl=[NSURL URLWithString:url]; ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:Requesturl]; // //擷取全域變數 AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; // //設定緩衝方式 [request setDownloadCache:appDelegate.myCache]; // //設定快取資料儲存策略,這裡採取的是如果無更新或無法連網就讀取快取資料 [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; [request setDelegate:self]; [request startAsynchronous];
html緩衝完成。如想查看詳細 請點擊 : IOS開發網路篇之──ASIHTTPRequest詳解
2、html中的圖片緩衝
(1)、通過正則擷取html代碼中的所有圖片url
NSString *urlPattern = @"<img[^>]+?src=[\"']?([^>'\"]+)[\"']?"; NSError *error = [NSError new]; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:urlPattern options:NSRegularExpressionCaseInsensitive error:&error ]; //match 這塊內容非常強大 NSUInteger counts =[regex numberOfMatchesInString:content options:NSRegularExpressionCaseInsensitive range:NSMakeRange(0, [content length])];//匹配到的次數 if(counts > 0){ NSArray* matches = [regex matchesInString:content options:NSMatchingReportCompletion range:NSMakeRange(0, [content length])]; for (NSTextCheckingResult *match in matches) { NSInteger count = [match numberOfRanges];//匹配項 for(NSInteger index = 0;index < count;index++){ NSRange halfRange = [match rangeAtIndex:index]; if (index == 1) { //[listImage addObject:[content substringWithRange:halfRange]]; NSLog(@"轉換出來的字串===%@",[content substringWithRange:halfRange]); [listImage addObject:[content substringWithRange:halfRange]]; } } }//遍曆後可以看到三個range,1、為整體。2、為([\\w-]+\\.)匹配到的內容。3、([\\w.%&=-]*)匹配到的內容 }
(2)、SDwebImage下載圖片 、JS互動替換
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul); dispatch_group_t group = dispatch_group_create(); for (int i = 0; i < listImage.count; i++) { NSString *imageUrl = [imageUrlArray objectAtIndex:i]; NSString *key=[self getMd5_32Bit_String:imageUrl]; UIImage *cachedImage=[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key]; NSString *index = [NSString stringWithFormat:@"%d", i]; if (cachedImage) { [tchWebView stringByEvaluatingJavaScriptFromString:[self createSetImageUrlJavaScript:index imgUrl:key]]; }else{ dispatch_group_async(group, queue, ^{ //非同步下載圖片 [SDWebImageDownloader.sharedDownloader downloadImageWithURL:[NSURL URLWithString:imageUrl] options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize) { // progression tracking code } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) { if (image && finished) { [[SDImageCache sharedImageCache] storeImage:image forKey:key]; dispatch_sync(dispatch_get_main_queue(), ^{ [tchWebView stringByEvaluatingJavaScriptFromString:[self createSetImageUrlJavaScript:index imgUrl:key]]; }); } }]; }); } } dispatch_release(group);
//設定下載完成的圖片到web img- (NSString *)createSetImageUrlJavaScript:(NSString *) index imgUrl:(NSString *) url{ UIImage *myCachaImage=[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:url]; NSData *imageData = UIImageJPEGRepresentation(myCachaImage,1.0); NSString *imageSource = [NSString stringWithFormat:@"data:image/jpg;base64,%@",[imageData base64Encoding]]; NSString *js = [NSString stringWithFormat:@"var imgArray = document.getElementsByTagName('img'); imgArray[%@].src=\"%@\"; " , index, imageSource]; return js;}
//32位MD5加密方式- (NSString *)getMd5_32Bit_String:(NSString *)srcString{ const char *cStr = [srcString UTF8String]; unsigned char digest[CC_MD5_DIGEST_LENGTH]; CC_MD5( cStr, strlen(cStr), digest ); NSMutableString *result = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) [result appendFormat:@"%02x", digest[i]]; return result;}
參考:http://bbs.csdn.net/topics/390831054