Ready to go biometric verification for the internet.

Overview

Perse SDK Lite iOS

From CyberLabs.AI.
Ready to go biometric verification for the internet.

The Perse CocoaPods SDK Lite:

  • Top notch facial detection model;
  • Anti-spoofing;
  • Feedback on image quality;
  • Compare the similarity between two faces;
  • Doesn't store any photos;

For more details, you can see the Official Perse.

Soon voice biometric verification.

Content of Table

About

This SDK provides abstracts the communication with the Perse's API endpoints and also convert the response from json to a pre-defined responses.

Want to test the endpoints?

You can test our endpoints using this Swagger UI Playground.

Want to test a web live demo?

You can test our web live demos in the CyberLabs.AI CodePen or in the Perse Oficial Docs. Do not forget your API Key.

Want to try a backend client?

We have some examples in Python, Go and javaScript. You can see documented here.

Get Started

Install

  1. Create a Podfile. You may need install CocoaPods in your environment.

  2. Add the following line to your Podfile file:

pod 'PerseLite'
  1. And run in the project root the following command line:
pod install
  1. Now, you can open and build your project with the extension .xcworkspace;

How to create a Xcode project with CocoaPods?

To create a Xcode project with CocoaPods you can see in the Official CocoaPods Guide.

API Key

Perse API authenticates your requests using an API Key.
We are currently in Alpha. So you can get your API Key:

  1. Sending an email to [email protected];
  2. Or in the Perse official site https://www.getperse.com/;

Demo

We have a Demo in this repository for you:

  • Feel free to change the Demo code;
  • Not forget to get your API KEY;
  • To run, the Demo, it is necessary to follow the Install steps;

Usage

Face Detect

Detect allows you process images with the intent of detecting human faces.

import PerseLite

func detect(_ file: String) {
    let perseLite = PerseLite(apiKey: "API_KEY")

    perseLite.face.detect(filePath) {
        detectResponse in
        debugPrint(detectResponse)
    } onError: {
        error in
        debugPrint(error)
    }
}

Face Compare

Compare accepts two sources for similarity comparison.

import PerseLite

func compare(
    _ firstFile: String,
    _ secondFile: String
) {
    let perseLite = PerseLite(apiKey: "API_KEY")

    perseLite.face.compare(
        firstFilePath,
        secondFilePath
    ) {
        compareResponse in
        debugPrint(compareResponse)
    } onError: {
        error in        
        debugPrint(error)
    }
}

Camera Integration

Here we have a example in code how to detect a face from a camera. See the complete code in the Demo application.
Just follow the Installation in the Yoonit Camera.

import UIKit
import PerseLite
import YoonitCamera

class PerseLiteCameraViewController:
    UIViewController,
    CameraEventListenerDelegate
{
    override func viewDidLoad() {
        super.viewDidLoad()

        self.cameraView.cameraEventListener = self
        self.cameraView.startPreview()
        self.cameraView.setSaveImageCaptured(true)
        self.cameraView.setTimeBetweenImages(300)
        self.cameraView.startCaptureType("frame")
    }

    func onImageCaptured(
        _ type: String,
        _ count: Int,
        _ total: Int,
        _ imagePath: String,
        _ darkness: NSNumber?,
        _ lightness: NSNumber?,
        _ sharpness: NSNumber?
    ) {
        self.perseLite.face.detect(imagePath) {
            detectResponse in
            debugPrint(detectResponse)                        
        } onError: {
            error in
            debugPrint(error)
        }
    }

    ...
}

Running Tests

Important:

You access it by clicking its icon in the navigator selector bar, located between the issue navigator and the debug navigator. When you have a project with a suite of tests defined, you see a navigator view similar to the one shown here.

API

This section describes the Perse SDK Lite iOS API's, methods, your responses and possible errors.

Methods

The Perse is in alpha version and for now, only the Face module is available.

face.detect

  • Has the intent of detecting any number of human faces;
  • Can use this resource to evaluate the overall quality of the image;
  • The input can be the image file path or his Data;
  • The onSuccess return type is DetectResponse struct;
  • The onError return type can see in the Errors;
func detect(
    _ filePath: String,
    onSuccess: @escaping (DetectResponse) -> Void,
    onError: @escaping (String, String) -> Void
)
func detect(
    _ data: Data,
    onSuccess: @escaping (DetectResponse) -> Void,
    onError: @escaping (String, String) -> Void
)

face.compare

  • Accepts two sources for similarity comparison;
  • The inputs can be the image file paths or his Data's;
  • The onSuccess return type is CompareResponse struct;
  • The onError return type can see in the Errors;
func compare(
    _ firstFilePath: String,
    _ secondFilePath: String,
    onSuccess: @escaping (CompareResponse) -> Void,
    onError: @escaping (String, String) -> Void
)
func compare(
    _ firstFile: Data,
    _ secondFile: Data,
    onSuccess: @escaping (CompareResponse) -> Void,
    onError: @escaping (String, String) -> Void
)

Tip

We recommend considering a match when similarity is above 71.

Responses

CompareResponse

Attribute Type Description
similarity Float Similarity between faces. Closer to 1 is better.
timeTaken Float Time taken to analyze the image.
raw String? The API response in string.

DetectResponse

Attribute Type Description
totalFaces Int Total of faces in the image.
faces Array Array of FaceResponse.
imageMetrics MetricsResponse Metrics of the detected image.
timeTaken Float Time taken to analyze the image.
raw String? The API response in string.

FaceResponse

Attribute Type Description
landmarks LandmarksResponse Detected face landmarks.
boundingBox Array Array with the four values of the face bounding box. The coordinates x, y and the dimension width and height respectively.
faceMetrics MetricsResponse Metrics of the detecting face.
livenessScore Long Confidence that a detected face is from a live person (1 means higher confidence).

MetricsResponse

Attribute Type Description
underexpose Float Indicates loss of shadow detail. Closer to 0 is better.
overexpose Float Indicates loss of highlight detail. Closer to 0 is better.
sharpness Float Indicates intensity of motion blur. Closer to 1 is better.

LandmarksResponse

Attribute Type Description
rightEye Array Right eye landmarks.
leftEye Array Left eye landmarks.
nose Array Nose landmarks.
mouthRight Array Right side of mouth landmarks.
mouthLeft Array Left side of mouth landmarks.

Errors

The onError:

  • First parameter is the Error Code;
  • Second parameter is a raw text message;
Error Code Description
400 The request was unacceptable, often due to missing a required parameter.
401 API key is missing or invalid.
402 The parameters were valid but the request failed.
415 The content type or encoding is not valid.

To Contribute and Make It Better

Clone the repo, change what you want and send PR.
For commit messages we use Conventional Commits.

Contributions are always welcome!


Made with by the Cyberlabs AI

You might also like...
McPicker is a customizable, closure driven UIPickerView drop-in solution with animations that is rotation ready.
McPicker is a customizable, closure driven UIPickerView drop-in solution with animations that is rotation ready.

McPicker About McPicker is a UIPickerView drop-in solution with animations that is rotation ready. The more string arrays you pass, the more picker co

[iOS] Easy, customizable notifications displayed on top of the statusbar. With progress and activity. iPhone X ready.
[iOS] Easy, customizable notifications displayed on top of the statusbar. With progress and activity. iPhone X ready.

JDStatusBarNotification Show messages on top of the status bar. Customizable colors, font and animation. Supports progress display and can show an act

A timer that lets you know when your ramen is ready to eat!
A timer that lets you know when your ramen is ready to eat!

Dependencies Ramen Timer requires the following: Gifu SwiftySound On Xcode simply go to File Add Packages and input the names on the searchbar then

A ready for use and fully customizable location picker for your app
A ready for use and fully customizable location picker for your app

LocationPicker A ready for use and fully customizable location picker for your app. Features Installation Cocoapods Carthage Swift Package Manager Qui

A Location Manager for easily implementing location services & geofencing in iOS. Ready for iOS 11.
A Location Manager for easily implementing location services & geofencing in iOS. Ready for iOS 11.

A Location Manager for easily implementing location services & geofencing in iOS, written in Objective-C. Ready for iOS 11. Features Get current/conti

CollectionComposer2 - Copy random image files from various sources to destination folder - ready to use

CollectionComposer2 This is a small tool to copy a random number of image files from different source folders to a destination folder. As an additiona

Ready use service for Firebase. Included interface, recored devices and notifications.
Ready use service for Firebase. Included interface, recored devices and notifications.

SPProfiling Ready use service with using Firebase. Included interface, manage auth process, recored devices and profile data. Installation Ready for u

Generator of settings icon by SF Symbols. Customisable background color and ready-use in table cell.

SPSettingsIcons Generate settings icons by Apple's SF Symbols. For safe using SFSymbols see SPSafeSymbols library. Installation Swift Package Manager

Jay - Pure-Swift JSON parser & formatter. Fully streamable input and output. Linux & OS X ready.

Pure-Swift JSON parser & formatter. Fully streamable input and output. Linux & OS X ready. Replacement for NSJSONSerialization.

LocationPicker - A ready for use and fully customizable location picker for your app
LocationPicker - A ready for use and fully customizable location picker for your app

LocationPicker A ready for use and fully customizable location picker for your app. Features Installation Cocoapods Carthage Swift Package Manager Qui

A template for new Swift iOS / macOS / tvOS / watchOS Framework project ready with travis-ci, cocoapods, Carthage, SwiftPM and a Readme file
A template for new Swift iOS / macOS / tvOS / watchOS Framework project ready with travis-ci, cocoapods, Carthage, SwiftPM and a Readme file

Swift Framework Template A template for new Swift Framework. What's in the template? Deployment Targets - iOS 9.0 / Mac OS X 10.10 / tvOS 9.0 / watchO

A simple class to check for internet connection availability in Swift.

Reach A simple class to check for internet connection availability in Swift. Works for both 3G and WiFi connections. Install Manually Add the Reach.sw

StatusBarOverlay will automatically show a
StatusBarOverlay will automatically show a "No Internet Connection" bar when your app loses connection, and hide it again. It supports apps which hide the status bar and The Notch

StatusBarOverlay StatusBarOverlay will automatically show a "No Internet Connection" bar when your app loses connection, and hide it again. It support

iOS music player app that downloads music from the internet, even YouTube
iOS music player app that downloads music from the internet, even YouTube

About YouTag is an iOS music player app that downloads music from the internet, even YouTube, and manages it in a local library. Music videos can also

Aplicativos dos mais diversos memes da internet através de uma API.
Aplicativos dos mais diversos memes da internet através de uma API.

MemesAPI Esse aplicativo foi um desafio de uma das aulas passadas da digitalhouse, nele consumimos uma API de memes, em arquitetura MVC, que trazia o

An internet based messaging app similar to WhatsApp
An internet based messaging app similar to WhatsApp

Flash-Chat Flash Chat is an internet based messaging app similar to WhatsApp Table of Contents Description What I Learned How To Use Author Info Scree

 An internet based messaging app similar to WhatsApp
An internet based messaging app similar to WhatsApp

Flash-Chat An internet based messaging app similar to WhatsApp What i learned while working on this project: How to integrate third party libraries in

AnylineFaceAuthentication pairs identity document scanning with a real-time liveness check utilizing the iPhone's camera, best suited for authenticating users over the internet.

AnylineFaceAuthentication AnylineFaceAuthentication pairs identity document scanning with a real-time liveness check utilizing the iPhone's camera, be

Loads a list of campaigns from the internet and displays them
Loads a list of campaigns from the internet and displays them

Campaign Browser Loads a list of campaigns from the internet and displays them. Dependency Management The project has some dependencies to third-party

Comments
  • User enroll

    User enroll

    💥 Breaking Changes

    Complete breaking changes in the Responses, Methods and your usages. Motivations:

    • Improve cohesion;
    • Patterning with the methods;
    • Prepare for future features, like the "vox"s;

    API Responses

    | Deprecated | New Usage | - | - | CompareResponse | PerseAPIResponse.Face.Compare | DetectResponse | PerseAPIResponse.Face.Detect | FaceResponse | PerseAPIResponse.Face.Face | MetricsResponse | PerseAPIResponse.Face.Metrics | LandmarksResponse | PerseAPIResponse.Face.Landmarks

    Methods

    | Deprecated | New | - | - | func detect( _ filePath: String, onSuccess: @escaping (DetectResponse) -> Void, onError: @escaping (String, String) -> Void)| func detect( _ filePath: String, onSuccess: @escaping (PerseAPIResponse.Face.Detect) -> Void, onError: @escaping (String, String) -> Void) | func detect( _ data: Data, onSuccess: @escaping (DetectResponse) -> Void, onError: @escaping (String, String) -> Void)| func detect( _ data: Data, onSuccess: @escaping (PerseAPIResponse.Face.Detect) -> Void, onError: @escaping (String, String) -> Void) | func compare( _ firstFilePath: String, _ secondFilePath: String, onSuccess: @escaping (CompareResponse) -> Void, onError: @escaping (String, String) -> Void)| func compare( _ firstFilePath: String, _ secondFilePath: String, onSuccess: @escaping (PerseAPIResponse.Face.Compare) -> Void, onError: @escaping (String, String) -> Void) | func compare( _ firstData: Data, _ secondData: Data, onSuccess: @escaping (CompareResponse) -> Void, onError: @escaping (String, String) -> Void)| func compare( _ firstData: Data, _ secondData: Data, onSuccess: @escaping (PerseAPIResponse.Face.Compare) -> Void, onError: @escaping (String, String) -> Void)

    ✨ New Feature

    Face Enrollment

    Enrolled faces are persisted and can be used for saving biometric facial features for future use. The enrollment's methods allow you to create, update, delete and get enrolled faces.

    enrollment.face.create

    • Responsible for creating new enrollment;
    • Extract the facial features of the largest face;
    • Faces that are not completely inside the image will not be considered;
    • The input can be the image file path or his Data;
    • The onSuccess type is PerseAPIResponse.Enrollment.Face.Create struct;
    func create(
        _ filePath: String,
        onSuccess: @escaping (PerseAPIResponse.Enrollment.Face.Create) -> Void,
        onError: @escaping (String, String) -> Void
    )
    
    func create(
        _ data: Data,
        onSuccess: @escaping (PerseAPIResponse.Enrollment.Face.Create) -> Void,
        onError: @escaping (String, String) -> Void
    )
    

    enrollment.face.update

    • Responsible for update a face enrollment with a new face image;
    • Extract the facial features of the largest face;
    • Faces that are not completely inside the image will not be considered;
    • The input can be the image file path or his Data;
    • The onSuccess type is PerseAPIResponse.Enrollment.Face.Update struct;
    func update(
        _ filePath: String,
        onSuccess: @escaping (PerseAPIResponse.Enrollment.Face.Update) -> Void,
        onError: @escaping (String, String) -> Void
    )
    
    func update(
        _ data: Data,
        onSuccess: @escaping (PerseAPIResponse.Enrollment.Face.Update) -> Void,
        onError: @escaping (String, String) -> Void
    )
    

    enrollment.face.delete

    • Responsible for delete an enrollment;
    • This endpoint expects a "user token" in the url;
    • The onSuccess type is PerseAPIResponse.Enrollment.Face.Delete struct;
    func delete(
        onSuccess: @escaping (PerseAPIResponse.Enrollment.Face.Delete) -> Void,
        onError: @escaping (String, String) -> Void
    )
    
    func delete(
        onSuccess: @escaping (PerseAPIResponse.Enrollment.Face.Delete) -> Void,
        onError: @escaping (String, String) -> Void
    )
    

    enrollment.face.read

    • Responsible the complete list of the created "user tokens";
    • The onSuccess type is PerseAPIResponse.Enrollment.Face.Read struct;
    func read(
        onSuccess: @escaping (PerseAPIResponse.Enrollment.Face.Read) -> Void,
        onError: @escaping (String, String) -> Void
    )
    
    func read(
        onSuccess: @escaping (PerseAPIResponse.Enrollment.Face.Read) -> Void,
        onError: @escaping (String, String) -> Void
    )
    

    🐛 Bug Fix

    Fix terms "underexpose" to "underexposure" in the Demo project.

    ⚡️ Improvements

    Change the tests names to the camel case pattern for better reading. This changes has no impact in tests usage.

    opened by TeruyaHaroldo 0
  • Improve demo and tests

    Improve demo and tests

    ⚡️ Improvements

    • Add Development.xcconfig;
    • Add API_KEY and BASE_URL in the info.plist;
    • Add "base url" usage to init Perse in the example;
    • Add "base url" usage in the tests;
    opened by TeruyaHaroldo 0
  • Improve development mode

    Improve development mode

    ⚡️ Improvements

    • Add Development.xcconfig;
    • Add API_KEY and BASE_URL in the info.plist;
    • Add "base url" usage to init Perse in the example;
    • Add "base url" usage in the tests;
    opened by TeruyaHaroldo 0
  • Feature: update tests

    Feature: update tests

    ✨ New Feature

    • Add optional second parameter on init:
    public init(apiKey: String, baseUrl: String = "https://api.getperse.com/v0/")
    

    ⚡️ Improvements

    • Add code comments in the whole project;
    • Update and improve tests based on the previous release 0.1.1;
    opened by TeruyaHaroldo 0
Releases(0.3.1)
  • 0.3.1(Aug 31, 2021)

  • 0.3.0(Aug 30, 2021)

    💥 Breaking Changes

    Complete breaking changes in the Responses, Methods and your usages. Motivations:

    • Improve cohesion;
    • Patterning with the methods;
    • Prepare for future features, like the "vox"s;

    API Responses

    | Deprecated | New Usage | - | - | CompareResponse | PerseAPIResponse.Face.Compare | DetectResponse | PerseAPIResponse.Face.Detect | FaceResponse | PerseAPIResponse.Face.Face | MetricsResponse | PerseAPIResponse.Face.Metrics | LandmarksResponse | PerseAPIResponse.Face.Landmarks

    Methods

    | Deprecated | New | - | - | func detect( _ filePath: String, onSuccess: @escaping (DetectResponse) -> Void, onError: @escaping (String, String) -> Void)| func detect( _ filePath: String, onSuccess: @escaping (PerseAPIResponse.Face.Detect) -> Void, onError: @escaping (String, String) -> Void) | func detect( _ data: Data, onSuccess: @escaping (DetectResponse) -> Void, onError: @escaping (String, String) -> Void)| func detect( _ data: Data, onSuccess: @escaping (PerseAPIResponse.Face.Detect) -> Void, onError: @escaping (String, String) -> Void) | func compare( _ firstFilePath: String, _ secondFilePath: String, onSuccess: @escaping (CompareResponse) -> Void, onError: @escaping (String, String) -> Void)| func compare( _ firstFilePath: String, _ secondFilePath: String, onSuccess: @escaping (PerseAPIResponse.Face.Compare) -> Void, onError: @escaping (String, String) -> Void) | func compare( _ firstData: Data, _ secondData: Data, onSuccess: @escaping (CompareResponse) -> Void, onError: @escaping (String, String) -> Void)| func compare( _ firstData: Data, _ secondData: Data, onSuccess: @escaping (PerseAPIResponse.Face.Compare) -> Void, onError: @escaping (String, String) -> Void)

    ✨ New Feature

    Face Enrollment

    Enrolled faces are persisted and can be used for saving biometric facial features for future use. The enrollment's methods allow you to create, update, delete and get enrolled faces.

    face.enrollment.create

    • Responsible for creating new enrollment;
    • Extract the facial features of the largest face;
    • Faces that are not completely inside the image will not be considered;
    • The input can be the image file path or his Data;
    • The onSuccess type is PerseAPIResponse.Face.Enrollment.Create struct;
    func create(
        _ filePath: String,
        onSuccess: @escaping (PerseAPIResponse.Face.Enrollment.Create) -> Void,
        onError: @escaping (String, String) -> Void
    )
    
    func create(
        _ data: Data,
        onSuccess: @escaping (PerseAPIResponse.Face.Enrollment.Create) -> Void,
        onError: @escaping (String, String) -> Void
    )
    

    face.enrollment.update

    • Responsible for update a face enrollment with a new face image and user token;
    • Extract the facial features of the largest face;
    • Faces that are not completely inside the image will not be considered;
    • The input can be the image file path or his Data;
    • The onSuccess type is PerseAPIResponse.Face.Enrollment.Update struct;
    func update(
        _ filePath: String,
        _ userToken: String,
        onSuccess: @escaping (PerseAPIResponse.Face.Enrollment.Update) -> Void,
        onError: @escaping (String, String) -> Void
    )
    
    func update(
        _ data: Data,
        _ userToken: String,
        onSuccess: @escaping (PerseAPIResponse.Face.Enrollment.Update) -> Void,
        onError: @escaping (String, String) -> Void
    )
    

    face.enrollment.delete

    • Responsible for delete an enrollment;
    • This endpoint expects a "user token" in the url;
    • The onSuccess type is PerseAPIResponse.Face.Enrollment.Delete struct;
    func delete(
        onSuccess: @escaping (PerseAPIResponse.Face.Enrollment.Delete) -> Void,
        onError: @escaping (String, String) -> Void
    )
    

    face.enrollment.read

    • Responsible the complete list of the created "user tokens";
    • The onSuccess type is PerseAPIResponse.Face.Enrollment.Read struct;
    func read(
        onSuccess: @escaping (PerseAPIResponse.Face.Enrollment.Read) -> Void,
        onError: @escaping (String, String) -> Void
    )
    

    🐛 Bug Fix

    Fix terms "underexpose" to "underexposure" in the Demo project.

    ⚡️ Improvements

    Change the tests names to the camel case pattern for better reading. This changes has no impact in tests usage.

    Source code(tar.gz)
    Source code(zip)
  • 0.2.1(Aug 16, 2021)

    ⚡️ Improvements

    • Add Development.xcconfig;
    • Add API_KEY and BASE_URL in the info.plist;
    • Add "base url" usage to init PerseLite in the example;
    • Add "base url" usage in the tests;
    Source code(tar.gz)
    Source code(zip)
  • 0.2.0(Aug 5, 2021)

    ✨ New Feature

    • Add optional second parameter on init:
    public init(apiKey: String, baseUrl: String = "https://api.getperse.com/v0/")
    

    ⚡️ Improvements

    • Add code comments in the whole project;
    • Update and improve tests based on the previous release 0.1.1;
    Source code(tar.gz)
    Source code(zip)
  • 0.1.1(Jul 28, 2021)

    ♻️ Refactor

    Changes in the API Responses:

    • Change overexpose to overexposure;
    • Change underexpose to underexposure;
    • Change underexposeThreshold to undexposure;
    • Change overexposeThreshold to overexposure;
    Source code(tar.gz)
    Source code(zip)
  • 0.1.0(Jul 22, 2021)

  • 0.0.4(Jul 13, 2021)

  • 0.0.3(Jul 7, 2021)

    ⚡️ Improvements

    For the face.detect and face.compare onError closure:

    • add new parameter for raw text message;
    • default value is "";

    📝 Update Readme

    • Update face.detect and face.compare onError closure usage;
    • New section to run the tests: Running Tests;
    Source code(tar.gz)
    Source code(zip)
  • 0.0.2(Jul 5, 2021)

  • 0.0.1(Jun 29, 2021)

🌐 Makes Internet connectivity detection more robust by detecting Wi-Fi networks without Internet access.

Connectivity is a wrapper for Apple's Reachability providing a reliable measure of whether Internet connectivity is available where Reachability alone

Ross Butler 1.6k Dec 30, 2022
RSA public/private key encryption, private key signing and public key verification in Swift using the Swift Package Manager. Works on iOS, macOS, and Linux (work in progress).

BlueRSA Swift cross-platform RSA wrapper library for RSA encryption and signing. Works on supported Apple platforms (using Security framework). Linux

Kitura 122 Dec 16, 2022
RSA public/private key encryption, private key signing and public key verification in Swift using the Swift Package Manager. Works on iOS, macOS, and Linux (work in progress).

BlueRSA Swift cross-platform RSA wrapper library for RSA encryption and signing. Works on supported Apple platforms (using Security framework). Linux

Kitura 122 Dec 16, 2022
Very simple swift wrapper for Biometric Authentication Services (Touch ID) on iOS.

SimpleTouch Very simple swift wrapper for Biometric Authentication Services (Touch ID) on iOS. Sample Project There is a SimpleTouchDemo target define

Simple Machines 117 Nov 15, 2022
Framework for biometric authentication (via TouchID) in your application

Features Requirements Communication Installation Usage Intro Biometric authentication availability Feature enabled/disabled for biometric authenticati

Igor Vasilenko 29 Sep 16, 2022
null 1 Jan 26, 2022
Design and prototype customized UI, interaction, navigation, transition and animation for App Store ready Apps in Interface Builder with IBAnimatable.

Design and prototype customized UI, interaction, navigation, transition and animation for App Store ready Apps in Interface Builder with IBAnimatable.

IBAnimatable 8.6k Jan 2, 2023
Functional JSON Parser - Linux Ready

Functional JSON Parser Feature Linux Ready Type-safe JSON parsing Functional value transformation Easy to parse nested value Dependency free No define

Ryo Aoyama 117 Sep 9, 2022
App Design Kit is a collection of beautifully designed, ready-to-use, iOS app template screens.

App Design Kit is a collection of beautifully designed, ready-to-use, iOS app template screens. This well-structured, Swift coded, UI Kit bundle helps you to create your own application much faster than starting from scratch, using a simple design file.

Related Code 152 Dec 27, 2022
A collection of additional geometries ready for use in RealityKit 2

RealityGeometries By default, the only shapes available in RealityKit are a Sphere, Cuboid and Plane (with 4 vertices). Until iOS 15 the only clean wa

Max Cobb 49 Dec 19, 2022