提问



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

最佳参考


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



  1. 让应用程序通过某种Web服务将图像上传到您的Web服务器

  2. 让网络服务返回上传文件的ID或路径

  3. BUMP,信息,最多只有几k

  4. 让应用的接收器部分从您的网络服务器获取图像



你会对你的转会速度有多快感到惊讶!