Search code examples
javascriptiosbase64decodecordova-plugins

Convert Base64 image to file path image in iOS programming


I am using conversion from base64 to a String while I need it as image file path in iOS native plugin

Something like this in android which is converting bitmap to file I need its alternative in iOS

 private String convertBitmapToFile(Bitmap photo)

As my code conversion for base64 to string is not calling a call back method "profileBase64Callback"

 plugin call://here citizen.profileImage is in base64 format
 myPlugin.convertToFile("profileBase64Callback", citizen.profileImage,  function(){ }, function(){ });

Nativeplugin.m

 - (void)convertToFile:(CDVInvokedUrlCommand *)command{
      NSDictionary* options = [[NSDictionary alloc]init];
      if ([command.arguments count] > 0) {
          options = [command argumentAtIndex:0];
          NSString *base64Data =[options objectForKey:@"base64"];
          NSLog(@"strttrtr :%@", base64Data);
    }

      NSData* data = [[NSData alloc] initWithBase64EncodedString: base64Data options:0];
      NSString *strCOnvert = [NSString base64StringFromData:data length:[data length]];//Instead of this string I want decoded format(file path) to send to javascript Or if any other format which fixes my issue


   dispatch_async(dispatch_get_main_queue(), ^{
    CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:strCOnvert];
    [pluginResult setKeepCallbackAsBool:true];
    [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];      
    NSString * jsCallBack = [NSString stringWithFormat:@"%@(%@);", @"profileBase64Callback", strCOnvert];
    [self.webView stringByEvaluatingJavaScriptFromString:jsCallBack];

});

calling a javascript method to execute:

         //Need this imageURI after conversion which I am unable to convert
        function profileBase64Callback(imageURI){
             console.log("profileImage path " );
            //updating to database
             updateCitizenValue("profileImage", imageURI);
             setTimeout(getCitizen(function(citizenVal){

          }), 5000);
 }//this method is not called due to error in conversion.

Can anyone please let me know where am I going wrong..trying to decode and Image in base64 format to an actual file


Solution

  • This below code solved my issue:

    - (void)convertToFile:(CDVInvokedUrlCommand *)command{
    
        NSDictionary* options = [[NSDictionary alloc]init];
        NSString *base64String;
        if ([command.arguments count] > 0) {
            options = [command argumentAtIndex:0];
            base64String = [options objectForKey:@"base64"];
            methodname1 =[options objectForKey:@"callback"];
    
        }
    
        NSData* data = [[NSData alloc] initWithBase64EncodedString:methodname1 options:0];
    
       NSString  *jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.png"]; 
      /*
        identify the home directory and file name
       */
      NSLog(@"----jpgPath--%@",jpgPath);
      [data writeToFile:jpgPath atomically:YES];
    
    
    
       /*
       Send resulting data to cordova plugin
       */
         dispatch_async(dispatch_get_main_queue(), ^{
        CDVPluginResult* pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:@"OK"];
        [pluginResult setKeepCallbackAsBool:true];
    
        [self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
    
        NSString * jsCallBack = [NSString stringWithFormat:@"%@(%@);", @"profileBase64Callback", jpgPath];
        [self.webView stringByEvaluatingJavaScriptFromString:jsCallBack];
    
        });
    
     }