Slide 1

Slide 1 text

4XJGU੡ϥΠϒϥϦͷ ྑ͍ॻ͖ํΛߟ͑Δ

Slide 2

Slide 2 text

kishikawa katsumi http://kishikawakatsumi.com Twitter @k_katsumi https://github.com/kishikawakatsumi http://kishikawakatsumi.hatenablog.com

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

let keychain = Keychain(service: "com.example.github-token") keychain["kishikawakatsumi"] = "01234567-89ab-...abcdef" let token = keychain["kishikawakatsumi"]

Slide 7

Slide 7 text

let keychain = Keychain(service: "com.example.github-token") keychain.set("01234567-...", key: “kishikawakatsumi") let token = keychain.get("kishikawakatsumi")

Slide 8

Slide 8 text

let keychain = Keychain(service: "com.example.github-token", accessGroup: “12ABCD3E4F.shared") keychain .accessibility(.AfterFirstUnlock) .synchronizable(true) .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")

Slide 9

Slide 9 text

let keychain = Keychain(service: "com.example.github-token") dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { keychain .accessibility(.WhenPasscodeSetThisDeviceOnly, authenticationPolicy: .UserPresence) .set("01234567-89ab-...", key: "kishikawakatsumi") }

Slide 10

Slide 10 text

0CKFDUJWF$ͱͷҧ͍

Slide 11

Slide 11 text

Objective-Cͱͷҧ͍ • σʔλܕ • Optional • Φʔόʔϩʔυ • σϑΥϧτҾ਺ • ϝιουνΣʔϯ • Τϥʔॲཧ

Slide 12

Slide 12 text

σʔλܕ

Slide 13

Slide 13 text

σʔλܕ • Class • Struct • Enum • Tuple • Function • Array • Dictionary • Set *New* • Optional

Slide 14

Slide 14 text

0QUJPOBM

Slide 15

Slide 15 text

public class func requestSharedWebCredential(completion: (credentials: [[String: Stri public class func requestSharedWebCredential(#domain: String, completion: (credential public class func requestSharedWebCredential(#domain: String, account: String, comple private class func requestSharedWebCredential(#domain: String?, account: String?, com

Slide 16

Slide 16 text

Φʔόʔϩʔυ

Slide 17

Slide 17 text

func set(value: String, key: String) -> NSError? func set(value: NSData, key: String) -> NSError?

Slide 18

Slide 18 text

func set(value: String, key: String) -> NSError? func set(value: NSData, key: String) -> NSError?

Slide 19

Slide 19 text

convenience init() convenience init(service: String) convenience init(accessGroup: String) convenience init(service: String, accessGroup: String) convenience init(server: String, protocolType: ProtocolType) convenience init(server: String, protocolType: ProtocolType, authenticationTy convenience init(server: NSURL, protocolType: ProtocolType) convenience init(server: NSURL, protocolType: ProtocolType, authenticationTyp

Slide 20

Slide 20 text

σϑΥϧτҾ਺

Slide 21

Slide 21 text

convenience init(service: String = "", accessGroup: String = "") convenience init(server: NSURL, protocolType: ProtocolType = .HTTPS, authenticationType: AuthenticationType = .HTMLForm)

Slide 22

Slide 22 text

ิ׬͕ΠϚΠν

Slide 23

Slide 23 text

convenience init(service: String = default, accessGroup: String = default) convenience init(server: NSURL, protocolType: KeychainAccess.ProtocolType = default, authenticationType: KeychainAccess.AuthenticationType = default) ࣮ࡍͷ஋΋Θ͔Βͳ͍

Slide 24

Slide 24 text

func setSharedPassword(password: String, account: String, completion: (error: NSError?) -> () = { e -> () in }) ྫ֎: Closure

Slide 25

Slide 25 text

ྫ֎: Closure keychain.setSharedPassword(password, account: username) keychain.setSharedPassword(password, account: username) { (error) -> () in println(error) }

Slide 26

Slide 26 text

໭Γ஋ͷΦʔόʔϩʔυ

Slide 27

Slide 27 text

func get(key: String) -> String? func get(key: String) -> NSData?

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

let keychain = Keychain() let data: NSData? = keychain.get("somedata")

Slide 30

Slide 30 text

func getString(key: String) -> String? func getData(key: String) -> NSData?

Slide 31

Slide 31 text

func get(key: String) -> (asString: String?, asData: NSData?)

Slide 32

Slide 32 text

let keychain = Keychain() let string = keychain.get("somestring").asString

Slide 33

Slide 33 text

ϝιουνΣʔϯ

Slide 34

Slide 34 text

keychain .accessibility(.AfterFirstUnlock) .synchronizable(true) .set("01234567-89ab-...", key: "kishikawakatsumi") keychain .accessibility(.WhenUnlocked) .set("01234567-89ab-...", key: "kishikawakatsumi")

Slide 35

Slide 35 text

keychain = Keychain(server: "https://github.com", protocolType: .HTTPS) .label("github.com (kishikawakatsumi)") .comment("github access token") .set("01234567-89ab-...", key: "kishikawakatsumi") keychain = Keychain(server: "https://github.com", protocolType: .HTTPS) .label("github.com (Hiro Hamada)") .comment("github access token") .set("01234567-89ab-...", key: "hirohamada")

Slide 36

Slide 36 text

Τϥʔॲཧ

Slide 37

Slide 37 text

- (NSString *)stringForKey:(NSString *)key error:(NSError * __autoreleasing *)error;

Slide 38

Slide 38 text

&JUIFSܕ

Slide 40

Slide 40 text

// // Result.swift // swiftz // // Created by Maxwell Swadling on 9/06/2014. // Copyright (c) 2014 Maxwell Swadling. All rights reserved. // import class Foundation.NSError import typealias Foundation.NSErrorPointer /// Result is similar to an Either, except specialized to have an Error case that can /// only contain an NSError. public enum Result { case Error(NSError) case Value(Box) public init(_ e: NSError?, _ v: V) { if let ex = e { self = Result.Error(ex) } else { self = Result.Value(Box(v)) } } /// Converts a Result to a more general Either type. public func toEither() -> Either { switch self { case let Error(e): return .Left(Box(e)) case let Value(v): return Either.Right(Box(v.value)) } }

Slide 41

Slide 41 text

public enum FailableOf { case Success(Value) case Failure(NSError) init(_ value: T?) { self = .Success(Value(value)) } init(_ error: NSError) { self = .Failure(error) } public var error: NSError? { switch self { case .Failure(let error): return error default: return nil } } public var value: T? { switch self { case .Success(let success): return success.value default: return nil } } }

Slide 42

Slide 42 text

let failable = keychain.getStringOrError("kishikawakatsumi") switch failable { case .Success: println("token: \(failable.value)") case .Failure: println("error: \(failable.error)") }

Slide 43

Slide 43 text

let failable = keychain.getStringOrError("kishikawakatsumi") if let error = failable.error { println("error: \(failable.error)") } else { println("token: \(failable.value)") }

Slide 44

Slide 44 text

let failable = keychain.getStringOrError("kishikawakatsumi") if failable.failed { println("error: \(failable.error)") } else { println("token: \(failable.value)") }

Slide 45

Slide 45 text

ඇಉظϝιουίʔϧόοΫ

Slide 46

Slide 46 text

keychain.getSharedPassword(username) { (password, error) -> () in if error != nil { } else { } }

Slide 47

Slide 47 text

ಉظϝιου໭Γ஋ͳ͠

Slide 48

Slide 48 text

let error = keychain.remove("kishikawakatsumi") if error != nil { println("error: \(error?.localizedDescription)") }

Slide 49

Slide 49 text

1MBZHSPVOE

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

'VODUJPOBMTUZMF"1*

Slide 52

Slide 52 text

IUUQTHJUIVCDPNUZQFMJGU4XJGUY IUUQTHJUIVCDPNUZQFMJGU4XJGU[