iPhone – 需要一些关于Bump Api发送图像的帮助
发布时间:2020-12-14 19:59:27 所属栏目:百科 来源:网络整理
导读:我需要一些帮助.我想通过Bump将Jpg或PNG图像从一个iPhone转移到另一个iPhone.我遇到了成功和失败,根本没有发送图像. 下面是一个NSObject文件,当用户从UIimagepicker中选择图像时将调用该文件. 接收方不会发送任何数据,只会接收. 请帮我看看代码并给我任何评
我需要一些帮助.我想通过Bump将Jpg或PNG图像从一个iPhone转移到另一个iPhone.我遇到了成功和失败,根本没有发送图像.
下面是一个NSObject文件,当用户从UIimagepicker中选择图像时将调用该文件. 接收方不会发送任何数据,只会接收. 请帮我看看代码并给我任何评论或观点. 谢谢,感谢您的帮助. - (id) init{ if(self = [super init]){ bumpObject = [BumpAPI sharedInstance]; NSError *error; NSURL *fileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"sound_bump_tap" ofType:@"aif"]]; bumpsound = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:&error]; [bumpsound prepareToPlay]; } return self; } -(void) configBump { [bumpObject configAPIKey:@"My API Key"]; //put your api key here. Get an api key from http://bu.mp [bumpObject configDelegate:self]; [bumpObject configParentView:self.bumpShare.view]; [bumpObject configActionMessage:@"Bump with your friend to start."]; } - (void) startBump{ [self configBump]; [bumpObject requestSession]; } - (void) stopBump{ [bumpObject endSession]; } #pragma mark - #pragma mark Private Methods // for Debug -- prints contents of NSDictionary -(void)printDict:(NSDictionary *)ddict { NSLog(@"---printing Dictionary---"); NSArray *keys = [ddict allKeys]; for (id key in keys) { NSLog(@" key = %@ value = %@",key,[ddict objectForKey:key]); } } #pragma mark - #pragma mark Public Methods - (void) sendDetails:(UIImage *)selectedImage { [bumpShare showHUD]; //Now we need to package our message dictionary up into an NSData object so we can send it up to Bump. //We'll do that with with an NSKeyedArchiver. NSLog(@"Here Got called!!!!!!! %@",self.selectedImg); // NSData* wholeImageData = [NSKeyedArchiver archivedDataWithRootObject:userChunk]; // int dataLength = [wholeImageData length]; // int maxChunkSize = 262144; // int chunkCount = dataLength / maxChunkSize; // // if (chunkCount == 1) { // //Data is 254kb or under // NSData *moveChunk = [NSKeyedArchiver // archivedDataWithRootObject:self.selectedImg]; // [bumpObject sendData:moveChunk]; // } // else if (dataLength > maxChunkSize) // { // NSLog(@"Sending data: %d bytes in %d chunks",dataLength,chunkCount); // for (int i = 1; i <= chunkCount; i++) // { // int ithChunkLength = 0; // if ((maxChunkSize * i) > dataLength) // { // ithChunkLength = dataLength-(maxChunkSize*(i-1)); // } // else { // ithChunkLength = 262144; // } // NSData *moveChunk = [wholeImageData subdataWithRange:NSMakeRange(maxChunkSize*(i-1),ithChunkLength)]; // //[[NSKeyedArchiver archivedDataWithRootObject:self.selectedImg] subdataWithRange:NSMakeRange(262144*(i-1),maxr)]; // NSLog(@"Sending Chunk: %d,%d bytes",i,[moveChunk length]); // [bumpObject sendData:moveChunk]; // } // } NSData *photoData = UIImageJPEGRepresentation(self.selectedImg,0.9); //NSData *userChunk = [NSKeyedArchiver archivedDataWithRootObject:self.selectedImg]; if([[NSKeyedArchiver archivedDataWithRootObject:photoData]length] > 262144) { int dlen = [[NSKeyedArchiver archivedDataWithRootObject:photoData] length]; NSLog(@"Sending data: %i bytes in %d chunks",dlen,(int)ceil(((float)dlen / 262144.0f))); for (int i=1; i <= (int)ceil(((float)dlen / 262144.0f)); i++) { int maxr=0; if ((262144*i) > dlen) { maxr = dlen-(262144*(i-1)); } else { maxr = 262144; } NSData *moveChunk = [[NSKeyedArchiver archivedDataWithRootObject:photoData] subdataWithRange:NSMakeRange(262144*(i-1),maxr)]; NSLog(@"Sending Chunk: %d,[moveChunk length]); [bumpObject sendData:moveChunk]; } } else { //Data is 254kb or under NSData *moveChunk = [NSKeyedArchiver archivedDataWithRootObject:photoData]; [bumpObject sendData:moveChunk]; } //[self printDict:moveDict]; //[userDict release]; //Calling send will have bump send the data up to the other user's mailbox. //The other user will get a bumpDataReceived: callback with an identical NSData* chunk shortly. //packetsAttempted++; //[bumpObject sendData:userChunk]; } - (void) startConnection:(UIImage *)selectedImage { //set local and remote user names //[bumpShare setLocalUserName:[[bumpObject me] userName]]; //[bumpShare setRemoteUserName:[[bumpObject otherBumper] userName]]; //[bumpShare updateUserNames]; [self sendDetails:selectedImage]; } #pragma mark Utility -(void) quickAlert:(NSString *)titleText msgText:(NSString *)msgText{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:titleText message:msgText delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; //[alert release]; } - (void)imageSavedToPhotosAlbum:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { NSString *message; NSString *title; if (!error) { title = NSLocalizedString(@"Save Success",@""); message = NSLocalizedString(@"Save Success Message",@""); HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Checkmark.png"]]; HUD.mode = MBProgressHUDModeCustomView; HUD.labelText = @"Photo Saved To Photo Album"; [HUD hide:YES afterDelay:1.5]; //saved =1; //self.imageOverlay.alpha =0.7; [bumpShare hideHUD]; [self performSelector:@selector(saveSuccess) withObject:nil afterDelay:0.5]; } else { title = NSLocalizedString(@"Save Failed",@""); message = [error description]; HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sad_face.png"]]; HUD.mode = MBProgressHUDModeCustomView; HUD.labelText = @"Error Saving to Photo Album"; [HUD hide:YES afterDelay:3]; } } -(void)saveSuccess { [bumpShare pushToSuccess]; } #pragma mark - #pragma mark BumpAPIDelegate methods - (void) bumpDataReceived:(NSData *)chunk { //The chunk was packaged by the other user using an NSKeyedArchiver,so we unpackage it here with our NSKeyedUnArchiver NSLog(@"chunk length %i",[chunk length]); //NSData *receivedData = [NSKeyedUnarchiver unarchiveObjectWithData:chunk]; if ([chunk length] != 262144) { NSLog(@"called length %i",[receivedData length]); if (!self.receivedData) { self.receivedData = [NSMutableData dataWithCapacity:[chunk length]]; [self.receivedData setData:chunk]; } else { [self.receivedData appendData:chunk]; } [self stopBump]; //UIImage* receivedImage = [NSKeyedUnarchiver unarchiveObjectWithData:self.receivedData]; //UIImageWriteToSavedPhotosAlbum(receivedImage,self,@selector(imageSavedToPhotosAlbum: didFinishSavingWithError: contextInfo:),nil); } else if([chunk length] == 262144) { NSLog(@"called length %i",[receivedData length]); //NSLog(@"calledin length %i",[chunk length]); if (!self.receivedData) { self.receivedData = [NSMutableData dataWithCapacity:[chunk length]]; [self.receivedData setData:chunk]; } else { [self.receivedData appendData:chunk]; } } } - (void) bumpSessionStartedWith:(Bumper*)otherBumper{ [self startConnection:nil]; } - (void) bumpSessionEnded:(BumpSessionEndReason)reason { NSString *alertText; switch (reason) { case END_LOST_NET: alertText = @"Connection to Bump server was lost."; break; case END_OTHER_USER_LOST: alertText = @"Connection to other user was lost."; break; case END_USER_QUIT: alertText = @"You have been disconnected."; break; default: alertText = @"You have been disconnected."; break; } // if(reason != END_USER_QUIT){ // //if the local user initiated the quit,restarting the app is already being handled // //other wise we'll restart here // UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Disconnected" message:alertText delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; // [alert show]; // //[alert release]; // } NSLog(@"Sending Chun!!!!!!!!!"); NSLog(@"self.received data %i",[self.receivedData length]); if ([self.receivedData length]>200) { NSData *imgData= [NSKeyedUnarchiver unarchiveObjectWithData:self.receivedData]; UIImage* receivedImage = [UIImage imageWithData:imgData];//[NSKeyedUnarchiver unarchiveObjectWithData:self.receivedData]; UIImageWriteToSavedPhotosAlbum(receivedImage,nil); } else { [bumpShare hideHUD]; [self performSelector:@selector(saveSuccess) withObject:nil afterDelay:1.5]; } } - (void) bumpSessionFailedToStart:(BumpSessionStartFailedReason)reason { NSString *alertText; switch (reason) { case FAIL_NETWORK_UNAVAILABLE: alertText = @"Please check your network settings and try again."; break; case FAIL_INVALID_AUTHORIZATION: //the user should never see this,since we'll pass in the correct API auth strings. //just for debug. alertText = @"Failed to connect to the Bump service. Auth error."; break; default: alertText = @"Failed to connect to the Bump service."; break; } if(reason != FAIL_USER_CANCELED){ //if the user canceled they know it and they don't need a popup. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Connection Failed" message:alertText delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alert show]; //[alert release]; } } 解决方法
我发现通过Bump传输图像或超过256k限制的任何数据都非常慢.您必须将有效负载填充到块中,然后在每个块发送和接收之间存在延迟.如果您有自己的Web服务器,我会这样做:
>让应用程序通过某种Web服务将图像上传到您的Web服务器 你会惊讶于你的转会速度会快多快! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |