EFQRCode Documentation

A better way to operate QRCode in Swift, support iOS, macOS, watchOS, tvOS, and/or visionOS.

RAW Doc

File: README.md

EFQRCode is a lightweight, pure-Swift library for generating stylized QRCode images with watermark or icon, and for recognizing QRCode from images, inspired by qrcode and react-qrbtf. Based on CoreGraphics, CoreImage, and ImageIO, EFQRCode provides you a better way to handle QRCode in your app, no matter if it is on iOS, macOS, watchOS, tvOS, and/or visionOS. You can integrate EFQRCode through CocoaPods, Carthage, and/or Swift Package Manager.

Examples

|||
:---------------------:|:---------------------:|:---------------------:|:---------------------:
|||
|||

Demo Projects

App Store

You can click the App Store button below to download demo, support iOS, tvOS and watchOS:

You can also click the Mac App Store button below to download demo for macOS:

Compile Demo Manually

To run the example project manually, clone the repo, demos are in the 'Examples' folder, then open EFQRCode.xcworkspace with Xcode and select the target you want, run.

Or you can run the following command in terminal:

bash
git clone [email protected]:EFPrefix/EFQRCode.git; cd EFQRCode; open 'EFQRCode.xcworkspace'

Requirements

iOS 13.0+ / macOS 10.15+ / tvOS 13.0+ / watchOS 6.0+ / visionOS 1.0+

Installation

CocoaPods

EFQRCode is available through CocoaPods. To install it, simply add the following line to your Podfile:

ruby
pod 'EFQRCode', '~> 7.0.3'

Then, run the following command:

bash
$ pod install

Carthage

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.

You can install Carthage with Homebrew using the following command:

bash
$ brew update
$ brew install carthage

To integrate EFQRCode into your Xcode project using Carthage, specify it in your Cartfile:

ogdl
github "EFPrefix/EFQRCode" ~> 7.0.3

Run carthage update to build the framework and drag the built EFQRCode.framework into your Xcode project.

Swift Package Manager

The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the Swift compiler.

Once you have your Swift package set up, adding EFQRCode as a dependency is as easy as adding it to the dependencies value of your Package.swift.

swift
dependencies: [
    .package(url: "https://github.com/EFPrefix/EFQRCode.git", .upToNextMinor(from: "7.0.3"))
]

Quick Start

1. Import EFQRCode

Import EFQRCode module where you want to use it:

swift
import EFQRCode

2. Recognition

A String Array is returned as there might be several QR Codes in a single CGImage:

swift
if let testImage = UIImage(named: "test.png")?.cgImage {
    let codes = EFQRCode.Recognizer(image: testImage).recognize()
    if !codes.isEmpty {
        print("There are \(codes.count) codes")
        for (index, code) in codes.enumerated() {
            print("The content of QR Code \(index) is \(code).")
        }
    } else {
        print("There is no QR Codes in testImage.")
    }
}

3. Generation

3.1 Create QR Code with static image

swift
let generator = try? EFQRCode.Generator("https://github.com/EFPrefix/EFQRCode", style: .image(
    params: .init(image: .init(image: .static(image: UIImage(named: "WWF")?.cgImage!), allowTransparent: true)))
)
if let image = try? generator?.toImage(width: 180).cgImage {
    print("Create QRCode image success \(image)")
} else {
    print("Create QRCode image failed!")
}

Result:

3.2 Generation from animated images

You can create a dynamic QR code by passing in a sequence of animated images. The usage method is as follows:

swift
let generator = try? EFQRCode.Generator("https://github.com/EFPrefix/EFQRCode", style: .image(
    params: .init(image: .init(image: .animated(images: cgImages, imageDelays: cgImageDelays))))
)
if let imageData = try? generator?.toGIFData(width: 512) {
    print("Create QRCode image success \(imageData)")
} else {
    print("Create QRCode image failed!")
}

You can get more information from the demo, result will like this:

3.3 Exportable types

  • Static: NSImage, UIImage, PDF, PNG, JPEG
  • Animated: APNG, GIF, SVG, MOV, MP4, M4V

4. Next

Learn more from DeepWiki.

Recommendations

  1. Please select a high contrast foreground and background color combinations;
  2. To improve the definition of QRCode images, increase size;
  3. Oversized generation dimensions, excessive QR code content, and overly large imported media may lead to generation failures;
  4. It is recommended to test the QRCode image before put it into use;
  5. Any contributing and pull requests are warmly welcome;
  6. Part of the pictures in the demo project and guide come from the internet. If there is any infringement of your legitimate rights and interests, please contact us to delete.

Contributors

Backers

Sponsors

Contact

Twitter: @EyreFree777
Weibo: @EyreFree
Email: [email protected]

License

EFQRCode is available under the MIT license. See the LICENSE file for more info.


File: CHANGELOG.md

Change Log

[7.0.3](https://github.com/EFPrefix/EFQRCode/releases/tag/7.0.3) (2025-08-03)

Fix

  • Fix Package.swift

[7.0.2](https://github.com/EFPrefix/EFQRCode/releases/tag/7.0.2) (2025-06-01)

Add

  • Support visionOS

[7.0.1](https://github.com/EFPrefix/EFQRCode/releases/tag/7.0.1) (2025-05-29)

Fix

  • fix: spm minimum platform and dependency #168

[7.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/7.0.0) (2025-05-24)

Add

  • Change rendering engine to SVG based (SwiftDraw)
  • Support more QR code styles:
    • Basic style
    • Bubble style
    • 2.5D style
    • DSJ style
    • Function style
    • Image style (Old)
    • ImageFill style
    • Line style
    • RandomRectangle style
    • ResampleImage style
  • Support multiple export formats:
    • SVG (Vector)
    • PDF (Vector)
    • PNG
    • JPEG
    • APNG
    • GIF
    • MOV
    • MP4
    • M4V
  • Support transparent background
  • Add backdrop parameter for background customization
  • Add image mode parameter for more display options
  • Add icon alpha handling

Remove

  • Remove Objective-C support

[6.2.2](https://github.com/EFPrefix/EFQRCode/releases/tag/6.2.2) (2023-03-06)

Fix

  • Fix compiler error when compiled using Xcode 14.3 #153

[6.2.1](https://github.com/EFPrefix/EFQRCode/releases/tag/6.2.1) (2022-03-03)

Fix

  • Fix EFCirclePointStyle to respect isTimingPointStyled settings.

[6.2.0](https://github.com/EFPrefix/EFQRCode/releases/tag/6.2.0) (2021-11-21)

Add

  • Add EFPointStyle protocol to allow customizing foreground point style.

Deprecate

  • EFPointShape is deprecated. Use EFPointStyle instead.

[6.1.0](https://github.com/EFPrefix/EFQRCode/releases/tag/6.1.0) (2021-04-08)

Add

  • Supports chaining EFQRCodeGenerator configuration methods.
  • EFQRCodeGenerator properties are now public.
  • EFQRCodeGenerator.clearCache can be used to free up memories used for caching results.
  • English documentation is now available through Xcode quick help.
  • Swift: EFWatermarkMode.rectForWatermark(ofSize:inCanvasOfSize:) can be used to calculate the frame for watermark image in a canvas.
  • Objective-C: New tests to ensure APIs are available in Objective-C.

Change

  • Renamed EFQRCodeGenerator configuration methods to be more consistent.
    • Renamed EFQRCode and reordered convenience generate function arguments to be consistent with generator methods.
  • EFQRCodeGenerator now caches more generated contents to improve performance.
  • EFQRCodeRecognizer expects non-nil image and returns non-nil array of results. The returned array may still be empty.
  • EFIntSize is now an immutable, final class.
  • Renamed CGColor extensions white and black to omit first argument label.
  • Objective-C: EFQRCodeGenerator and EFQRCodeRecognizer is now fully available to configure/use in Objective-C.

Deprecate

  • EFQRCodeMode.none is now deprecated. Use nil and EFQRCodeMode? instead.

Remove

  • EFUIntPixel is no longer a part of the public interface.
  • GIF generation no longer takes pathToSave parameter.
  • Objective-C: EFQRCode is no longer available in Objective-C. Use EFQRCodeGenerator and EFQRCodeRecognizer instead.

[6.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/6.0.0) (2020-11-04)

Add

  • Add support to compile for macOS 10.10 using CocoaPods.

Changed

  • swift_qrcodejs is now conditional dependency with Swift Package Manager 5.3+.

Remove

  • Drop iOS 8 support from CocoaPods with Xcode 12 #101;
  • Remove Core and watchOS sub-specs #100.

[5.1.9](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.9) (2020-11-04)

Add

  • Add Playgrounds with usage example #98.

Fix

  • Fix SwiftPM syntax in README #99;
  • Fix GIF frame delay time setting #104;
  • Now generates QRCode with correct, specified content encoding on watchOS;
  • Pin swift_qrcodejs to 1.2.0, up to next minor #102.

[5.1.8](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.8) (2020-09-18)

Fix

  • Fix issue #95

[5.1.7](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.7) (2020-09-14)

Add

  • Add a contentEncoding parameter #90;
  • Add compatibility with Catalyst dependencies #88.

Fix

  • Update swift_qrcodejs to 1.1.4.

[5.1.6](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.6) (2019-11-21)

Fix

  • Remove dependency EFFoundation.

[5.1.5](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.5) (2019-11-20)

Fix

  • Fix podspec.

[5.1.4](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.4) (2019-11-19)

Fix

  • Fix issue #83.

[5.1.3](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.3) (2019-10-13)

Fix

  • Fix conflicts with SwifterSwift.

[5.1.2](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.2) (2019-10-10)

Fix

  • Fix ciColor() in extension of UIColor.

[5.1.1](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.1) (2019-10-09)

Add

  • Add subspec watchOS.

Change

  • Make extensions internal;
  • Update swift package;
  • Update gif generation;
  • Add dependency on EFFoundation.

[5.1.0](https://github.com/EFPrefix/EFQRCode/releases/tag/5.1.0) (2019-09-17)

Add

Add parameter ignoreTiming.


[5.0.1](https://github.com/EFPrefix/EFQRCode/releases/tag/5.0.1) (2019-09-11)

Fix

Fix issue #65.


[5.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/5.0.0) (2019-03-31)

Add

  • Add documentation for some extension methods.

Change

  • Update to Swift 5;
  • Improve internal implementation to allocate memory needed all at once.

Remove

  • Remove Microsoft App Center SDK from examples.

[4.5.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.5.0) (2019-01-13)

Add

  • Add point style diamond;
  • Add Objective-C support;
  • Add accessibilityIgnoresInvertColors support.

[4.4.2](https://github.com/EFPrefix/EFQRCode/releases/tag/4.4.2) (2018-11-14)

Add

  • Add parameters to meet the needs of #50.

[4.4.1](https://github.com/EFPrefix/EFQRCode/releases/tag/4.4.1) (2018-11-08)

Add


[4.4.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.4.0) (2018-11-05)

Add

  • Upgrade to Swift 4.2.

[4.3.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.3.0) (2018-09-14)

Fix

  • Update version.

[4.2.2](https://github.com/EFPrefix/EFQRCode/releases/tag/4.2.2) (2018-01-09)

Add

  • Add multiple threads support for GIF.

[4.2.1](https://github.com/EFPrefix/EFQRCode/releases/tag/4.2.1) (2018-01-09)

Fix

  • Add border for watchOS.

[4.2.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.2.0) (2018-01-03)

Add

  • Support watchOS;
  • Add example for watchOS.

[4.1.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.1.0) (2017-11-01)

Add

  • Add GIF support.

[4.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/4.0.0) (2017-09-21)

Add

  • Update for Swift 4.

[1.2.7](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.7) (2017-07-26)

Add

  • Add support for Objective-C.

[1.2.6](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.6) (2017-07-25)

Fix

  • Fix issue #21.

[1.2.5](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.5) (2017-05-24)

Add

  • Add binarization;
  • Add point shape.

Fix

  • Fix issue #11.

[1.2.4](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.4) (2017-04-23)

Add

  • Add example for macOS;
  • Add example for tvOS.

Fix

  • Fix iOS 8 error.

[1.2.3](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.3) (2017-04-18)

Fix

  • Fix CocoaPods platform.

[1.2.2](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.2) (2017-04-17)

Add

  • Support Carthage;
  • Support tvOS;
  • Support macOS.

[1.2.1](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.1) (2017-04-11)

Add

  • Change parameter size and iconSize from CGFloat to EFIntSize;
  • Remove UIKit.

Fix

  • Increase efficiency;
  • Fix issue #4.

[1.2.0](https://github.com/EFPrefix/EFQRCode/releases/tag/1.2.0) (2017-04-01)

Add

  • Add parameter foregroundPointOffset;
  • Add parameter allowTransparent.

Fix

  • Make it more Object-oriented;
  • Make it faster and more effective;
  • Improve demo;
  • Improve documentation.

[1.1.1](https://github.com/EFPrefix/EFQRCode/releases/tag/1.1.1) (2017-02-15)

Fix

  • Detail modification;
  • Improve documentation.

[1.1.0](https://github.com/EFPrefix/EFQRCode/releases/tag/1.1.0) (2017-02-10)

Add

  • Add watermark image and some other feature.

Fix

  • Remove UIImage extension;
  • Improve documentation.

[1.0.0](https://github.com/EFPrefix/EFQRCode/releases/tag/1.0.0) (2017-01-24)

First public release.


File: .jazzy.yaml

EFQRCode Jazzy config

module: EFQRCode
author: EyreFree
theme: fullwidth
readme: README.md
root_url: https://efprefix.github.io/EFQRCode
github_url: https://github.com/EFPrefix/EFQRCode
github_file_prefix: https://github.com/EFPrefix/EFQRCode/blob/main
dash_url: https://efprefix.github.io/EFQRCode/docsets/EFQRCode.xml
exclude: ./Source/EFQRCode+Migration*
xcodebuild_arguments: [-workspace, 'EFQRCode.xcworkspace', -scheme, 'EFQRCode iOS', -sdk, 'iphoneos']
output: docs


File: Examples/iOS/Resources/Assets.xcassets/Contents.json

{
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json

{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "[email protected]",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "20.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "29.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "76.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "83.5.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "AppIcon.jpg",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/EFQRCoder.imageset/Contents.json

{
"images" : [
{
"filename" : "1024.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/Resources/Assets.xcassets/Generator.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Generator.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/launchimage.imageset/Contents.json

{
"images" : [
{
"filename" : "launchimage.jpg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/Resources/Assets.xcassets/more.imageset/Contents.json

{
"images" : [
{
"filename" : "WechatIMG199.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/Resources/Assets.xcassets/Recognizer.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Recognizer.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/Contents.json

{
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/EyreFree.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "eyrefree.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/GitHub.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "github.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/Pikachu.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Pikachu.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/icon/Swift.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Swift.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Beethoven.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Beethoven.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Jobs.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Jobs.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Miku.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Miku.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/Wille.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "wille.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/Sample/watermark/WWF.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "WWF.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/Resources/Assets.xcassets/transparentHolder.imageset/Contents.json

{
"images" : [
{
"filename" : "istockphoto-875273764-170667a.jpg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example/Assets.xcassets/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json

{
"images" : [
{
"size" : "24x24",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "notificationCenter",
"subtype" : "38mm"
},
{
"size" : "27.5x27.5",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "notificationCenter",
"subtype" : "42mm"
},
{
"size" : "29x29",
"idiom" : "watch",
"filename" : "[email protected]",
"role" : "companionSettings",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "watch",
"filename" : "[email protected]",
"role" : "companionSettings",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "38mm"
},
{
"size" : "44x44",
"idiom" : "watch",
"filename" : "AppIcon88.png",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "40mm"
},
{
"size" : "50x50",
"idiom" : "watch",
"filename" : "AppIcon100.png",
"scale" : "2x",
"role" : "appLauncher",
"subtype" : "44mm"
},
{
"size" : "86x86",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "38mm"
},
{
"size" : "98x98",
"idiom" : "watch",
"filename" : "[email protected]",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "42mm"
},
{
"size" : "108x108",
"idiom" : "watch",
"filename" : "AppIcon216.png",
"scale" : "2x",
"role" : "quickLook",
"subtype" : "44mm"
},
{
"size" : "1024x1024",
"idiom" : "watch-marketing",
"filename" : "AppIcon.jpg",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Contents.json

{
"assets" : [
{
"filename" : "Circular.imageset",
"idiom" : "watch",
"role" : "circular"
},
{
"filename" : "Extra Large.imageset",
"idiom" : "watch",
"role" : "extra-large"
},
{
"filename" : "Graphic Bezel.imageset",
"idiom" : "watch",
"role" : "graphic-bezel"
},
{
"filename" : "Graphic Circular.imageset",
"idiom" : "watch",
"role" : "graphic-circular"
},
{
"filename" : "Graphic Corner.imageset",
"idiom" : "watch",
"role" : "graphic-corner"
},
{
"filename" : "Graphic Extra Large.imageset",
"idiom" : "watch",
"role" : "graphic-extra-large"
},
{
"filename" : "Graphic Large Rectangular.imageset",
"idiom" : "watch",
"role" : "graphic-large-rectangular"
},
{
"filename" : "Modular.imageset",
"idiom" : "watch",
"role" : "modular"
},
{
"filename" : "Utilitarian.imageset",
"idiom" : "watch",
"role" : "utilitarian"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Circular.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Extra Large.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Bezel.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Circular.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Corner.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Extra Large.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Graphic Large Rectangular.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Modular.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Complication.complicationset/Utilitarian.imageset/Contents.json

{
"images" : [
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : "<=145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">161"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">145"
},
{
"idiom" : "watch",
"scale" : "2x",
"screen-width" : ">183"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/Contents.json

{
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/EyreFree.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "eyrefree.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/GitHub.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "github.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/Pikachu.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Pikachu.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/icon/Swift.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Swift.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Beethoven.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Beethoven.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Jobs.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Jobs.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Miku.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Miku.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/Wille.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "wille.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/iOS/watchOS Example Extension/Assets.xcassets/Sample/watermark/WWF.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "WWF.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/macOS/macOS Example/Assets.xcassets/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/macOS/macOS Example/Assets.xcassets/AppIcon.appiconset/Contents.json

{
"images" : [
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "16.png",
"scale" : "1x"
},
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "32.png",
"scale" : "1x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "128.png",
"scale" : "1x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "256.png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "512.png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "[email protected]",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/macOS/macOS Example/Assets.xcassets/drag.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "drag.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/macOS/macOS Example/Assets.xcassets/Generator.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Generator.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/macOS/macOS Example/Assets.xcassets/Generator_D.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Generator_D.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/macOS/macOS Example/Assets.xcassets/launchimage.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "launchimage.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/macOS/macOS Example/Assets.xcassets/Recognizer.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Recognizer.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/macOS/macOS Example/Assets.xcassets/Recognizer_D.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Recognizer_D.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json

{
"assets" : [
{
"size" : "1280x768",
"idiom" : "tv",
"filename" : "App Icon - Large.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "400x240",
"idiom" : "tv",
"filename" : "App Icon - Small.imagestack",
"role" : "primary-app-icon"
},
{
"size" : "2320x720",
"idiom" : "tv",
"filename" : "Top Shelf Image Wide.imageset",
"role" : "top-shelf-image-wide"
},
{
"size" : "1920x720",
"idiom" : "tv",
"filename" : "Top Shelf Image.imageset",
"role" : "top-shelf-image"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json

{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json

{
"images" : [
{
"filename" : "EFQRCode.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "EFQRCode 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json

{
"images" : [
{
"filename" : "EFQRCode.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "EFQRCode 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json

{
"images" : [
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json

{
"layers" : [
{
"filename" : "Front.imagestacklayer"
},
{
"filename" : "Middle.imagestacklayer"
},
{
"filename" : "Back.imagestacklayer"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json

{
"images" : [
{
"filename" : "EFQRCode.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "EFQRCode 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json

{
"images" : [
{
"filename" : "EFQRCode.png",
"idiom" : "tv",
"scale" : "1x"
},
{
"filename" : "EFQRCode 1.png",
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json

{
"images" : [
{
"idiom" : "tv",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json

{
"images" : [
{
"idiom" : "tv",
"filename" : "EFQRCode.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json

{
"images" : [
{
"idiom" : "tv",
"filename" : "EFQRCode.png",
"scale" : "1x"
},
{
"idiom" : "tv",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Generator.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Generator.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/LaunchImage.launchimage/Contents.json

{
"images" : [
{
"orientation" : "landscape",
"idiom" : "tv",
"extent" : "full-screen",
"minimum-system-version" : "11.0",
"scale" : "2x"
},
{
"orientation" : "landscape",
"idiom" : "tv",
"filename" : "EFQRCode.png",
"extent" : "full-screen",
"minimum-system-version" : "9.0",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Recognizer.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Recognizer.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/Contents.json

{
"info" : {
"author" : "xcode",
"version" : 1
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/EyreFree.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "eyrefree.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/GitHub.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "github.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/Pikachu.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Pikachu.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/icon/Swift.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Swift.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Contents.json

{
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Beethoven.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Beethoven.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Jobs.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Jobs.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Miku.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "Miku.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/Wille.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "wille.jpg",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: Examples/tvOS/tvOS Example/Assets.xcassets/Sample/watermark/WWF.imageset/Contents.json

{
"images" : [
{
"idiom" : "universal",
"filename" : "WWF.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}


File: .github/CODE_OF_CONDUCT.md

Contributor Covenant Code of Conduct

Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

Our Standards

Examples of behavior that contributes to creating a positive environment include:

  • Using welcoming and inclusive language
  • Being respectful of differing viewpoints and experiences
  • Gracefully accepting constructive criticism
  • Focusing on what is best for the community
  • Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

  • The use of sexualized language or imagery and unwelcome sexual attention or advances
  • Trolling, insulting/derogatory comments, and personal or political attacks
  • Public or private harassment
  • Publishing others' private information, such as a physical or electronic address, without explicit permission
  • Other conduct which could reasonably be considered inappropriate in a professional setting

Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [email protected]. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

Attribution

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at http://contributor-covenant.org/version/1/4


File: .github/CONTRIBUTING.md

Contributing Guidelines

This document contains information and guidelines about contributing to this project.
Please read it before you start participating.

Topics

Asking Questions

We don't use GitHub as a support forum.
For any usage questions that are not specific to the project itself,
please ask on Stack Overflow instead.
By doing so, you'll be more likely to quickly solve your problem,
and you'll allow anyone else with the same question to find the answer.
This also allows maintainers to focus on improving the project for others.

Reporting Issues

A great way to contribute to the project
is to send a detailed issue when you encounter an problem.
We always appreciate a well-written, thorough bug report.

Check that the project issues database
doesn't already include that problem or suggestion before submitting an issue.
If you find a match, add a quick "+1" or "I have this problem too."
Doing this helps prioritize the most common problems and requests.

When reporting issues, please include the following:

  • The version of Xcode you're using
  • The version of iOS or macOS you're targeting
  • The full output of any stack trace or compiler error
  • A code snippet that reproduces the described behavior, if applicable
  • Any other details that would be useful in understanding the problem

This information will help us review and fix your issue faster.

Developer's Certificate of Origin

By making a contribution to this project, I certify that:

  • (a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

  • (b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

  • (c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

  • (d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.

Financial contributions

We also welcome financial contributions in full transparency on our open collective.
Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed.

Credits

Contributors

Thank you to all the people who have already contributed to EFQRCode!

Backers

Thank you to all our backers! [Become a backer]

Sponsors

Thank you to all our sponsors! (please ask your company to also support this open source project by becoming a sponsor)


Some of the ideas and wording for the statements above were based on work by the Alamofire communities. We commend them for their efforts to facilitate collaboration in their projects.


File: .github/FUNDING.yml

These are supported funding model platforms

github: [EyreFree, ApolloZhu]

patreon: EyreFree

open_collective: efqrcode

ko_fi: eyrefree

tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel

custom: https://www.efqrcode.com/donations.jpg


File: .github/ISSUE_TEMPLATE/config.yml

blank_issues_enabled: false
contact_links:


File: .github/ISSUE_TEMPLATE/default.md


name: Have a Question?
about: Please file an issue with this template.
title: ''


Check List

  • I have read the README.md, but the information I need is not there.
  • I have searched in existing issues, but did not find a similar one.

Issue Description

Description

Reproduce

Other Comment


File: .github/workflows/ci.yml

name: CI

Comprehensive CI workflow that includes builds, tests, and validations

on:
push:
branches: [ main, master, develop ]
pull_request:
branches: [ main, master, develop ]

Cancel any in-progress workflow runs for the same branch

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer

jobs:

Swift Package Manager Build

spm-build:
name: SPM Build
runs-on: macos-latest
strategy:
matrix:
platform: [iOS, macOS, tvOS, watchOS, visionOS]

text
steps:
- name: Checkout Repository
  uses: actions/checkout@v4
  
- name: Setup Xcode
  uses: maxim-lobanov/setup-xcode@v1
  with:
    xcode-version: latest
    
- name: Build with SPM
  run: |
    case "${{ matrix.platform }}" in
      iOS)
        SDK_PATH=$(xcrun --sdk iphonesimulator --show-sdk-path)
        swift build \
          -Xcc "-isysroot" -Xcc "$SDK_PATH" \
          -Xswiftc "-sdk" -Xswiftc "$SDK_PATH" \
          -Xswiftc "-target" -Xswiftc "arm64-apple-ios13.0-simulator"
        ;;
      macOS)
        swift build
        ;;
      tvOS)
        SDK_PATH=$(xcrun --sdk appletvsimulator --show-sdk-path)
        swift build \
          -Xcc "-isysroot" -Xcc "$SDK_PATH" \
          -Xswiftc "-sdk" -Xswiftc "$SDK_PATH" \
          -Xswiftc "-target" -Xswiftc "arm64-apple-tvos13.0-simulator"
        ;;
      watchOS)
        SDK_PATH=$(xcrun --sdk watchsimulator --show-sdk-path)
        swift build \
          -Xcc "-isysroot" -Xcc "$SDK_PATH" \
          -Xswiftc "-sdk" -Xswiftc "$SDK_PATH" \
          -Xswiftc "-target" -Xswiftc "arm64-apple-watchos6.0-simulator"
        ;;
      visionOS)
        SDK_PATH=$(xcrun --sdk xrsimulator --show-sdk-path)
        swift build \
          -Xcc "-isysroot" -Xcc "$SDK_PATH" \
          -Xswiftc "-sdk" -Xswiftc "$SDK_PATH" \
          -Xswiftc "-target" -Xswiftc "arm64-apple-xros1.0-simulator"
        ;;
    esac

Xcode Build Test

xcode-build:
name: Xcode Build
runs-on: macos-latest
strategy:
matrix:
destination:
- 'platform=iOS Simulator,name=iPhone 15,OS=latest'
- 'platform=macOS'
- 'platform=tvOS Simulator,name=Apple TV,OS=latest'
- 'platform=watchOS Simulator,name=Apple Watch Series 9 (45mm),OS=latest'
- 'platform=visionOS Simulator,name=Apple Vision Pro,OS=latest'

text
steps:
- name: Checkout Repository
  uses: actions/checkout@v4
  
- name: Setup Xcode
  uses: maxim-lobanov/setup-xcode@v1
  with:
    xcode-version: latest
    
- name: Build with Xcode
  run: |
    xcodebuild clean build \
      -workspace EFQRCode.xcworkspace \
      -scheme "${{ contains(matrix.destination, 'iOS') && 'iOS Example' || contains(matrix.destination, 'macOS') && 'macOS Example' || contains(matrix.destination, 'tvOS') && 'tvOS Example' || contains(matrix.destination, 'watchOS') && 'watchOS Example' || 'iOS Example' }}" \
      -destination "${{ matrix.destination }}" \
      CODE_SIGN_IDENTITY="" \
      CODE_SIGNING_REQUIRED=NO \
      ONLY_ACTIVE_ARCH=NO

Final Status Check

status-check:
name: Status Check
runs-on: macos-latest
needs: [spm-build, xcode-build]
if: always()

text
steps:
- name: Check Results
  run: |
    if [[ "${{ needs.spm-build.result }}" != "success" ]] || [[ "${{ needs.xcode-build.result }}" != "success" ]]; then
      echo "❌  Build checks failed - PR will be blocked"
      exit 1
    fi
    
    echo "✅ All checks passed successfully!"

File: .github/workflows/cocoapods-lint.yml

name: CocoaPods Lint

Trigger the workflow on push and pull request events

on:
push:
branches: [ main, master, develop ]
pull_request:
branches: [ main, master, develop ]

Cancel any in-progress workflow runs for the same branch

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
cocoapods-lint:
name: Pod Lib Lint
runs-on: macos-latest

text
steps:
- name: Checkout Repository
  uses: actions/checkout@v4
  
- name: Setup Ruby
  uses: ruby/setup-ruby@v1
  with:
    ruby-version: '3.0'
    bundler-cache: true
    
- name: Install CocoaPods
  run: |
    gem install cocoapods --no-document
    pod --version
    
- name: Setup Xcode
  uses: maxim-lobanov/setup-xcode@v1
  with:
    xcode-version: latest-stable
    
- name: Show Xcode Version
  run: xcodebuild -version
  
- name: Update CocoaPods Repo
  run: pod repo update
  
- name: Pod Lib Lint - iOS
  run: |
    echo "🔍 Running pod lib lint for iOS..."
    pod lib lint EFQRCode.podspec \
      --platforms=ios \
      --allow-warnings \
      --verbose \
      --fail-fast
      
- name: Pod Lib Lint - macOS  
  run: |
    echo "🔍 Running pod lib lint for macOS..."
    pod lib lint EFQRCode.podspec \
      --platforms=osx \
      --allow-warnings \
      --verbose \
      --fail-fast
      
- name: Pod Lib Lint - tvOS
  run: |
    echo "🔍 Running pod lib lint for tvOS..."
    pod lib lint EFQRCode.podspec \
      --platforms=tvos \
      --allow-warnings \
      --verbose \
      --fail-fast
      
- name: Pod Lib Lint - watchOS
  run: |
    echo "🔍 Running pod lib lint for watchOS..."
    pod lib lint EFQRCode.podspec \
      --platforms=watchos \
      --allow-warnings \
      --verbose \
      --fail-fast
      
- name: Pod Lib Lint - visionOS
  run: |
    echo "🔍 Running pod lib lint for visionOS..."
    pod lib lint EFQRCode.podspec \
      --platforms=visionos \
      --allow-warnings \
      --verbose \
      --fail-fast
  continue-on-error: true  # visionOS support might not be available in all Xcode versions
      
- name: Pod Lib Lint - All Platforms
  run: |
    echo "🔍 Running comprehensive pod lib lint for all platforms..."
    pod lib lint EFQRCode.podspec \
      --allow-warnings \
      --verbose \
      --fail-fast
      
- name: Pod Spec Lint
  run: |
    echo "🔍 Running pod spec lint..."
    pod spec lint EFQRCode.podspec \
      --allow-warnings \
      --verbose \
      --fail-fast
      
- name: Success Notification
  if: success()
  run: |
    echo "✅ All CocoaPods lint checks passed successfully!"
    echo "🎉 The pod is ready for publishing."
    
- name: Failure Notification
  if: failure()
  run: |
    echo "❌ CocoaPods lint checks failed!"
    echo "🔧 Please fix the issues before merging the PR."
    echo "📋 Check the logs above for detailed error information."
    exit 1

File: .github/workflows/docs.yml

name: Documentation

on:
push:
branches:
- main
- docs

Cancel any in-progress workflow runs for the same branch

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
jazzy:
runs-on: macos-latest
steps:
- uses: actions/checkout@v4
- name: Install Jazzy
run: sudo gem install jazzy
- name: Resolve Swift Package dependencies
run: xcodebuild -resolvePackageDependencies
- name: Generate Documentation
run: ./docs.sh
continue-on-error: false
- name: Publish
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./docs


File: .github/workflows/documentation.yml

name: Documentation

Only run on pull requests to check documentation changes

on:
pull_request:
branches: [ main, master, develop ]

Cancel any in-progress workflow runs for the same branch

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

env:
DEVELOPER_DIR: /Applications/Xcode.app/Contents/Developer

jobs:

Documentation Check

documentation-check:
name: Documentation Check
runs-on: macos-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v4

text
- name: Setup Xcode
    uses: maxim-lobanov/setup-xcode@v1
    with:
      xcode-version: latest
      
  - name: Install Jazzy
    run: sudo gem install jazzy
    
  - name: Resolve Swift Package dependencies
    run: xcodebuild -resolvePackageDependencies
    
  - name: Generate Documentation
    run: ./docs.sh
    continue-on-error: false

Status Check

status-check:
name: Documentation Status Check
runs-on: macos-latest
needs: [documentation-check]
if: always()

text
steps:
- name: Check Results
  run: |
    if [[ "${{ needs.documentation-check.result }}" != "success" ]]; then
      echo "❌ Documentation generation failed"
      exit 1
    fi
    
    echo "✅ Documentation check passed successfully!"