iOS & Android Base64

This page covers Base64 encoding/decoding in iOS (Swift) and Android (Kotlin/Java) mobile development. It includes native APIs, common patterns, and practical examples for mobile applications.

Overview

Both iOS and Android provide built-in Base64 support: iOS uses Data and String extensions, while Android uses Base64 utility class. This guide covers encoding/decoding strings, data, and images for mobile development scenarios.

iOS (Swift) Examples

Basic String Encoding/Decoding

import Foundation

// String to Base64
let text = "Hello, World!"
let data = text.data(using: .utf8)!
let base64String = data.base64EncodedString()
print(base64String) // SGVsbG8sIFdvcmxkIQ==

// Base64 to String
if let decodedData = Data(base64Encoded: base64String) {
    let decodedString = String(data: decodedData, encoding: .utf8)
    print(decodedString) // Hello, World!
}

Image to Base64

import UIKit

// UIImage to Base64
func imageToBase64(_ image: UIImage) -> String? {
    guard let imageData = image.jpegData(compressionQuality: 0.8) else { return nil }
    return imageData.base64EncodedString()
}

// Base64 to UIImage
func base64ToImage(_ base64String: String) -> UIImage? {
    guard let data = Data(base64Encoded: base64String) else { return nil }
    return UIImage(data: data)
}

// Usage
let image = UIImage(named: "sample")
let base64Image = imageToBase64(image)
let restoredImage = base64ToImage(base64Image!)

URL-Safe Base64

import Foundation

// URL-safe Base64 encoding
func urlSafeBase64Encode(_ data: Data) -> String {
    return data.base64EncodedString()
        .replacingOccurrences(of: "+", with: "-")
        .replacingOccurrences(of: "/", with: "_")
        .replacingOccurrences(of: "=", with: "")
}

// URL-safe Base64 decoding
func urlSafeBase64Decode(_ string: String) -> Data? {
    let base64 = string
        .replacingOccurrences(of: "-", with: "+")
        .replacingOccurrences(of: "_", with: "/")
    
    // Add padding if needed
    let padding = String(repeating: "=", count: (4 - base64.count % 4) % 4)
    return Data(base64Encoded: base64 + padding)
}

Android (Kotlin/Java) Examples

Basic String Encoding/Decoding

import android.util.Base64

// Kotlin
val text = "Hello, World!"
val encoded = Base64.encodeToString(text.toByteArray(), Base64.DEFAULT)
println(encoded) // SGVsbG8sIFdvcmxkIQ==

val decoded = String(Base64.decode(encoded, Base64.DEFAULT))
println(decoded) // Hello, World!

// Java
String text = "Hello, World!";
String encoded = Base64.encodeToString(text.getBytes(), Base64.DEFAULT);
System.out.println(encoded);

byte[] decoded = Base64.decode(encoded, Base64.DEFAULT);
String result = new String(decoded);
System.out.println(result);

Image to Base64

import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.util.Base64
import java.io.ByteArrayOutputStream

// Kotlin
fun bitmapToBase64(bitmap: Bitmap): String {
    val outputStream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream)
    val byteArray = outputStream.toByteArray()
    return Base64.encodeToString(byteArray, Base64.DEFAULT)
}

fun base64ToBitmap(base64String: String): Bitmap? {
    val decodedBytes = Base64.decode(base64String, Base64.DEFAULT)
    return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.size)
}

// Java
public String bitmapToBase64(Bitmap bitmap) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream);
    byte[] byteArray = outputStream.toByteArray();
    return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

URL-Safe Base64

import android.util.Base64

// Kotlin
fun urlSafeBase64Encode(data: ByteArray): String {
    return Base64.encodeToString(data, Base64.URL_SAFE or Base64.NO_PADDING)
}

fun urlSafeBase64Decode(base64String: String): ByteArray {
    return Base64.decode(base64String, Base64.URL_SAFE or Base64.NO_PADDING)
}

// Java
public String urlSafeBase64Encode(byte[] data) {
    return Base64.encodeToString(data, Base64.URL_SAFE | Base64.NO_PADDING);
}

public byte[] urlSafeBase64Decode(String base64String) {
    return Base64.decode(base64String, Base64.URL_SAFE | Base64.NO_PADDING);
}

File I/O Examples

iOS File Operations

import Foundation

// Save Base64 to file
func saveBase64ToFile(_ base64String: String, filename: String) {
    let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let fileURL = documentsPath.appendingPathComponent(filename)
    try? base64String.write(to: fileURL, atomically: true, encoding: .utf8)
}

// Load Base64 from file
func loadBase64FromFile(_ filename: String) -> String? {
    let documentsPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let fileURL = documentsPath.appendingPathComponent(filename)
    return try? String(contentsOf: fileURL, encoding: .utf8)
}

// Binary file to Base64
func fileToBase64(_ fileURL: URL) -> String? {
    guard let data = try? Data(contentsOf: fileURL) else { return nil }
    return data.base64EncodedString()
}

Android File Operations

import android.content.Context
import android.util.Base64
import java.io.File
import java.io.FileOutputStream
import java.io.FileInputStream

// Kotlin
class Base64FileManager(private val context: Context) {
    
    fun saveBase64ToFile(base64String: String, filename: String) {
        val file = File(context.filesDir, filename)
        file.writeText(base64String)
    }
    
    fun loadBase64FromFile(filename: String): String? {
        val file = File(context.filesDir, filename)
        return if (file.exists()) file.readText() else null
    }
    
    fun fileToBase64(filePath: String): String? {
        val file = File(filePath)
        if (!file.exists()) return null
        val bytes = file.readBytes()
        return Base64.encodeToString(bytes, Base64.DEFAULT)
    }
}

API Reference

iOS Base64 APIs

  • Data.base64EncodedString() - Encode Data to Base64 string
  • Data(base64Encoded:) - Decode Base64 string to Data
  • String.data(using:) - Convert String to Data
  • String(data:encoding:) - Convert Data to String
  • UIImage.jpegData(compressionQuality:) - Convert UIImage to JPEG Data
  • UIImage(data:) - Create UIImage from Data

Android Base64 APIs

  • Base64.encodeToString(byte[], flags) - Encode bytes to Base64
  • Base64.decode(String, flags) - Decode Base64 to bytes
  • Base64.DEFAULT - Standard encoding flags
  • Base64.URL_SAFE - URL-safe encoding
  • Base64.NO_PADDING - No padding characters
  • Base64.NO_WRAP - No line breaks

Best Practices