Code Monkey home page Code Monkey logo

permission's Introduction

Travis Status CocoaPods compatible Carthage compatible

Permission exposes a unified API to request permissions on iOS.

UsageExampleInstallationLicense

Usage

Permission

Permission.swift PermissionStatus.swift

let permission: Permission = .contacts

print(permission.status) // .notDetermined

permission.request { status in
    switch status {
    case .authorized:    print("authorized")
    case .denied:        print("denied")
    case .disabled:      print("disabled")
    case .notDetermined: print("not determined")
    }
}
Supported Permissions

PermissionType.swift Types/

PermissionAlert

PermissionAlert.swift

Denied and disabled alerts

When you first request a permission, a system alert is presented to the user. If you request a permission that was denied/disabled, a PermissionAlert will be presented. You might want to change the default title, message, cancel and settings text:

let alert = permission.deniedAlert // or permission.disabledAlert

alert.title    = "Please allow access to your contacts"
alert.message  = nil
alert.cancel   = "Cancel"
alert.settings = "Settings"

Set permission.presentDeniedAlert = false or permission.presentDisabledAlert = false if you don't want to present these alerts.

Pre-permission alerts

In order not to burn your only chance of displaying the system alert, you can present a pre-permission alert. See this article for more informations.

permission.presentPrePermissionAlert = true

let alert = permission.prePermissionAlert

alert.title   = "Let Foo Access Photos?"
alert.message = "This lets you choose which photos you want to add to your Foo profile"
alert.cancel  = "Not now"
alert.confirm = "Give Access"

The system alert will only be presented if the user taps "Give Access".

PermissionSet

PermissionSet.swift

Use a PermissionSet to check the status of a group of Permission and to react when a permission is requested.

let permissionSet = PermissionSet(.contacts, .camera, .microphone, .photos)
permissionSet.delegate = self

print(permissionSet.status) // .notDetermined

// ...

func permissionSet(permissionSet: PermissionSet, willRequestPermission permission: Permission) {
    print("Will request \(permission)")
}

func permissionSet(permissionSet: PermissionSet, didRequestPermission permission: Permission) {
    switch permissionSet.status {
    case .authorized:    print("all the permissions are granted")
    case .denied:        print("at least one permission is denied")
    case .disabled:      print("at least one permission is disabled")
    case .notDetermined: print("at least one permission is not determined")
    }
}

PermissionButton

PermissionButton

A PermissionButton requests the permission when tapped and updates itself when its underlying permission status changes.

let button = PermissionButton(.photos)

PermissionButton is a subclass of UIButton. All the getters and setters of UIButton have their equivalent in PermissionButton.

button.setTitles([
    .authorized:    "Authorized",
    .denied:        "Denied",
    .disabled:      "Disabled",
    .notDetermined: "Not determined"
])

// button.setAttributedTitles
// button.setTitleColors
// button.setTitleShadowColors
// button.setImages
// button.setBackgroundImages
// etc.

Third-party libraries:

Example

class PermissionsViewController: UIViewController, PermissionSetDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        let label = UILabel()

        let contacts   = PermissionButton(.contacts)
        let camera     = PermissionButton(.camera)
        let microphone = PermissionButton(.microphone)
        let photos     = PermissionButton(.photos)

        contacts.setTitles([
            .notDetermined: "Contacts - NotDetermined"
            .authorized:    "Contacts - Authorized",
            .denied:        "Contacts - Denied"
        ])

        contacts.setTitleColors([
            .notDetermined: .black,
            .authorized:    .green,
            .denied:        .red
        ])

        // ...

        let permissionSet = PermissionSet(contacts, camera, microphone, photos)

        permissionSet.delegate = self

        label.text = String(describing: permissionSet.status)

        for subview in [label, contacts, camera, microphone, photos] {
            view.addSubview(subview)
        }
    }

    func permissionSet(permissionSet: PermissionSet, didRequestPermission permission: Permission) {
        label.text = String(permissionSet.status)
    }
}

Installation

Carthage

Carthage is a decentralized dependency manager that automates the process of adding frameworks to your Cocoa application.

You can install Carthage with Homebrew using the following command:

$ brew update
$ brew install carthage

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

github "delba/Permission"
Configuration

Due to Apple's new policy regarding permission access, binaries may be rejected due to a perceived attempt to access privacy-sensitive data without a usage key, and then further rejected for not actually requesting permissions.

As a workaround, you can provide custom build flags before building the dynamic framework to only compile with permissions you request. This is done by adding a configuration file named PermissionConfiguration.xcconfig to the root of your project. For convenience, you can use PermissionConfiguration.xcconfig in the Permission/ repo directory. Just comment out the permissions you want to use, and compile the framework.

To compile with only notifications and photos permissions:

PERMISSION_BLUETOOTH         = // PERMISSION_BLUETOOTH
PERMISSION_CAMERA            = PERMISSION_CAMERA
PERMISSION_CONTACTS          = // PERMISSION_CONTACTS
PERMISSION_EVENTS            = // PERMISSION_EVENTS
PERMISSION_LOCATION          = // PERMISSION_LOCATION
PERMISSION_MICROPHONE        = // PERMISSION_MICROPHONE
PERMISSION_MOTION            = // PERMISSION_MOTION
PERMISSION_NOTIFICATIONS     = PERMISSION_NOTIFICATIONS
PERMISSION_PHOTOS            = // PERMISSION_PHOTOS
PERMISSION_REMINDERS         = // PERMISSION_REMINDERS
PERMISSION_SPEECH_RECOGNIZER = // PERMISSION_SPEECH_RECOGNIZER
PERMISSION_MEDIA_LIBRARY     = // PERMISSION_MEDIA_LIBRARY

// Do not modify this line. Instead, remove comments above as needed to enable the categories your app uses.
PERMISSION_FLAGS= $(PERMISSION_BLUETOOTH) $(PERMISSION_CAMERA) $(PERMISSION_CONTACTS) $(PERMISSION_EVENTS) $(PERMISSION_LOCATION) $(PERMISSION_MICROPHONE) $(PERMISSION_MOTION) $(PERMISSION_NOTIFICATIONS) $(PERMISSION_PHOTOS) $(PERMISSION_REMINDERS) $(PERMISSION_SPEECH_RECOGNIZER) $(PERMISSION_MEDIA_LIBRARY)

SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) $(PERMISSION_FLAGS)

Cocoapods

CocoaPods is a dependency manager for Cocoa projects.

You can install it with the following command:

$ gem install cocoapods

To integrate Permission into your Xcode project using CocoaPods, specify it in your Podfile. Due to Apple's new policy regarding permission access you need to specifically define what kind of permissions you want to access using subspecs. For example if you want to access the Camera and the Notifications you define the following:

use_frameworks!

pod 'Permission/Camera'
pod 'Permission/Notifications'

Please see Permission.podspec for more information about which subspecs are available.

License

Copyright (c) 2015-2019 Damien (http://delba.io)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

permission's People

Contributors

albinekcom avatar alexeyxo avatar delba avatar dimdl avatar dimohamdy avatar dpassage avatar gustavosaume avatar hartbit avatar jakerockland avatar justinmakaila avatar kiokumicu avatar komitake avatar rsaarloos avatar sunshinejr avatar yannickl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

permission's Issues

Crash when changing permissions in iOS Settings app

If I set a closure as below, then open the iOS Settings app and change the permission there, the app will crash

permission.request { status in switch status { case .Authorized: print("authorized") case .Denied: print("denied") case .Disabled: print("disabled") case .NotDetermined: print("not determined") } }

Add complete example

I see the animated gif has a view asking for different permissions. Can that be made available to see how to add Permission API?

This app attempts to access privacy-sensitive data without

When submitting the app with Xcode 8 i get an error requesting me to add keys to the .plist. Not sure what the best course of action is here. I could work around it for now by deleting the files I didn't need as adding all the keys seems like a ground for rejection. M aybe there's an option to separate them into different modules?

Dear developer,

We have discovered one or more issues with your recent delivery for "app-name". To process your ? delivery, the following issues must be corrected:

This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSContactsUsageDescription key with a string value explaining to the user how the app uses this data.

This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSCalendarsUsageDescription key with a string value explaining to the user how the app uses this data.

This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSBluetoothPeripheralUsageDescription key with a string value explaining to the user how the app uses this data.

This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSMicrophoneUsageDescription key with a string value explaining to the user how the app uses this data.

This app attempts to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSMotionUsageDescription key with a string value explaining to the user how the app uses this data.

Once these issues have been corrected, you can then redeliver the corrected binary.

Regards,

The App Store team

Problems with .LocationAlways .LocationWhenInUse .Notifications

Using .LocationAlways I get:
WARNING: NSLocationAlwaysUsageDescription not found in Info.plist

Using .LocationWhenInUse I get:
WARNING: NSLocationWhenInUseUsageDescription not found in Info.plist

I am unsure how to .Notifications correctly?

Thanks very handy!

pod 'Permission/Camera' not found.

[!] Unable to satisfy the following requirements:

  • Permission/Camera required by Podfile

None of your spec sources contain a spec satisfying the dependency: Permission/Camera.

You have either:

  • out-of-date source repos which you can update with pod repo update.
  • mistyped the name or version.
  • not added the source repo that hosts the Podspec to your Podfile.

Note: as of CocoaPods 1.0, pod repo update does not happen on pod install by default.

Support acquire network permission

As iOS 10 add new permission of Wireless Data, it's better if Permission supports it.

The Wireless Data can be also accessed in Settings.app -> Cellular -> App using WLAN && Cellular

setTitles doesn't work

Class PermissionButton

I'm not sure what's going on, but in
func setTitles(_ titles: [PermissionStatus: String?], forState state: UIControlState = UIControlState()) the first line is
guard [.highlighted].contains(state) else { return }
which means, with the default value of state you've specified, this function will never run.
Same goes for a few other functions.

I tried to set up my buttons just like in readme and their title is always empty.

Pre-permission not working with .Bluetooth

I'm having an issue using the pre-permission with the .Bluetooth Permission type. Does this have something to do with this line in Permission.swift case .Bluetooth: requestBluetooth(self.callback)?

Still a bit new to Swift so not 100% sure what is wrong here.

Example project

HI Delba

Can you please post an example XCode project as the code you have given as example is not working.

Swift 3.0 release

Hey Damien! I don't know the current state of this library for Swift 3.0, but would it be possible to release alpha/beta version if it is not completed yet? Would love to update RxPermission to the newest standards 🐼 Cheers!

No option to update state of PermissionButton on applicationWillEnterForeground

I've got a PermissionButton in my app, and although I know it is specified that the app will crash when changing permissions, it doesn't seem to crash when changing the location services permission (whenInUse) in my tests – neither in the Simulator, nor on the Device (both on debug and release builds) using iOS 10.2.1.

So, I need to be able to trigger an update of the PermissionButtons state manually in my app like so:

func applicationWillEnterForeground(_ application: UIApplication) {
    // some code to get the permission button
    permissionButton.update() // calls the render() method internally
}

Support pre-alert

Would be great to support an option to show a pre-alert, when asking for a certain permission for the first time. This is in order not to waste the app's one-time option to present the system alert (as we know that later on, the user will need to put more work to re-enable it, by going to the Settings)

Modules

Could it be split in separated modules?
Because not it links all related Frameworks even I need only one.

Unable to access Photos permission

Podfile:

  • pod 'Permission/Photos'

Code:

  • let permission: Permission = .photos

Error:

  • Type 'Permission' has no member 'photos'

More info:

  • Xcode 8.3.1
  • Swift 3.1
  • iOS 10.3.2

Retain cycle with the PermissionSet delegate property

I've tried the new memory graph tool with Xcode 8 and your swift3 branch and there is a retain cycle with the delegate property of the PermissionSet object:

screen shot 2016-10-13 at 21 33 40

To avoid this issue, you should declare the delegate as weak. I'll make a PR.

Swift 3 - Escaping Callback

There are a lot of build time errors showing up on the swift-3.0 branch in regards to escaping Callbacks. If you could please get these fixed, that would help me out so much.

This is getting thrown in AddressBook.swift, Contacts.swift, Events.swift, MediaLibrary.swift, etc. It's getting thrown on the requestAddressBook(_ callback: Callback), requestContacts(_ callback: Callback), etc. - basically all of the individual request methods as well as the request and requestAuthorization methods in Permission.swift because they all require escaping closures.

Thanks!

Continuous permission status checking

I would love if there was an option of a continuous checks for specific permission. Like for example, I need to know if user changed the location permission so I can change the UI based off that. Do you think it could be implemented? Thanks! 🐼

Type 'Permission' has no member 'notifications'

I have the latest Permission lib 2.0.4 and am getting an error with this line of code:
let permission: Permission = .notifications(types: userNotificationTypes, categories: nil)
Type 'Permission' has no member 'notifications'

But I am not getting an error with this line:

let permission: Permission = .contacts
so it seems to be properly installed

My podfile looks like:

  pod 'Permission/Contacts'
  pod 'Permission/Notifications'
  pod 'Permission/Location'

permission.request() callback never Called

On :head, permission.request() is broken, completion is never called.
With version 1.1, it works as expected (completion is called)

Test: Put this in you app delegate didFinishLaunching :

        let permission: Permission = .LocationWhenInUse
        print(permission.status) // => "NotDetermined"

        permission.request { status in
            switch status {
            case .Authorized:    print("authorized")
            case .Denied:        print("denied")
            case .Disabled:      print("disabled")
            case .NotDetermined: print("not determined")
            }
        }

Only .NotDetermined is printed

Fix CFBundleIdentifier Swift 3

I tried running my program with Permission, and I manually edited the files to have the #54 issue be resolved. This resulted in it claiming that the CFBundleIdentifier wasn't in the Info.plist.

Notifications are considered Denied even if just one type is denied

When requesting Notification Permissions, it is fairly common to prompt user for all 3 types (badge, sound, alert), but consider notifications 'on' even if user turned off says sound or badge. Currently .status() will return .Denied/.NotDetermined in the second case.

Suggestions:

  1. Either change this policy, ie.
    var statusNotifications: PermissionStatus {
        guard case .Notifications(let settings) = type else { fatalError() }

        if let types = Application.currentUserNotificationSettings()?.types where types.rawValue > 0 {
            return .Authorized
        }

        return Defaults.requestedNotifications ? .Denied : .NotDetermined
    }
  1. Or let users decide, either by letting them specify a 'validationBlock', or by returning them the activated types. For example, one can add associated value to the PermissionStatus enum:
public enum PermissionStatus {
    case Authorized(UIUserNotificationType)
    case Denied
    case Disabled
    case NotDetermined
}

FYI, my wrapper workaround :

// Permissions created with all 3 types, but perm = Permission.Notifications(types:[.Badge, .Sound, .Alert], categories:nil)

 class func permissionStatus() -> PermissionStatus {
        // Permission considère qu'on est 'Denied' si on a pas 100% des types demandés; nous on considère que si on a au moins 1 c'est suffisant (ex: seul .Badge activé alors qu'on a demandé badge, Sound, Alert)
        let buggyStatus = perm.status
        if buggyStatus == .Denied {
            let acceptance = Int(UIApplication.sharedApplication().currentUserNotificationSettings()?.types.rawValue ?? 0
            return acceptance > 0 ? .Authorized : .Denied
        }
        return buggyStatus
    }

Location callback is executed before decision was made

The location callback is executed too early when the underlying LocationManager has not been initialized before.
When a CLLocationManager is first initialized it calls its locationManager(_:didChangeAuthorizationStatus:) delegate method regardless of any change (asynchronously as far as I can tell).

Example:

  1. Initial permission status is NotDetermined, Permission has not been used before
  2. Permission.request(Callback) is executed
  3. Callback has result NotDetermined before user even made a choice due to initialization of internal LocationManager. The actual decision is subsequently ignored.

I guess an easy fix would be to keep a reference to the current authorization status and compare it to the one given in locationManager(_:didChangeAuthorizationStatus:) to make sure that the value actually changed.

Notifications request callback not called

It seems like the implementation of notification request callbacks is missing:

// Notifications.swift
38:     func requestNotifications(callback: Callback) {
39:        // TODO: pass callback to finishedRequestingNotifications

On a second node, it seems like the only correct way to implement this behaviour is with a UIApplicationDelegate class, and not with an NSTimer like it's done on line 41.

app crash on launch(swift 3)

Hello
I use the branch swift-3.0 and xcode Version 8.0. I run the application on ios 10 and everything works.
But if I run the application on ios 9 , app crash on launch and I get error
dyld: Library not loaded: /System/Library/Frameworks/Speech.framework/Speech
Referenced from: /private/var/containers/Bundle/Application/XXXXXXXX/Frameworks/Permission.framework/Permission
Reason: image not found
Thanks

.motion permission error

Hi!
In podfile I set
pod 'Permission/Motion'

In controller

import UIKit
import Permission

class ViewController: UIViewController  {

  override func viewDidLoad() {
    super.viewDidLoad()

    
    let motionPermission: Permission = .motion
    print(motionPermission.status)

  }

}

On run I got error
libsystem_kernel.dylib__abort_with_payload:`

pod install error

I get error when install
Resolving dependencies of Podfile
[!] Unable to find a specification for Permission

Notification callback not called

Hello !

With Permission 1.4, Notification callback is not called. Neither the Permission callback, nor the UIApplicationDelegate one.

To reproduce, put this in your appDidFinishLaunching :

 let perm = Permission.Notifications(categories: nil)
        perm.request { (status) in
            print("push callback with status: \(status)")
        }

and this:

    func application(application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: NSError) {
        print("⛔️ Failed registering to push: \(error)")
    }

    func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
        print("📢 Token Push: : \(deviceToken)")
    }

PermissionButton: Disable when authorized

Currently when the user is authorized the PermissionButton still is clickable but doesn't do anything (which is fine) – but disabling it would make much more sense. We have a screen where users can see the status of the permission and so if they open the screen with permission authorized (location) then they see a clickable button with "Authorized" on it.

use PermissionConfiguration.xcconfig

How i can use PermissionConfiguration.xcconfig when i use pod i use alot of permissions i add it to root of my project the xcode can't see any permission files

Cancel Button

Hello i would like detect when the user push cancel button instead settings button in any alert... does the framework has this feature? I'm waiting for answer...

Need help configuring

conf

Should I copy paste that file into the root of my project then add the following?:

PERMISSION_ADDRESS_BOOK      = // PERMISSION_ADDRESS_BOOK
PERMISSION_BLUETOOTH         = // PERMISSION_BLUETOOTH
PERMISSION_CAMERA            = PERMISSION_CAMERA
PERMISSION_CONTACTS          = // PERMISSION_CONTACTS
PERMISSION_EVENTS            = // PERMISSION_EVENTS
PERMISSION_LOCATION          = // PERMISSION_LOCATION
PERMISSION_MICROPHONE        = // PERMISSION_MICROPHONE
PERMISSION_MOTION            = // PERMISSION_MOTION
PERMISSION_NOTIFICATIONS     = PERMISSION_NOTIFICATION
PERMISSION_PHOTOS            = // PERMISSION_PHOTOS
PERMISSION_REMINDERS         = // PERMISSION_REMINDERS
PERMISSION_SPEECH_RECOGNIZER = // PERMISSION_SPEECH_RECOGNIZER
PERMISSION_MEDIA_LIBRARY     = // PERMISSION_MEDIA_LIBRARY

// Do not modify this line. Instead, remove comments above as needed to enable the categories your app uses.
PERMISSION_FLAGS= $(PERMISSION_ADDRESS_BOOK) $(PERMISSION_BLUETOOTH) $(PERMISSION_CAMERA) $(PERMISSION_CONTACTS) $(PERMISSION_EVENTS) $(PERMISSION_LOCATION) $(PERMISSION_MICROPHONE) $(PERMISSION_MOTION) $(PERMISSION_NOTIFICATIONS) $(PERMISSION_PHOTOS) $(PERMISSION_REMINDERS) $(PERMISSION_SPEECH_RECOGNIZER) $(PERMISSION_MEDIA_LIBRARY)

SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) $(PERMISSION_FLAGS)

Right now that file looks like this:

CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Permission
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public"
OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS"
PODS_BUILD_DIR = $BUILD_DIR
PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES

Thanks in advance!

an error when running app

in file "Utitilies.swift"
screen shot 1395-01-27 at 17 49 54

I have an error when app want to compile for run, xcode get (expected declaration) And (expected initial value after =) error!

can anyone help?

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.