πŸš€ Create XCFrameworks with ease! A Command Line Tool to create XCFramework for multiple platforms at one shot! The better way to deal with XCFrameworks for iOS, Mac Catalyst, tvOS, macOS, and watchOS.

Overview

Surmagic

πŸš€ Create XCFramework with ease! A Command Line Tool to create XCFramework for multiple platforms at one shot! The better way to deal with XCFrameworks for iOS, Mac Catalyst, tvOS, macOS, and watchOS.

Stop wasting your time with the Universal/Fat Framework Approach. You don't need to update your shell script periodically anymore.

About

After Xcode 11 now Xcode fully supports using and creating binary frameworks in Swift. Simultaneously support devices and Simulator with the new XCFramework bundle type. XCFrameworks support the binary distribution of Swift and C-based code. A single XCFramework can contain a variant for the simulator, and for the device. This means you can ship slices for any of the architectures, including simulator, any Apple OS and even separate slices for UIKit and AppKit apps.

Requirements

  • macOS Version 11.2 and above
  • Xcode 12 and above
  • Swift 5.1 and above

Installing surmagic

Xcode command line tools (macOS)

Install the command line tools with the command below:

$ xcode-select --install

Homebrew (macOS)

Brew is the Recommended way to install/uninstall the surmagic.

$ brew tap gurhub/surmagic
$ brew install surmagic

This command will install surmagic to your desired bash.

How To Create an XCFramework

After setting up your directory, and filling mandatory parameters in the Surfile you can simply use:

$ surmagic xcf

command to create an XCFramework. That's it. There are other commands too. Please keep reading.

All Available Commands and Options

Use 'surmagic --help' to learn all available commands in the surmagic.

USAGE: surmagic <subcommand>

OPTIONS:
  --version               Show the version.
  -h, --help              Show help information.

SUBCOMMANDS:
  init                    Creates the mandatory directory (surmagic) and files.
  xcf (default)           Creates an XCFramework via Surfile.
  env                     To use while creating an issue on Github, prints the
                          user's environment.

  See 'surmagic help <subcommand>' for detailed help.

Passing parameters to surmagic command-line tools

Surmagic contains several command-line tools, e.g. surmagic xcf or surmagic init. To pass parameters to these tools, append the option names and values as you would for a normal shell command:

$ surmagic [tool] --[option] --[option] ...∞

$ surmagic init
$ surmagic xcf --verbose

What is the Surfile

The Surfile is used to configure surmagic. Open it in your favorite text editor, and add desired targets.

It's a standard Plist (XML) file.

The Surfile has to be inside your ./SM directory.

The Surfile stores the automation configuration that can be run with surmagic.

<dict>
  <key>output_path</key>
  <string>_OUTPUT_DIRECTORY_NAME_HERE_</string>
  <key>framework</key>
  <string>_FRAMEWORK_NAME_HERE_</string>
  <key>targets</key>
  <array>
    <dict>
      <key>sdk</key>
      <string>_TARGET_OS_HERE_</string>
      <key>workspace</key>
      <string>_WORKSPACE_NAME_HERE_.xcworkspace</string>
      <key>scheme</key>
      <string>_SCHEME_NAME_HERE_</string>
    </dict>
     <!--
       Remove this comment and add more targets for Simulators and the Devices.
      -->
  </array>
</dict>
SDK Options
Key Description
iOS iOS
iOSSimulator iOS Simulator
macOS macOS
macOSCatalyst macOS Catalyst
tvOS tvOS
tvOSSimulator tvOS Simulator
watchOS watchOS
watchSimulator watch Simulator

Check the Demo project's example.

Further Reading

Advantages of the XCFramework, comparison with the FAT Framework Approach:

  • Packing dependencies under all target platforms and architectures into one single bundle from the box
  • Connection of the bundle in the format of XCFramework, as a single dependency for all target platforms and architectures
  • Missing the need of building fat/universal framework
  • No need to get rid of x86_64 slices before uploading end applications to AppStore

Also, with surmagic, you won't need to be an expert on the questions listed below:

  • How to create XCFramework in Xcode?
  • How to build Universal iOS Frameworks using XCFramework
  • XCFramework tutorial
  • How do I use XCFramework?
  • What is XCFramework?
  • How do I create a custom framework in Swift?
  • How to add XCFramework to Xcode project?
  • How do I import framework into Xcode?
  • What is Xcode framework?
  • Convert a Universal (FAT) Framework to an XCFramework)
  • Advances in XCFramework
  • Automatic support for Apple Silicon via FAT binaries
  • Built-in support for the BCSymbolMaps and dSYMs

Why not the Swift Package Manager (SPM)?

Well, why not! πŸ€“ It's the easiest! But, Swift PM only allows you to perform the delivery of libs in the form of open source code with the description of dependencies.

Apple presented XCFramework as a new binary format of packing the libs, considering it as an alternative for Swift Packages.

References

Wiki

If you didn't find what you're looking for, check Surmagic's Wiki page. Or maybe you'll want to improve the Wiki page πŸ€“ . Obviously, it's a great idea. πŸ‘πŸ»

Contribute to surmagic

πŸ™‹πŸ»β€β™‚οΈ*Need contribution here!

*If you want to contribute please check out CONTRIBUTING.md for more information on how to help with surmagic.

Contributers

License

"Surmagic" is available under the MIT License license. See the LICENSE file for more info.

Comments
  • Illegal instruction: 4

    Illegal instruction: 4

    username$ surmagic init
    mkdir: ./Surmagic: File exists
    
     πŸ“‚ Created a directory: ./Surmagic
    
    Fatal error: could not load resource bundle: from /usr/local/bin/surmagic_surmagic.bundle or /Users/mgy/Developer/surmagic/surmagic/.build/x86_64-apple-macosx/release/surmagic_surmagic.bundle: file surmagic/resource_bundle_accessor.swift, line 11
    Illegal instruction: 4
    
    question 
    opened by Disconnecter 10
  • 'createFramework(verbose:)' caused an unexpected error.

    'createFramework(verbose:)' caused an unexpected error.

    Describe the bug 'createFramework(verbose:)' caused an unexpected error.

    To Reproduce Steps to reproduce the behavior:

    1. I run the command 'surmagic xcf'
    2. See error 'createFramework(verbose:)' caused an unexpected error.'

    macOS (please complete the following information):

    1.2.3


    Xcode 13.2.1 Build version 13C100


    ProductName: macOS ProductVersion: 12.2 BuildVersion: 21D49


    bug 
    opened by sh4wn 5
  • 'createFramework(verbose:)' caused an unexpected error.

    'createFramework(verbose:)' caused an unexpected error.

    Describe the bug A clear and concise description of what the bug is.

    To Reproduce Steps to reproduce the behavior:

    1. I run the command 'surmagic xcf'
    2. See error 'createFramework(verbose:)' caused an unexpected error.'

    Expected behavior A clear and concise description of what you expected to happen.

    Screenshots If applicable, add screenshots to help explain your problem.

    macOS (please complete the following information):

    • If you can, please share the output of the -surmagic env- command
    • Or, please share the list below:
    • macOS version, [e.g. Big Sur 11.1 (20C69)]
    • Swift version, [e.g. 5.3]

    Additional context Add any other context about the problem here.

    opened by shubham14896 5
  • Surmagic init - Illegal hardware instruction  surmagic init

    Surmagic init - Illegal hardware instruction surmagic init

    Describe the bug Calling surmagic init while being in the Xcode project folder is throwing an error:

     πŸ“‚ Created a directory: ./Surmagic 
    
    Fatal error: could not load resource bundle: from /usr/local/bin/surmagic_surmagic.bundle or /Users/mgy/Developer/surmagic/surmagic/.build/x86_64-apple-macosx/release/surmagic_surmagic.bundle: file surmagic/resource_bundle_accessor.swift, line 11
    [1]    82586 illegal hardware instruction  surmagic init
    

    To Reproduce Steps to reproduce the behavior:

    1. cd to Xcode project directory
    2. run surmagic init
    3. See error

    Expected behavior The Surfile is generated and no error thrown.

    Screenshots ...

    macOS (please complete the following information): ℹ️ Printing the information:


    1.2.2


    Xcode 12.3 Build version 12C33


    ProductName: macOS ProductVersion: 11.1 BuildVersion: 20C69


    Additional context ...

    help wanted 
    opened by miroslavkovac 5
  • XCframework not generated

    XCframework not generated

    Describe the bug

    XCframework not generated.

    To Reproduce

    Steps to reproduce the behavior:

    1. clone repo
    2. Then run surmagic xcf --verbose

    Expected behavior

    I expect XCframework to be generated after the two archives have been created.

    Faulty behavior

    I see the archives, created then an empty folder.

    Extra Strange

    when I run the command copied from the verboselog output from the surmagic failed command I do get the XCframework i.e when I run the following

    xcodebuild archive -workspace WalletTest.xcworkspace -sdk iphonesimulator -scheme walletintel -archivePath ./build/iOSSimulator.xcarchive SKIP_INSTALL=NO
    
    xcodebuild archive -workspace WalletTest.xcworkspace -sdk iphoneos -scheme walletarm -archivePath ./build/iOS.xcarchive SKIP_INSTALL=NO
    
    xcodebuild -create-xcframework -framework ./build/iOS.xcarchive/Products/Library/Frameworks/walletarm.framework -framework ./build/iOSSimulator.xcarchive/Products/Library/Frameworks/walletintel.framework -output ./build/xcf.xcframework
    

    Youtube Video

    If applicable, add screenshots to help explain your problem. https://youtu.be/cFympcNRWIw

    Details

     ❯ surmagic env                                                             [10:51:58]
    
     ℹ️  Printing the information:
    
    
     ---------------------------
    
    1.2.5
    
     ---------------------------
    
    Xcode 13.3.1
    Build version 13E500a
    
     ---------------------------
    
    ProductName:	macOS
    ProductVersion:	12.3.1
    BuildVersion:	21E258
    
     ---------------------------
    

    Checklist

    • [x] If possible, I've reproduced the issue using the master branch of this package
    • [x] I've searched for existing GitHub issues

    Additional context

    Add any other context about the problem here.

    opened by byaruhaf 3
  • Quiet mode

    Quiet mode

    Would it be possible to not open the folder at the end of the build? Maybe a quiet option or something. I am using this wonderful tool in CI/CD environment and my runner is spawning windows :)

    Thank you,

    Vojta

    enhancement 
    opened by VStursa 3
  • Xcode 12 Build Targets

    Xcode 12 Build Targets

    First of all, thank you for the script. πŸ‘

    I am using Xcode 12 and trying to build a universal framework. Before there was a single target for the Generic iOS Device, but now I have:

    Screenshot 2020-09-27 at 10 12 58

    The framework will contain only one selected target (either i386/x86_64 or arm64/arm), so I can run it on either simulator or device. How can I build it with both architectures on Xcode 12?

    opened by prin53 3
  • Xcode 11.5 and 11.4 issue

    Xcode 11.5 and 11.4 issue

    Not working on Xcode 11.5 when generating a framework.

    i have universalLib Target pointing to framework, so I've added the script for the universalLib not the framework target. for more details see the below picture: https://i.imgur.com/AxMXtwn.png

    Details :

     ⏱ Starting the Universal Framework work... 
    
    
    
    
    ##################################################################
    
    DEVICE_LIBRARY_PATH: /Users/mobilebuildserver/Library/Developer/Xcode/DerivedData/MYFRAMEWORK-fxtduirfbjhujbdypbycbxrddkjy/Build/Products/Debug-iphoneos/MYFRAMEWORK.framework
    SIMULATOR_LIBRARY_PATH: /Users/mobilebuildserver/Library/Developer/Xcode/DerivedData/MYFRAMEWORK-fxtduirfbjhujbdypbycbxrddkjy/Build/Products/Debug-iphonesimulator/MYFRAMEWORK.framework
    UNIVERSAL_LIBRARY_DIR: /Users/mobilebuildserver/Library/Developer/Xcode/DerivedData/MYFRAMEWORK-fxtduirfbjhujbdypbycbxrddkjy/Build/Products/Debug-Universal
    
    ##################################################################
    
    
    ##################################################################
    
    
    
    
     πŸš€ Step 1-1: Building for iphonesimulator
    
    ##################################################################
    
    xcodebuild: error: '' is not a workspace file.
    
    ##################################################################
    
    
    
    
     πŸš€ Step 1-2: Building for iphoneos 
    
    
    
    xcodebuild: error: '' is not a workspace file.
    
    ##################################################################
    
    
    
    
     πŸ“¦ Step 2: Copy the framework structure for iphoneos
    
    ##################################################################
    
    cp: /Users/mobilebuildserver/Library/Developer/Xcode/DerivedData/MYFRAMEWORK-fxtduirfbjhujbdypbycbxrddkjy/Build/Products/Debug-iphoneos/MYFRAMEWORK.framework: No such file or directory
    
    ##################################################################
    
    
    
    
     πŸ›  Step 3: The LIPO Step
    
    ##################################################################
    
    fatal error: lipo: can't open input file: /Users/mobilebuildserver/Library/Developer/Xcode/DerivedData/MYFRAMEWORK-fxtduirfbjhujbdypbycbxrddkjy/Build/Products/Debug-iphonesimulator/MYFRAMEWORK.framework/MYFRAMEWORK (No such file or directory)
    
    ##################################################################
    
    
    
    
     πŸ“¦ Step 4: Copy the Swiftmodules
    
    ##################################################################
    
    ℹ️ Couldn't any Swift module file for SIMULATOR!
    ℹ️ Couldn't any Swift module file for DEVICE!
    
    ##################################################################
    
    
    
    
     πŸš› Step 5 Copying in the project directory
    
    ##################################################################
    
    cp: /Users/mobilebuildserver/Library/Developer/Xcode/DerivedData/MYFRAMEWORK-fxtduirfbjhujbdypbycbxrddkjy/Build/Products/Debug-Universal/MYFRAMEWORK.framework: No such file or directory
    
    ##################################################################
    
    
    ##################################################################
    
    
    ##################################################################
    
    
    
    
     🏁 Completed with Success! πŸ™‚
    
     πŸ” For more details you can always check the /tmp/MYFRAMEWORK_archive.log file. πŸ“ 
    
    
    
    
    ##################################################################
    
    
    
    opened by AaoIi 3
  • Archiving error when build .xcodeproj

    Archiving error when build .xcodeproj

    First of all, forgive my poor english

    Describe the bug

    i got an error when i build a framework

    To Reproduce

    Steps to reproduce the behavior:

    1. change Surfile file like below
    <dict>
          <key>sdk</key>
          <string>xxxxx</string>
          <key>project</key>
          <string>xxxxx.xcodeproj</string>
          <key>scheme</key>
          <string>xxxxx</string>
    </dict>
    
    1. run surmagic xcf
    2. got an error: ["xcodebuild", "-quiet", "archive", "-project xxxxx.xcodeproj", "xxxxx.xcodeproj", "-sdk", "macosx", "-scheme", "xxxxx", "-archivePath", "./build/macOSCatalyst.xcarchive", "SKIP_INSTALL=NO", "SUPPORTS_MACCATALYST=YES"]) xcodebuild: error: invalid option '-project xxxxx.xcodeproj'

    I think "-project xxxxx.xcodeproj" is the reason why i got this error and #14 means the same as me

    Details

    • macOS version : Monterey 12.4 (21F79)
    • Swift version : 5.5
    • Your CPU type : Intel

    Checklist

    • [❌] If possible, I've reproduced the issue using the master branch of this package
    • [βœ…] I've searched for existing GitHub issues
    bug 
    opened by cookle 2
  • xcode project archive failure

    xcode project archive failure

    if let workspace = target.workspace { arguments.append("-workspace") arguments.append(workspace) } else if let project = target.project { arguments.append("-project (project)") arguments.append(project)

    only add once 'project'

    bug 
    opened by jiangweiqing 2
  • Xcode 12 - fatal error lipo

    Xcode 12 - fatal error lipo

    First of all thanks for your tutorial. I have developed a library that must work both on simulators and on physical devices hence the need to create a fat framework.

    I followed your istructions and build your script, unfortunately I get a fatal error at STEP 3 (... have the same architectures (arm64) and can't be in the same fat output file).

    Details :

    ⏱Starting the Universal Framework work... 
    
    
    ##################################################################
    
    
    
     πŸš€ Step 1-1: Building for iphonesimulator
    
    ##################################################################
    
    2020-09-22 14:20:49.926 xcodebuild[19152:440414]  DTDeviceKit: deviceType from aa02380574025d12b6a86713c0a5c871122e93a8 was NULL
    2020-09-22 14:20:50.088 xcodebuild[19152:440404]  DTDeviceKit: deviceType from aa02380574025d12b6a86713c0a5c871122e93a8 was NULL
    2020-09-22 14:20:50.088 xcodebuild[19152:440404]  DTDeviceKit: deviceType from aa02380574025d12b6a86713c0a5c871122e93a8 was NULL
    
    ##################################################################
    
    
    
    
     πŸš€ Step 1-2: Building for iphoneos 
    
    
    
    
    ##################################################################
    
    
    
    
     πŸ“¦ Step 2: Copy the framework structure for iphoneos
    
    ##################################################################
    
    
    ##################################################################
    
    
    
    
     πŸ›  Step 3: The LIPO Step
    
    ##################################################################
    
    fatal error: lipo: /Users/francesco/Library/Developer/Xcode/DerivedData/XXX-ejajnmazbewoplbnwyfgpckisukh/Build/Products/Release-iphonesimulator/XXX.framework/XXX and /Users/francesco/Library/Developer/Xcode/DerivedData/XXX-ejajnmazbewoplbnwyfgpckisukh/Build/Products/Release-iphoneos/XXX.framework/XXX have the same architectures (arm64) and can't be in the same fat output file
    
    ##################################################################
    
    
    
    
     πŸ“¦ Step 4: Copy the Swiftmodules
    
    ##################################################################
    
    
    cp: /Users/francesco/Library/Developer/Xcode/DerivedData/XXX-ejajnmazbewoplbnwyfgpckisukh/Build/Products/Release-iphonesimulator/XXX.framework/Modules/XXX.swiftmodule/Project is a directory (not copied).
    
    cp: /Users/francesco/Library/Developer/Xcode/DerivedData/XXX-ejajnmazbewoplbnwyfgpckisukh/Build/Products/Release-iphoneos/XXX.framework/Modules/XXX.swiftmodule/Project is a directory (not copied).
    
    ##################################################################
    
    
    
    
     πŸš› Step 5 Copying in the project directory
    
    ##################################################################
    
    
    ##################################################################
    
    
    ##################################################################
    
    
    ##################################################################
    
    
    
    
     🏁 Completed with Success! πŸ™‚
    
     πŸ” For more details you can always check the /tmp/XXX_archive.log file. πŸ“ 
    
    
    
    
    ##################################################################
    
    

    I replaced my library name with XXX.

    Could you help me to solve it please? Thank you

    opened by frovera 2
  • Fixed xcframework not generated

    Fixed xcframework not generated

    File xcframework not generated due to no swiftinterface files generated (May be the reason for #15 ), fixed it by adding "BUILD_LIBRARY_FOR_DISTRIBUTION=YES" to xcodebuild arguments.

    ENV

     --------------------------- 
    
    1.2.7
    
     --------------------------- 
    
    Xcode 14.2
    Build version 14C18
    
     --------------------------- 
    
    ProductName:		macOS
    ProductVersion:		13.1
    BuildVersion:		22C65
    
     --------------------------- 
    

    Details

    xcodebuild output error: No 'swiftinterface' files found within '/Users/xxx/Documents/Repos/iOS/SnapKit/SMoutput/iOS.xcarchive/Products/Library/Frameworks/SnapKit.framework/Modules/SnapKit.swiftmodule'. but surmagic still says: Successfully created a XCFramework on the location: ./xxxx in fact, the output folder only contains a Info.plist file.

    Adding "BUILD_LIBRARY_FOR_DISTRIBUTION=YES" to xcodebuild arguments to make it generate swiftinterface files, this will solve the issue.

    opened by FFirX 1
  • Does not create maccatalyst but mac os

    Does not create maccatalyst but mac os

    Describe the bug

    I was using Surmagic to create xcframework for UnrarKit (https://github.com/abbeycode/UnrarKit/tree/v2.11). But instead of create xcframework for Mac Catalyst, It created xcframework for macOS.

    To Reproduce

    Steps to reproduce the behavior:

    1. I run the command 'urmagic xcf'
    2. See error '/Users/huynguyen/Downloads/UnrarKit-2.11/ahihi/UnrarKit.xcframework:1:1: While building for Mac Catalyst, no library for this platform was found in '/Users/huynguyen/Downloads/UnrarKit-2.11/ahihi/UnrarKit.xcframework'.'

    Expected behavior

    support Mac Catalys

    Screenshots

    Screen Shot 2022-08-08 at 11 31 28 Screen Shot 2022-08-08 at 11 32 10 ![Screen Shot 2022-08-08 at 11 37 30](https://user-images.githubusercontent.com/32290683/183340235-14620a84-25bf-4ab7-82a5-9cdcf04615d3.png)

    Details

    • If you can, please share the output of the -surmagic env- command
    • Or, please share the list below:
    • macOS version, [Monterey 12.5)]
    • Swift version, [5.6]
    • Your CPU type, [ M1 Pro]

    Checklist

    • [x] If possible, I've reproduced the issue using the master branch of this package
    • [x] I've searched for existing GitHub issues
    bug 
    opened by huynguyen230892 3
  • [Question] Create multiple xcframeworks with surfile

    [Question] Create multiple xcframeworks with surfile

    Not a bugreport, but a question or a discussion.

    For example, I have a workspace with multiple subprojects. I would like to build multiple xcframeworks for each project. As far as I see, it's not possible now.

    What about adding array of output frameworks in a surfile?

    enhancement 
    opened by AYastrebov 1
Releases(v1.2.7)
Owner
Muhammed Gurhan Yerlikaya
Muhammed Gurhan Yerlikaya
A dependency manager driven by SwiftPM that works for iOS/tvOS/watchOS/macOS projects.

Installation β€’ Usage β€’ Supporting Accio β€’ Contributing β€’ License ⚠️ Deprecation Notice ⚠️ With the release of Xcode 12 which includes Swift 5.3, we fe

Jamit Labs 647 Dec 25, 2022
Go Flashcards for iOS and WatchOS - Official repository

Go Flashcards for iOS and WatchOS Go Flashcards for iOS and WatchOS is an application that allows users to create stacks of flashcards and review them

Roy 60 Dec 8, 2022
Awesome-ios-app - Suitable for beginners iOS development small app

awesome-ios-app Suitable for beginners iOS development small app. Table of Conte

Ryan 1 Feb 11, 2022
A package manager that installs and runs executable Swift packages

Mint ?? A package manager that installs and runs Swift command line tool packages. $ mint run realm/[email protected] This would install and run SwiftL

Yonas Kolb 2k Jan 7, 2023
Carthage cache for S3, Minio, Ceph, Google Storage, Artifactory and many others

Rome Rome is a tool that allows developers on Apple platforms to use: Amazon's S3 Minio Ceph other S3 compatible object stores or/and a local folder y

Tommaso Piazza 792 Jan 4, 2023
A script to fetch packages via Github search and diff them against SPI

spi-package-importer importer is a command line utility with three subcommands: fetch package lists from Github via search and save them to JSON files

Swift Package Index 1 Jan 17, 2022
A curated list of awesome SwiftUI tutorials, libraries, videos and articles.

Awesome SwiftUI ??️ A curated list of awesome SwiftUI tutorials, libraries, sessions and articles. Contributing Found a SwiftUI library or snippet tha

Chinsyo 607 Jan 3, 2023
SwiftyStoreKit is a lightweight In App Purchases framework for iOS, tvOS, watchOS, macOS, and Mac Catalyst β›Ί

SwiftyStoreKit is a lightweight In App Purchases framework for iOS, tvOS, watchOS, macOS, and Mac Catalyst. Features Super easy-to-use block-based API

Andrea Bizzotto 6.1k Jan 7, 2023
Mercato is a lightweight In-App Purchases (StoreKit 2) library for iOS, tvOS, watchOS, macOS, and Mac Catalyst.

Mercato Mercato is a lightweight In-App Purchases (StoreKit 2) library for iOS, tvOS, watchOS, macOS, and Mac Catalyst. Installation Swift Package Man

Pavel T 49 Jan 4, 2023
A better way to operate QR Code in Swift, support iOS, macOS, watchOS and tvOS.

EFQRCode is a lightweight, pure-Swift library for generating stylized QRCode images with watermark or icon, and for recognizing QRCode from images, in

EFPrefix 4.3k Dec 29, 2022
A better way to operate QR Code in Swift, support iOS, macOS, watchOS and tvOS.

EFQRCode is a lightweight, pure-Swift library for generating stylized QRCode images with watermark or icon, and for recognizing QRCode from images, in

EFPrefix 4.3k Jan 2, 2023
A better way to operate QR Code in Swift, support iOS, macOS, watchOS and tvOS.

EFQRCode is a lightweight, pure-Swift library for generating stylized QRCode images with watermark or icon, and for recognizing QRCode from images, in

EFPrefix 4.3k Jan 2, 2023
A better way to operate QR Code in Swift, support iOS, macOS, watchOS and tvOS.

EFQRCode is a lightweight, pure-Swift library for generating stylized QRCode images with watermark or icon, and for recognizing QRCode from images, in

EFPrefix 4.3k Dec 29, 2022
The better way to deal with JSON in Objective-C (inspired by SwiftyJSON)

NSTEasyJSON Inpired by SwiftyJSON. NSTEasyJSON makes it easy to deal with JSON data in Objective-C. Why is the typical JSON handling in Objective-C NO

Timur Bernikovich 11 Apr 2, 2020
Multiple Arcade Machine Emulator for iOS, iPadOS, tvOS, macOS (Catalyst)

MAME4iOS Original Author: David Valdeita (Seleuco) This is a port of MAME for iOS, iPadOS, tvOS and macOS. MAME4iOS is designed to run for modern iOS

null 438 Jan 4, 2023
A cross-platform library of Swift utils to ease your iOS | macOS | watchOS | tvOS and Linux development.

Mechanica A library of Swift utils to ease your iOS, macOS, watchOS, tvOS and Linux development. Requirements Documentation Installation License Contr

Alessandro 28 Aug 28, 2022
A Mac command-line tool that automatically downloads macOS Installers / Firmwares.

MIST - macOS Installer Super Tool A Mac command-line tool that automatically downloads macOS Installers / Firmwares: Features List all available macOS

Nindi Gill 483 Jan 8, 2023
The best command-line tool to install and switch between multiple versions of Xcode.

The best command-line tool to install and switch between multiple versions of Xcode.

Robots and Pencils 2.3k Jan 9, 2023
A wrapper to make it really easy to deal with iOS, macOS, watchOS and Linux Keychain and store your user's credentials securely.

A wrapper (written only in Swift) to make it really easy to deal with iOS, macOS, watchOS and Linux Keychain and store your user's credentials securely.

Ezequiel Aceto 2 Mar 29, 2022
Image slide-show viewer with multiple predefined transition styles, with ability to create new transitions with ease.

ATGMediaBrowser ATGMediaBrowser is an image slide-show viewer that supports multiple predefined transition styles, and also allows the client to defin

null 200 Dec 19, 2022