i need some help here. I will like to transfer an Jpg or PNG images from one iPhone to another through Bump. I encountered success and failure where images does not sent at all.
below are a NSObject file that will be call when user selected an images from UIimagepicker.
the receiver will not sent any data but only receive.
please help me have a look on the code and give me any comment or point.
thanks and appreciated your assistance.
- (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, %d bytes",i,[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, self, @selector(imageSavedToPhotosAlbum: didFinishSavingWithError: contextInfo:), 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];
}
}
I've found that transferring images, or any amount of data over that 256k limit, via Bump is very SLOW. You have to bust the payload up into chunks and then there's a delay between when each chunk is sent and received. If you have your own web server here is what I would do:
You'd be amazed at how much faster your transfer will be!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With