浏览代码

Save in keychain

Evgenii Neumerzhitckii 11 年之前
父节点
当前提交
214fdf328e

+ 5 - 0
keychain.xcodeproj/xcuserdata/evgenyneu.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   type = "1"
+   version = "2.0">
+</Bucket>

+ 3 - 2
keychain/Base.lproj/LaunchScreen.xib

@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6214" systemVersion="14A314h" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="6249" systemVersion="14C109" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES">
     <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6207"/>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="6243"/>
         <capability name="Constraints with non-1.0 multipliers" minToolsVersion="5.1"/>
     </dependencies>
     <objects>

+ 6 - 6
keychain/Base.lproj/Main.storyboard

@@ -18,15 +18,15 @@
                         <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                         <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                         <subviews>
-                            <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="Text to save in keychain" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="jnI-CL-JTS">
+                            <textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" text="Hello World!" borderStyle="roundedRect" placeholder="Text to save in keychain" minimumFontSize="17" translatesAutoresizingMaskIntoConstraints="NO" id="jnI-CL-JTS">
                                 <rect key="frame" x="16" y="40" width="568" height="30"/>
                                 <fontDescription key="fontDescription" type="system" pointSize="14"/>
                                 <textInputTraits key="textInputTraits"/>
                             </textField>
-                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="W0O-Md-qap">
-                                <rect key="frame" x="282" y="94" width="37" height="32"/>
+                            <button opaque="NO" contentMode="scaleToFill" misplaced="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="W0O-Md-qap">
+                                <rect key="frame" x="237" y="94" width="128" height="32"/>
                                 <fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
-                                <state key="normal" title="Save">
+                                <state key="normal" title="Save in Keychain">
                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
                                 </state>
                                 <connections>
@@ -34,9 +34,9 @@
                                 </connections>
                             </button>
                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LEC-fi-iIC">
-                                <rect key="frame" x="276" y="146" width="48" height="32"/>
+                                <rect key="frame" x="221" y="146" width="159" height="32"/>
                                 <fontDescription key="fontDescription" style="UICTFontTextStyleHeadline"/>
-                                <state key="normal" title="Delete">
+                                <state key="normal" title="Delete from Keychain">
                                     <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
                                 </state>
                                 <connections>

+ 26 - 7
keychain/TegKeychain.swift

@@ -9,13 +9,21 @@
 import UIKit
 import Security
 
-class Keychain {
+class TegKeychain {
   
-  class func save(key: String, data: NSData) -> Bool {
+  class func set(key: String, value: String) -> Bool {
+    if let currentData = value.dataUsingEncoding(NSUTF8StringEncoding) {
+      return set(key, value: currentData)
+    }
+    
+    return false
+  }
+  
+  class func set(key: String, value: NSData) -> Bool {
     let query = [
       kSecClass as String       : kSecClassGenericPassword as String,
       kSecAttrAccount as String : key,
-      kSecValueData as String   : data ]
+      kSecValueData as String   : value ]
     
     SecItemDelete(query as CFDictionaryRef)
     
@@ -24,7 +32,16 @@ class Keychain {
     return status == noErr
   }
   
-  class func load(key: String) -> NSData? {
+  class func getString(key: String) -> String? {
+    if let currentData = getData(key) {
+      return NSString(data: currentData, encoding: NSUTF8StringEncoding)
+    }
+    
+    return nil
+  }
+  
+  
+  class func getData(key: String) -> NSData? {
     let query = [
       kSecClass as String       : kSecClassGenericPassword,
       kSecAttrAccount as String : key,
@@ -36,10 +53,12 @@ class Keychain {
     let status: OSStatus = SecItemCopyMatching(query, &dataTypeRef)
     
     if status == noErr {
-      return (dataTypeRef!.takeRetainedValue() as NSData)
-    } else {
-      return nil
+      if let currentDataTypeRef = dataTypeRef {
+        return currentDataTypeRef.takeRetainedValue() as? NSData
+      }
     }
+    
+    return nil
   }
   
   class func delete(key: String) -> Bool {

+ 18 - 2
keychain/ViewController.swift

@@ -8,6 +8,8 @@
 
 import UIKit
 
+let TegKeychainDemo_keyName = "my key"
+
 class ViewController: UIViewController {
 
   @IBOutlet weak var textField: UITextField!
@@ -16,7 +18,10 @@ class ViewController: UIViewController {
   
   override func viewDidLoad() {
     super.viewDidLoad()
-    // Do any additional setup after loading the view, typically from a nib.
+    
+    updateValueLabel()
+    
+    
   }
 
   override func didReceiveMemoryWarning() {
@@ -25,10 +30,21 @@ class ViewController: UIViewController {
   }
 
   @IBAction func onSaveTapped(sender: AnyObject) {
-    
+    TegKeychain.set(TegKeychainDemo_keyName, value: textField.text)
+    updateValueLabel()
   }
 
   @IBAction func onDeleteTapped(sender: AnyObject) {
+    TegKeychain.delete(TegKeychainDemo_keyName)
+    updateValueLabel()
+  }
+  
+  private func updateValueLabel() {
+    if let currentValue = TegKeychain.getString(TegKeychainDemo_keyName) {
+      valueLabel.text = "In Keychain: \(currentValue)"
+    } else {
+      valueLabel.text = "no value in keychain"
+    }
   }
   
 }