8

我需要一些帮助。我想通过 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, %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];
    }
}
4

1 回答 1

2

我发现通过 Bump 传输图像或超过 256k 限制的任何数据量非常慢。您必须将有效负载分解成块,然后在发送和接收每个块之间存在延迟。如果你有自己的网络服务器,我会这样做:

  1. 让应用通过某种网络服务将图像上传到您的网络服务器
  2. 让 Web 服务返回上传文件的 ID 或路径
  3. 将这些信息颠倒过来,充其量只有几k
  4. 让应用程序的接收器部分从您的网络服务器获取图像

您会惊讶于您的传输速度会有多快!

于 2012-06-14T19:19:43.467 回答