Coder Social home page Coder Social logo

devicetest's Introduction

Device.swiftpm

Device is a value-type replacement for device information on all supported platforms. The primary goals are to be easily maintainable by multiple individuals and employ a consistent API that can be used across platforms. APIs are present even on platforms that don't support all features so that availability checks do not have to be performed in external code and where irrelevant, code can simply unwrap optionals. Device definitions include clear initializers so anyone can add new devices and contribute to the project even on an iPad using Swift Playgrounds rather than requiring Xcode. No need to memorize mapping schema or use additional build tools.

This is actively maintained so if there is a feature request or change, we will strive to address within a week.

Features

  • Clearly labeled device identification
  • Device idiom detection
  • Simulator detection
  • Playground detection
  • Preview detection
  • Various device metrics (e.g. screen size, screen ratio, PPI)
  • Battery state
  • Battery level
  • Battery symbol
  • Battery color
  • BatteryView
  • Low Power Mode detection
  • Guided Access Session detection
  • Screen brightness
  • Display Zoom detection
  • Detect available sensors (Touch ID, Face ID, Optic ID)
  • Detect available disk space
  • Apple Pencil support detection
  • Images and support links

Requirements

  • iOS 15.2+ (minimum required for Swift Playgrounds)
  • tvOS 14.0+
  • watchOS 6.0+
  • macOS 12.0+ (minimum for lowPowerMode)
  • macCatalyst 14.0+
  • visionOS 1.0+

Known Issues

Built for macOS "Designed for iPad" does not return expected device results. Xcode previews do not work when the preview device is set to "My Mac (Mac Catalyst)". Custom Symbols likely won't work in macOS < 13.

Installation

Install by adding this as a package dependency to your code. This can be done in Xcode or Swift Playgrounds!

Swift Package Manager

Swift 5

dependencies: [
    .package(url: "https://github.com/kudit/Device.git", from: "2.0.0"),
    /// ...
]

You can try these examples in a Swift Playground by adding package: https://github.com/kudit/Device

Usage

First make sure to import the framework:

import Device

Here are some usage examples.

Get the device You're Running On

let device = Device.current

print(device) // prints, for example, "iPhone 6 Plus"

if device.has(.force3dTouch) {
    // do something that needs force-touch.
} else {
    // fallback for devices that do not support this.
}

if device.is(.plus) || device.is(.max) {
    // do something only available for "Plus" model devices.
}

if device.has(.battery) && device.has(.lidar) && device.has(.headphoneJack) {
    // do something only if there is a battery, lidar, and a headphoneJack
}

Get the full list of flags that can be queried for under the enum Capability in Hardware.swift.

Get the device idiom

let device = Device.current
if device.idiom == .pad {
  // iPad
} else if device.idiom == .phone {
  // iPhone
} else if device.idiom == .vision {
  // Apple Vision device
}

Check if running in a Simulator

if Device.current.isSimulator {
  // Running on one of the simulators
  // Skip doing something irrelevant for Simulator
} 

Check if running in a Preview

if Device.current.isPreview {
  // Running in an XCode #Preview
} 

Check if running in a Playground

if Device.current.isPlayground {
  // Running in an XCode #Preview
} 

Check if running on a physical device

if Device.current.isRealDevice {
  // Running on physical hardware and not a simulator
} 

Get the Current Battery State

Note:

When getting the current battery state, battery monitoring enabled will be temporarily set to true and then restored to whatever it was beforehand, so no need to manage monitoring separately. If you need to be notified when the battery state or level changes, you can add a monitor that will call your code whenever the level changes. However, typically this can just be dropped in as the DeviceBattery is an ObservableObject.

if let battery = Device.current.battery {
    // do things that need the battery
    if battery.currentState == .full || (battery.currentState == .charging && battery.currentLevel >= 75) {
        print("Your battery is happy! ๐Ÿ˜Š")
    }
    
    // get the current battery level
    if battery.currentLevel >= 50 {
        install_iOS()
    } else {
        showLowBatteryWarning()
    }

    if battery.lowPowerMode {
        print("Low Power mode is enabled! ๐Ÿ”‹")
    } else {
        print("Low Power mode is disabled! ๐Ÿ˜Š")
    }

    // add monitor to do something whenever battery level changes (like updating UI)
    battery.addMonitor {
        localBatteryLevel = battery.currentLevel
        localBatteryState = battery.currentState
    }
} else {
    // handle behaviour on devices without a battery
}

Get the Current Battery Level

if let level = Device.current.battery?.currentLevel, level >= 50 {
  install_iOS()
} else {
  showError()
}

Check if a Guided Access session is currently active

if Device.current.isGuidedAccessSessionActive {
  print("Guided Access session is currently active")
} else {
  print("No Guided Access session is currently active")
}

Get Screen Brightness

if Device.current.screenBrightness > 50 {
  print("Take care of your eyes!")
}

Get Available Disk Space

if Device.current.volumeAvailableCapacityForOpportunisticUsage ?? 0 > Int64(1_000_000) {
  // download that nice-to-have huge file
}

if Device.current.volumeAvailableCapacityForImportantUsage ?? 0 > Int64(1_000) {
  // download that file you really need
}

Source of Information

Some information has been sourced from the following: https://www.theiphonewiki.com/wiki/Models https://www.everymac.com https://github.com/devicekit/DeviceKit

Contributing

If you have the need for a specific feature that you want implemented or if you experienced a bug, please open an issue. If you extended the functionality of Device yourself and want others to use it too, please submit a pull request.

Contributors

The complete list of people who contributed to this project is available here. A big thanks to everyone who has contributed! ๐Ÿ™

devicetest's People

Contributors

kudit avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.