Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Need some help on Bump Api sending Images

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];
    }
}
like image 752
Desmond Avatar asked Apr 19 '12 07:04

Desmond


1 Answers

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:

  1. Have the app upload the image to your web server via some sort of web service
  2. Have the web service return an ID or path to the uploaded file
  3. BUMP THAT INFORMATION OVER which is only a few k at best
  4. Have the receiver portion of the app fetch the image from your web server

You'd be amazed at how much faster your transfer will be!

like image 131
jerrylroberts Avatar answered Oct 30 '22 16:10

jerrylroberts