2012-04-19 11 views
8

私はここで何か助けが必要です。バンプを使って、あるiPhoneから別のiPhoneにJpgまたはPNG画像を転送したいと思います。私はイメージが全く送られない成功と失敗に遭遇しました。Bump Api送信に関するヘルプが必要です

は、ユーザーがUIimagepickerから画像を選択したときに呼び出されるNSObjectファイルです。

受信者はデータを送信せずに受信します。

私はコードを見て、私に任意のコメントやポイントを与えるのを助けてください。

ありがとうございました。

- (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

多くのコードは、正確に何が間違っているかを指定できますか?エラーメッセージまたはクラッシュログ? 254kb以下の画像を試しましたか?たぶん、あなたは 'startConnection:'にいくつかの情報が欠落していますか? –

+0

こんにちは、relikd、遅く返事を申し訳ありません。 アプリがランダムに送受信されるだけでクラッシュすることはありません。 なぜそれが私に尋ねた理由もわからない。私は254kb未満を試していませんでしたが、確かに上記の254kbイメージで動作しました – Desmond

+0

私はBump APIを以前に使っていました。両方の端末をWi-Fiに接続してみて、問題が解決するかどうか確認してください。 – skram

答えて

2

私は、Bumpを使用して256kの制限を超えて画像やその他のデータを転送するのが非常に遅いことを発見しました。ペイロードをチャンクにバストアップさせなければならず、各チャンクが送受信されるまでに遅延があります。あなたがあなた自身のウェブサーバーを持っている場合は、ここで私はどうなるのかです:

  1. アプリをお持ちのあなたのウェブサーバーに画像をアップロードするWebサービス
  2. のいくつかの並べ替えを経由してWebサービスを持っているIDやパスを返しますアップロードされたファイルせいぜい
  3. アプリの受信機部分は、Webサーバから画像を取得した唯一の数kは OVER INFORMATION
  4. BUMP

あなたはあなたの移籍がどれほど速くなるかに驚くでしょう!