44//
55// The MIT License (MIT)
66//
7- // Copyright (c) 2017 Studyplus inc.
7+ // Copyright (c) 2021 Studyplus inc.
88//
99// Permission is hereby granted, free of charge, to any person obtaining a copy
1010// of this software and associated documentation files (the "Software"), to deal
@@ -35,13 +35,6 @@ import UIKit
3535 */
3636final public class Studyplus {
3737
38- /**
39- Returns studyplus sdk version.
40-
41- StudyplusSDKのバージョンを返します
42- */
43- public static let SDKVersion : String = " 2.0.1 "
44-
4538 /**
4639 Returns the shared defaults object.
4740
@@ -68,8 +61,6 @@ final public class Studyplus {
6861 */
6962 public weak var delegate : StudyplusLoginDelegate ?
7063
71- private let accessTokenStoreKey : String = " accessToken "
72- private let usernameStoreKey : String = " username "
7364 private var serviceName : String {
7465 return " Studyplus_iOS_SDK_ \( consumerKey) "
7566 }
@@ -89,7 +80,7 @@ final public class Studyplus {
8980 ///
9081 /// Studyplusアプリとの連携を解除します。
9182 public func logout( ) {
92- deleteKey ( )
83+ StudyplusKeychain . deleteAll ( serviceName : serviceName )
9384 }
9485
9586 /// Returns to whether or not it is connected with Studyplus application.
@@ -107,22 +98,7 @@ final public class Studyplus {
10798 ///
10899 /// - Returns: accessToken
109100 public func accessToken( ) -> String ? {
110- let query = [
111- kSecClass: kSecClassGenericPassword,
112- kSecAttrService: serviceName,
113- kSecAttrSynchronizable: kSecAttrSynchronizableAny,
114- kSecMatchLimit: kSecMatchLimitOne,
115- kSecReturnData: true ,
116- kSecAttrAccount: accessTokenStoreKey
117- ] as CFDictionary
118-
119- var item : CFTypeRef ?
120- let status = SecItemCopyMatching ( query, & item)
121- guard status == errSecSuccess, let data = item as? Data else {
122- return nil
123- }
124-
125- return String ( data: data, encoding: . utf8)
101+ return StudyplusKeychain . accessToken ( serviceName: serviceName)
126102 }
127103
128104 /// Username of Studyplus account. It is set when the auth or login is successful.
@@ -131,22 +107,7 @@ final public class Studyplus {
131107 ///
132108 /// - Returns: username
133109 public func username( ) -> String ? {
134- let query = [
135- kSecClass: kSecClassGenericPassword,
136- kSecAttrService: serviceName,
137- kSecAttrSynchronizable: kSecAttrSynchronizableAny,
138- kSecMatchLimit: kSecMatchLimitOne,
139- kSecReturnData: true ,
140- kSecAttrAccount: usernameStoreKey
141- ] as CFDictionary
142-
143- var item : CFTypeRef ?
144- let status = SecItemCopyMatching ( query, & item)
145- guard status == errSecSuccess, let data = item as? Data else {
146- return nil
147- }
148-
149- return String ( data: data, encoding: . utf8)
110+ return StudyplusKeychain . username ( serviceName: serviceName)
150111 }
151112
152113 /// Studyplusに学習記録を投稿
@@ -156,7 +117,7 @@ final public class Studyplus {
156117 /// - completion: 投稿完了後のコールバック
157118 public func post( _ record: StudyplusRecord , completion: @escaping ( Result < Void , StudyplusPostError > ) -> Void ) {
158119 guard let accessToken = self . accessToken ( ) else {
159- completion ( . failure( . needLogin ) )
120+ completion ( . failure( . loginRequired ) )
160121 return
161122 }
162123
@@ -165,7 +126,21 @@ final public class Studyplus {
165126 return
166127 }
167128
168- StudyplusAPIRequest ( accessToken: accessToken) . post ( record, completion: completion)
129+ StudyplusAPI ( accessToken: accessToken) . post ( record, completion: { result in
130+ switch result {
131+ case . failure( let error) :
132+ switch error {
133+ case . loginRequired:
134+ // clear invalid access token
135+ StudyplusKeychain . deleteAll ( serviceName: self . serviceName)
136+ default :
137+ break
138+ }
139+ case . success: break
140+ }
141+
142+ completion ( result)
143+ } )
169144 }
170145
171146 /// It is responsible for processing custom URL scheme
@@ -187,7 +162,7 @@ final public class Studyplus {
187162 /// __[studyplus-{consumerKey}]__と正しいpathComponentsを持つことを確認してください。
188163 public func handle( _ url: URL ) -> Bool {
189164 guard isAcceptableURL ( url: url) else {
190- delegate? . studyplusDidFailToLogin ( error: . unknownUrl( url) )
165+ delegate? . studyplusLoginFail ( error: . unknownUrl( url) )
191166 return false
192167 }
193168
@@ -202,31 +177,20 @@ final public class Studyplus {
202177 . trimmingCharacters ( in: . whitespacesAndNewlines)
203178 . data ( using: . utf8, allowLossyConversion: false ) !
204179
205- deleteKey ( )
206- let statusAccessToken = SecItemAdd ( [
207- kSecClass: kSecClassGenericPassword,
208- kSecAttrService: serviceName,
209- kSecAttrSynchronizable: kSecAttrSynchronizableAny,
210- kSecAttrAccount: accessTokenStoreKey,
211- kSecValueData: accessToken
212- ] as CFDictionary , nil )
213- let statusUsername = SecItemAdd ( [
214- kSecClass: kSecClassGenericPassword,
215- kSecAttrService: serviceName,
216- kSecAttrSynchronizable: kSecAttrSynchronizableAny,
217- kSecAttrAccount: usernameStoreKey,
218- kSecValueData: username
219- ] as CFDictionary , nil )
220-
221- if statusAccessToken == noErr && statusUsername == noErr {
222- delegate? . studyplusDidSuccessToLogin ( )
223- } else {
224- delegate? . studyplusDidFailToLogin ( error: . keychainError)
180+ StudyplusKeychain . set ( serviceName: serviceName,
181+ accessToken: accessToken,
182+ username: username) { result in
183+ switch result {
184+ case . failure( let error) :
185+ self . delegate? . studyplusLoginFail ( error: error)
186+ case . success:
187+ self . delegate? . studyplusLoginSuccess ( )
188+ }
225189 }
226190 case " fail " :
227- delegate? . studyplusDidFailToLogin ( error: . fail )
191+ delegate? . studyplusLoginFail ( error: . applicationError )
228192 case " cancel " :
229- delegate? . studyplusDidFailToLogin ( error: . cancel)
193+ delegate? . studyplusLoginFail ( error: . cancel)
230194 default :
231195 return false
232196 }
@@ -323,12 +287,4 @@ final public class Studyplus {
323287
324288 return true
325289 }
326-
327- private func deleteKey( ) {
328- SecItemDelete ( [
329- kSecClass: kSecClassGenericPassword,
330- kSecAttrService: serviceName,
331- kSecAttrSynchronizable: kSecAttrSynchronizableAny
332- ] as CFDictionary )
333- }
334290}
0 commit comments