Skip to content
This repository was archived by the owner on Nov 7, 2022. It is now read-only.
/ KeyClip Public archive

KeyClip is yet another Keychain library written in Swift.

License

Notifications You must be signed in to change notification settings

s-aska/KeyClip

Folders and files

NameName
Last commit message
Last commit date

Latest commit

20d18e5 · May 6, 2019
Apr 1, 2019
Apr 17, 2019
Apr 1, 2019
Sep 13, 2016
Apr 1, 2019
Apr 30, 2016
Apr 30, 2016
Sep 13, 2016
Mar 24, 2016
Jan 1, 2017
Nov 29, 2014
Apr 30, 2016
Sep 13, 2016
May 3, 2016
Apr 30, 2016

Repository files navigation

KeyClip

Build Status Carthage compatible

KeyClip is yet another Keychain library written in Swift.

Features

Usage

String

KeyClip.save("access_token", string: "********") // -> Bool

let token = KeyClip.load("access_token") as String?

KeyClip.delete("access_token") // Remove the data

KeyClip.clear() // Remove all the data

KeyClip.exists("access_token") // -> Bool

NSDictionary

Must be compatible to NSJSONSerialization.

Valid JSON elements are Dictionary, Array, String, Number, Boolean and null.

KeyClip.save("account", dictionary: ["name": "aska", "token": "******"]) // -> Bool

let dictionary = KeyClip.load("account") as NSDictionary?

NSData

KeyClip.save("data", data: NSData()) // -> Bool

let data = KeyClip.load("data") as NSData?

Your Class

KeyClip.save("account", dictionary: account.dictionaryValue)

let account = KeyClip.load("account") { (dictionary) -> Account in
    return Account(dictionary)
}

class Account {
    let name: String
    let password: String

    init(_ dictionary: NSDictionary) {
        self.name = dictionary["name"] as String
        self.password = dictionary["password"] as String
    }

    var dictionaryValue: [String: String] {
        return ["name": name, "password": password]
    }
}

Error Handling

Return value

let success = KeyClip.save("password", string: "********")
if !success {
    // Show Alert "Saving password to keychain failed"
}

Clojure

KeyClip.save("password", string: "********") { error in
    let status = error.code // OSStatus
    // Show Alert "Saving failed \(error.localizedDescription)(\(error.code))"
}

Debug print

KeyClip.printError(true)

Settings

let clip = KeyClip.Builder()

    // kSecAttrService
    .service(NSBundle.mainBundle().bundleIdentifier) // default

    // kSecAttrAccessible
    .accessible(kSecAttrAccessibleAfterFirstUnlock) // default

    // kSecAttrAccessGroup
    .accessGroup("XXXX23F3DC53.com.example.share") // default is nil

    .build()

Note to accessGroup

⚠️ iOS Simulator's keychain implementation does not support kSecAttrAccessGroup. (always "test")

⚠️ kSecAttrAccessGroup must match the App Identifier prefix. https://developer.apple.com/library/mac/documentation/Security/Reference/keychainservices/index.html

How to check the App Identifier

Entitlement.plist's keychain-access-groups or App Identifier.

KeyClip.defaultAccessGroup() // -> String (eg. XXXX23F3DC53.*)

Requirements

  • iOS 8.0+ / Mac OS X 10.10+
  • Xcode 8

Installation

Carthage

Add the following line to your Cartfile

github "s-aska/KeyClip"

CocoaPods

Add the following line to your Podfile

use_frameworks!
pod 'KeyClip'

License

KeyClip is released under the MIT license. See LICENSE for details.