4
4
//
5
5
// The MIT License (MIT)
6
6
//
7
- // Copyright (c) 2017 Studyplus inc.
7
+ // Copyright (c) 2021 Studyplus inc.
8
8
//
9
9
// Permission is hereby granted, free of charge, to any person obtaining a copy
10
10
// of this software and associated documentation files (the "Software"), to deal
@@ -35,13 +35,6 @@ import UIKit
35
35
*/
36
36
final public class Studyplus {
37
37
38
- /**
39
- Returns studyplus sdk version.
40
-
41
- StudyplusSDKのバージョンを返します
42
- */
43
- public static let SDKVersion : String = " 2.0.1 "
44
-
45
38
/**
46
39
Returns the shared defaults object.
47
40
@@ -68,8 +61,6 @@ final public class Studyplus {
68
61
*/
69
62
public weak var delegate : StudyplusLoginDelegate ?
70
63
71
- private let accessTokenStoreKey : String = " accessToken "
72
- private let usernameStoreKey : String = " username "
73
64
private var serviceName : String {
74
65
return " Studyplus_iOS_SDK_ \( consumerKey) "
75
66
}
@@ -89,7 +80,7 @@ final public class Studyplus {
89
80
///
90
81
/// Studyplusアプリとの連携を解除します。
91
82
public func logout( ) {
92
- deleteKey ( )
83
+ StudyplusKeychain . deleteAll ( serviceName : serviceName )
93
84
}
94
85
95
86
/// Returns to whether or not it is connected with Studyplus application.
@@ -107,22 +98,7 @@ final public class Studyplus {
107
98
///
108
99
/// - Returns: accessToken
109
100
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)
126
102
}
127
103
128
104
/// Username of Studyplus account. It is set when the auth or login is successful.
@@ -131,22 +107,7 @@ final public class Studyplus {
131
107
///
132
108
/// - Returns: username
133
109
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)
150
111
}
151
112
152
113
/// Studyplusに学習記録を投稿
@@ -156,7 +117,7 @@ final public class Studyplus {
156
117
/// - completion: 投稿完了後のコールバック
157
118
public func post( _ record: StudyplusRecord , completion: @escaping ( Result < Void , StudyplusPostError > ) -> Void ) {
158
119
guard let accessToken = self . accessToken ( ) else {
159
- completion ( . failure( . needLogin ) )
120
+ completion ( . failure( . loginRequired ) )
160
121
return
161
122
}
162
123
@@ -165,7 +126,21 @@ final public class Studyplus {
165
126
return
166
127
}
167
128
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
+ } )
169
144
}
170
145
171
146
/// It is responsible for processing custom URL scheme
@@ -187,7 +162,7 @@ final public class Studyplus {
187
162
/// __[studyplus-{consumerKey}]__と正しいpathComponentsを持つことを確認してください。
188
163
public func handle( _ url: URL ) -> Bool {
189
164
guard isAcceptableURL ( url: url) else {
190
- delegate? . studyplusDidFailToLogin ( error: . unknownUrl( url) )
165
+ delegate? . studyplusLoginFail ( error: . unknownUrl( url) )
191
166
return false
192
167
}
193
168
@@ -202,31 +177,20 @@ final public class Studyplus {
202
177
. trimmingCharacters ( in: . whitespacesAndNewlines)
203
178
. data ( using: . utf8, allowLossyConversion: false ) !
204
179
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
+ }
225
189
}
226
190
case " fail " :
227
- delegate? . studyplusDidFailToLogin ( error: . fail )
191
+ delegate? . studyplusLoginFail ( error: . applicationError )
228
192
case " cancel " :
229
- delegate? . studyplusDidFailToLogin ( error: . cancel)
193
+ delegate? . studyplusLoginFail ( error: . cancel)
230
194
default :
231
195
return false
232
196
}
@@ -323,12 +287,4 @@ final public class Studyplus {
323
287
324
288
return true
325
289
}
326
-
327
- private func deleteKey( ) {
328
- SecItemDelete ( [
329
- kSecClass: kSecClassGenericPassword,
330
- kSecAttrService: serviceName,
331
- kSecAttrSynchronizable: kSecAttrSynchronizableAny
332
- ] as CFDictionary )
333
- }
334
290
}
0 commit comments