McAPI - Barcode API Swift

Here's some Swift 5 sample code that shows how to create barcodes with the McAPI Barcode REST API service. We provide an iOS / macOS Playground that you can use for testing, download. The sample uses Swift 5, the playground requires Xcode 12.4 or higher.

Requirements: A free RapidAPI account. Replace YOUR_API_KEY with your own api key.

All samples below work with the free tier of the API, see RapidAPI McAPI Barcode Listing for available plans.

See the overview page for a reference that lists all available parameters and error codes.

Create a Barcode using Swift with NSMutableURLRequest

Shown is the creation of a Code 128 (code type: 7) with Swift 5. All parameters relevant for the actual barcode creation are in the parameters-array which is JSON encoded and then added as a payload to the request.

The data to encode in the barcode is "123456". The module width is set to 0.5mm, the height is set to 20mm, the size of the human readable text under the barcode is set to 10 points. The code is returned as a base64 encoded PDF.

The source code:

// Swift 5
  
import Foundation
import UIKit

struct Result : Decodable{
  let service: String
  let version: String
  let format: String
  let code: String
}

let headers = [
  "content-type": "application/json",
  "x-rapidapi-key": "YOUR_API_KEY",
  "x-rapidapi-host": "mcapi-barcode.p.rapidapi.com"
]

let parameters = [
  "data": "123456",
  "type": 7,
  "moduleWidth": 0.5,
  "moduleHeight": 20,
  "format": "pdf",
] as [String : Any]

let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://mcapi-barcode.p.rapidapi.com/")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  }
  else {
    let httpResponse = response as? HTTPURLResponse
    if httpResponse?.statusCode == 200{
      if let data = data{
        ...
      }
    }
    else{
      // handle 400 errors here, see documentation for possible error conditions
    }
  }
})

dataTask.resume()

After performing the request, the response will be delivered as JSON in data, see further below for a snippet on how to parse the data:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"pdf",
  "code":"data:application/pdf;base64,JVBE ... Cg=="
}

McAPI Barcode API - Sample barcode with Swift

The returned code from the Swift snippet:

Image of McAPI Barcode API Sample Barcode Swift

Creating retail barcodes EAN, ISBN, UPC with Swift

The introductory sample above created a Code 128 barcode. Code 128 has many applications, mostly in warehousing and logistics. In the following Swift snippet we show how to create EAN and UPC barcodes which are used in retail.

Let's create an EAN 13 code. First step is to set the code type. The reference section lists all available code types; for EAN 13, we have to set the type-parameter to "1". With Code 128, we set the size of the code by specifing values for moduleWidth and moduleHeight. Retail codes are standardized, with the standard specifying the permitted sizes (so called SC sizes). With the Barcode API, the size of retail barcodes is determined through the size-parameter, with "2" being the 100% size. Here's the parameters block for creating an EAN 13 encoding "401234567890", again returning a PDF:

// Swift 5

...

let parameters = [
  "data": "401234567890",
  "type": 1,
  "size": 2,
  "format": "pdf",
] as [String : Any]

...

Here's the resulting EAN 13:

Image of McAPI Barcode API EAN 13 Barcode Swift

As an aside, the reference section also specifies the expected data for each barcode symbology. EAN 13 encodes twelve digits plus check digit (hence the name). As such you'll have to specify twelve or thirteen digits, less than twelve or more than thirteen will result in an error, likewise if the submitted data contains letters. As a convenience, the API will always recalculate the check digit for retail codes to make sure that a valid symbol is created; in this example the EAN 13 check digit is "1" which will be appended automatically to the provided data.

The greater-character (">") to the right of the code is the so called light margin indicator. This indicator tells the graphics designer not to put other graphical elements too close to the code. The indicator can be switched off by setting the lmi-parameter to "false".

Truncated EAN 13 with reduced height (Swift)

EAN barcodes can get quite large, with smaller packages or cartons the code might not fit into the available space. Per the standard, it's permitted to reduce the height of the code to some degree. The Barcode API supports a special truncate-parameter for retail codes. The parameter is percentage based, e.g. "50" will create a code with half height.

Sample parameters block:

// Swift 5

...

let parameters = [
  "data": "401234567890",
  "type": 1,
  "size": 2,
  "truncate": 50,
  "format": "pdf",
] as [String : Any]

...

Here's the resulting EAN 13 with half height:

Image of McAPI Barcode API EAN 13 Truncated Barcode Swift

EAN 13 with additional text (Swift)

A very useful feature of the Barcode API is the support for additional text that can be put above and below the barcode. This can be used for article numbers, lot size, pricing, weight, best before dates etc.

The parameters over, under and suppSize control any additional text. The following parameters block will put the text "Paperclips" above the code, the text "$2.99" below the code and set the font size for the additional text to 8pt.:

// Swift 5

...

let parameters = [
  "data": "401234567890",
  "type": 1,
  "size": 2,
  "truncate": 50,
  "over": "Paperclips",
  "under": "$2.99",
  "suppSize": 8,
  "format": "pdf",
] as [String : Any]

...

The resulting EAN 13 with additional text:

Image of McAPI Barcode API EAN 13 Price Best before Barcode Swift

Note: Additional text must be from the ASCII character set, Unicode is not supported.

Creating an EAN barcode without text (Swift)

Sometimes you will only want the actual barcode without any text at all; that's possible too: Simply specify the hrText-parameter as "false", like so:

// Swift 5
  
...

let parameters = [
  "data": "401234567890",
  "type": 1,
  "size": 2,
  "truncate": 50,
  "hrText": "false",
  "format": "pdf",
] as [String : Any]

...

The resulting EAN 13 without any text:

Image of McAPI Barcode API EAN 13 No text Barcode Swift

Creating 2D matrix barcodes with Swift 5

The Barcode API supports the most common 2D barcode symbologies: Datamatrix, Datamatrix GS1, PDF417, QR and Aztec. Creating those codes in Swift is no different from creating standard, linear barcodes; the only aspect to consider is using the moduleWidth-parameter to control the size of the code. With the exception of PDF417, dots are square, i.e. moduleWidth equals moduleHeight. With PDF417, the dots are created with a 3:1 ratio, i.e. moduleHeight equals 3 * moduleWidth.

The following parameters block will create a Datamatrix code (type = "16") with a dot size of 1x1mm²:

// Swift 5

...

let parameters = [
  "data": "1234567890",
  "type": 16,
  "moduleWidth": 1,
  "format": "pdf",
] as [String : Any]

...

The resulting Datamatrix code:

Image of McAPI Barcode API Datamatrix 2D Barcode Swift

2D barcodes are always created without text as the encoded data is typically too much to be displayed. Use the over and under parameters to put small amounts of text (max. 30 chars) next to the code.

Create QR codes with Swift 5

The Barcode API supports the creation of QR codes that can contain plain text, URLs, email addresses, phone numbers and SMS numbers. Our QR implementation is fully Unicode-compatible. Since Swift is likewise natively Unicode-capable, content with umlauts, accented characters or non-latin script can be encoded directly, without any conversion.

Specify content as follows:

  • Plain text (max. 2,000 chars): "123456abcdefÄÖÜ日本語"
  • URL: Specify data param like so: "https://example.com"
  • Email: Specify data param like so: "mailto:info@example.com"
  • Phone no: Specify data param like so: "tel:+18005551234"
  • SMS: Specify data param like so: "smsto:44044"

Sample parameters block to create a QR code with the URL "https://mcapi.io":

// Swift 5

...

let parameters = [
  "data": "https://mcapi.io",
  "type": 19,
  "moduleWidth": 1,
  "format": "pdf",
] as [String : Any]

...

The resulting QR code:

Image of McAPI Barcode API QR URL Barcode Swift

The header-parameter - creating UIImage from barcodes (Swift)

With all supported formats, the barcode is returned as a base64 encoded string. Per default, this string is preceded by a header that describes the media type (or MIME) of the string.

Sample parameters block for a QR code, to be returned as a PNG:

// Swift 5
  
...

let parameters = [
  "data": "https://mcapi.io",
  "type": 19,
  "moduleWidth": 1,
  "format": "png",
] as [String : Any]

...

The result will look like this, note the image/png section:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"png",
  "code":"data:image/png;base64,iVBOR ... QmCC"
}

To parse the JSON string, we set up an auxiliary struct, Result, that declares the four fields that the API returns (Note that the struct must conform to the Decodable protocol in order for the JSON parser to work.) After decoding you can then directly set the "code"-string as the src property of an img tag. This is particularly useful if you want to load barcodes into a web view, like so:

// Swift 5

...

struct Result : Decodable{
  let service: String
  let version: String
  let format: String
  let code: String
}

...

if httpResponse?.statusCode == 200{
  if let data = data{
    let result: Result = try! JSONDecoder().decode(Result.self, from: data)
    // result.code now holds the barcode as a base64 encoded PNG image
    let img = "<img src=\"" + result.code + "\""/>"
    webView.loadHTMLString(img)
  }
}

...

The MIME header will make sure that the image data is interpreted correctly by the browser. However, if you want to create a UIImage from the image data or want to to write the data to a file the header has to be left out. To create a code without the header, set the header-parameter to "false", like so:

// Swift 5
  
...

let parameters = [
  "data": "https://mcapi.io",
  "type": 19,
  "moduleWidth": 1,
  "header": "false",
  "format": "png",
] as [String : Any]

...

The returned code without header:

{
  "service":"McAPI Barcode Generator, https://mcapi.io",
  "version":"V1",
  "format":"png",
  "code":"iVBOR ... QmCC"
}

Now, all we have to do is decode the base64 string and then create an UIImage or NSImage from the PNG data. Shown here as a complete example (this is the contents of the provided Playground, see link in the introduction):

// Swift 5

import Foundation
import UIKit

struct Result : Decodable{
  let service: String
  let version: String
  let format: String
  let code: String
}

let headers = [
  "content-type": "application/json",
  "x-rapidapi-key": "YOUR_API_KEY",
  "x-rapidapi-host": "mcapi-barcode.p.rapidapi.com"
]

let parameters = [
  "data": "https://mcapi.io",
  "type": 19,
  "moduleWidth": 1,
  "format": "png",
  "header": "false"
] as [String : Any]

let postData = try JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://mcapi-barcode.p.rapidapi.com/")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  }
  else {
    let httpResponse = response as? HTTPURLResponse
    if httpResponse?.statusCode == 200{
      if let data = data{
        let result: Result = try! JSONDecoder().decode(Result.self, from: data)
        // result.code now holds the barcode as a base64 encoded PNG
        if let pngData = Data(base64Encoded: result.code, options: .ignoreUnknownCharacters){
          let img = UIImage(data: pngData);
        }
      }
    }
    else{
      // handle 400 errors here, see documentation for possible error conditions
    }
  }
})

dataTask.resume()

Back to McAPI Barcode API main page.