大致信息存储分为三种方式
我通常是存在AppDelegate,存在这里的好处是,用户数据的生命周期与app运行周期相同,如果app关闭或者闪退,下次开启app就是未登陆状态,以下是部分关键代码
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//AppDelegate.h文件
#import "User.h"
@interface
AppDelegate
: UIResponder
@property
(
strong
,
nonatomic
)
User
*user
;
+
(
AppDelegate
*
)
APP
;
@end
//AppDelegate.m文件 这里只是增加了个方便的类方法而
@implementation
AppDelegate
+
(
AppDelegate
*
)
APP
{
return
(
AppDelegate
*
)
[
[
UIApplication
sharedApplication
]
delegate
]
;
}
-
(
BOOL
)
application
:
(
UIApplication
*
)
application
didFinishLaunchingWithOptions
:
(
NSDictionary
*
)
launchOptions
|
User 实体
1
2
3
4
5
6
7
8
9
10
11
12
|
#import "BaseModel.h"
@interface
User
: BaseModel
@property
(
strong
,
nonatomic
)
NSString
*userID
;
@property
(
strong
,
nonatomic
)
NSString
*userName
;
@property
(
strong
,
nonatomic
)
NSString
*passdword
;
@property
(
strong
,
nonatomic
)
NSString
*cellPhone
;
+
(
NSURLSessionDataTask
*
)
login
:
(
NSDictionary
*
)
paramDic
Success
:
(
void
(
^
)
(
NSDictionary
*result
)
)
success
Failure
:
(
void
(
^
)
(
NSError
*error
)
)
failue
;
@end
|
在RootViewController(一般都是app的第一个界面即可)中判断是否存在user对象,如果存在即登陆,可以获取user实体中的各种信息,如果不存在即未登陆,弹出登录框,登陆后赋值user对象
1
2
3
4
5
6
7
8
9
10
|
-
(
void
)
viewDidAppear
:
(
BOOL
)
animated
{
[
super
viewDidAppear
:animated
]
;
if
(
!
[
AppDelegate
APP
]
.
user
)
{
LoginViewController
*login
=
[
[
LoginViewController
alloc
]
init
]
;
[
self
presentViewController
:login
animated
:YES
completion
:nil
]
;
}
}
|
登陆界面,登陆成功赋值user对象
1
2
3
4
5
6
7
8
9
10
11
12
13
|
-
(
IBAction
)
loginTouched
:
(
id
)
sender
{
//网络请求...
[
User
login
:
@
{
@"password"
:self
.
password
.
text
,
@"cellphone"
:self
.
username
.
text
}
Success
:
^
(
NSDictionary
*result
)
{
[
AppDelegate
APP
]
.
user
=
[
[
User
alloc
]
init
]
;
[
AppDelegate
APP
]
.
user
.
cellphone
=
self
.
username
.
text
;
[
AppDelegate
APP
]
.
user
.
password
=
self
.
password
.
text
;
//如果登陆后反回的result是需要存的数据,确保User model中有对应的结构,之后利用JsonModel(https://github.com/icanzilb/JSONModel)等框架直接进行转换
比如
[
AppDelegate
APP
]
.
user
=
[
[
User
alloc
]
initWithDictionary
:result
error
:nil
]
;
}
Failure
:
^
(
NSError
*error
)
{
}
]
;
}
|
这样就可以在任意类中[AppDelegate APP].user.cellphone 取类似数据了
(注:NSUserDefaults存储的数据其实就是存储在了一个.plist文件中,任何人把设备连接电脑后都可以找到对应文件看见存储的原文内容,除非你存的时候加了密,所以NSUserDefaults之用来存储不是很重要的数据,比如用户名等)
接着第一种方法登陆的过程,如果我想登陆一次后记录用户的用户名,并且其他数据还是随着app生命周期,那么只需写入NSUserDefaults即可,记得不要忘了[userDefaults synchronize]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
-
(
IBAction
)
loginTouched
:
(
id
)
sender
{
//网络请求...
[
User
login
:
@
{
@"password"
:self
.
password
.
text
,
@"cellphone"
:self
.
username
.
text
}
Success
:
^
(
NSDictionary
*result
)
{
[
AppDelegate
APP
]
.
user
=
[
[
User
alloc
]
init
]
;
[
AppDelegate
APP
]
.
user
.
cellphone
=
self
.
username
.
text
;
[
AppDelegate
APP
]
.
user
.
password
=
self
.
password
.
text
;
//如果登陆后反回的result是需要存的数据,确保User model中有对应的结构,之后利用JsonModel(https://github.com/icanzilb/JSONModel)等框架直接进行转换
比如
[
AppDelegate
APP
]
.
user
=
[
[
User
alloc
]
initWithDictionary
:result
error
:nil
]
;
NSUserDefaults
*userDefaults
=
[
NSUserDefaults
standardUserDefaults
]
;
[
userDefaults
setObject
:self
.
username
.
text
forKey
:
@"KEY_USER_NAME"
]
;
[
userDefaults
synchronize
]
;
}
Failure
:
^
(
NSError
*error
)
{
}
]
;
}
|
关闭app后,从新进入app,想读取这个数据只需要任意类中,即可获得存下的数据
1
2
|
NSUserDefaults
*userDefaults
=
[
NSUserDefaults
standardUserDefaults
]
;
NSString
*username
=
[
userDefaults
objectForKey
:
@"KEY_USER_NAME"
]
;
|
如果想存储用户的密码,当然可以存在NSUserDefaults中,但是直接存到 plist 里显然是不负责任的
用ios的 Security.framework 就可以实现钥匙串的访问、读写
这里我借助第三方开源库SSKeychain(https://github.com/soffes/sskeychain)与NSUserDefaults配合使用进行示例,如果想用原生方法自行学习
以下是User实体新增的三个类方法 用于操作信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//清除数据
+
(
void
)
logoutAccount
{
NSUserDefaults
*userDefaults
=
[
NSUserDefaults
standardUserDefaults
]
;
NSString
*username
=
[
userDefaults
objectForKey
:
@"KEY_USER_NAME"
]
;
[
SSKeychain
deletePasswordForService
:
@"KEY_KEYCHAIN_SERVICE"
account
:username
]
;
[
userDefaults
removeObjectForKey
:
@"KEY_USER_NAME"
]
;
[
userDefaults
synchronize
]
;
}
//获取 任意位置调用
+
(
void
)
getAccount
:
(
void
(
^
)
(
NSString
*username
,
NSString
*password
)
)
block
{
NSUserDefaults
*userDefaults
=
[
NSUserDefaults
standardUserDefaults
]
;
NSString
*username
=
[
userDefaults
objectForKey
:
@"KEY_USER_NAME"
]
;
NSString
*password
=
[
SSKeychain
passwordForService
:
@"KEY_KEYCHAIN_SERVICE"
account
:username
]
;
block
(
username
?
:
@""
,
password
?
:
@""
)
;
}
//保存方法 登陆成功后调用
+
(
void
)
saveAccount
:
(
NSString
*
)
name
andPassword
:
(
NSString
*
)
password
{
NSUserDefaults
*userDefaults
=
[
NSUserDefaults
standardUserDefaults
]
;
[
userDefaults
setObject
:name
forKey
:
@"KEY_USER_NAME"
]
;
[
userDefaults
synchronize
]
;
[
SSKeychain
setPassword
:password
forService
:
@"KEY_KEYCHAIN_SERVICE"
account
:name
]
;
}
|
还是登陆的例子
1
2
3
4
5
6
7
8
9
10
11
|
-
(
IBAction
)
loginTouched
:
(
id
)
sender
{
//网络请求...
[
User
login
:
@
{
@"password"
:self
.
password
.
text
,
@"cellphone"
:self
.
username
.
text
}
Success
:
^
(
NSDictionary
*result
)
{
[
User
saveAccount
:self
.
username
.
text
andPassword
:self
.
password
.
text
]
;
}
Failure
:
^
(
NSError
*error
)
{
}
]
;
}
|