2012-04-19 11 views
8

necesito ayuda aquí. Me gustaría transferir imágenes Jpg o PNG de un iPhone a otro a través de Bump. Me encontré con el éxito y el fracaso donde las imágenes no se envían en absoluto.Necesito ayuda en Bump Api enviando imágenes

a continuación son un archivo NSObject que se llamará cuando el usuario seleccione una imagen de UIimagepicker.

el receptor no enviará ningún dato, solo lo recibirá.

Por favor, ayúdame a echarle un vistazo al código y darme cualquier comentario o punto.

agradecemos y apreciamos su ayuda.

- (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]; 
    } 
} 
+1

mucho código, ¿podría especificar qué es exactamente lo que va mal? ¿Mensajes de error o registros de bloqueo? ¿Has probado las imágenes por debajo y por encima de 254 kb? tal vez le falta algo de información en 'startConnection:' –

+0

Hola, reliquia, perdón por la respuesta tardía. La aplicación no se bloquea solo que se enviará y recibirá al azar. no estoy seguro de por qué es por eso que pregunté. No probé por debajo de 254kb, pero seguro que funcionó con las imágenes de 254kb anteriores. – Desmond

+0

He usado la Bump API anteriormente y tiene problemas con las conexiones celulares y la señal wifi débil. Pruebe con ambos dispositivos conectados a wifi y vea si el problema persiste. – skram

Respuesta

2

He encontrado que la transferencia de imágenes, o cualquier cantidad de datos por encima de ese límite de 256k, a través de Bump es muy LENTA. Tienes que reventar la carga en pedazos y luego hay un retraso entre cada envío y recepción. Si usted tiene su propio servidor web aquí es lo que haría:

  1. tengan la aplicación subir la imagen a su servidor web a través de algún tipo de servicio web
  2. tener el servicio Web devuelve un ID o ruta de acceso al archivo subido
  3. bulto que se INFORMACIÓN SOBRE que es sólo unos pocos k en el mejor de
  4. tengan la parte receptora de la aplicación buscar a la imagen de su servidor web

¡Se sorprenderá de cuánto más rápida será su transferencia!

Cuestiones relacionadas