在我们平常中退出账号的时候,需要做些什么呢?简单的说清除个人相关的所有信息。
一、需要干些什么?
当然具体也是根据 App 产品的定位相关,以下我是从电商类的App这块分的:
- 删除个人信息(用户具体信息)
[[NSFileManager defaultManager] removeItemAtPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:kFileName] error:nil];
- 某些特殊的标识信息 (用户的某些标识)
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kChooseInterestTime];
- 删除网络缓存的信息 (用户在某些Web 页面留下的痕迹)
[[NSURLSession sharedSession] resetWithCompletionHandler:^{}];
- 第三方授权的信息 (用户在地三方平台登录的信息)
[ShareSDK cancelAuthorize:SSDKPlatformTypeFacebook];
[ShareSDK cancelAuthorize:SSDKPlatformTypeTwitter];
对于用户信息和标识这块,也可以笼统的放在一起,看具体项目需求和写法吧。
而再此特别留意下下面这个方法,因为感觉忘记这块的设置...
[[NSURLSession sharedSession] resetWithCompletionHandler:^{}];
- (void)resetWithCompletionHandler:(void (^)(void))completionHandler; /
Empty all cookies, cache and credential stores, removes disk files, issues -flushWithCompletionHandler:. Invokes completionHandler() on the delegate queue if not nil.
清空所有的 Cookies ,Cache 有时还是很有必要的!
二、探讨下如何写的更合理?
然而又有一问题来了,如果此处集中了太多要删除的东东,难道都写在这一块吗?
自己目前是写在一起的,但是貌似又可以优化,但如何优化呢?
反正是离不开低耦合高内聚的。
- 全部写在一起, 常规写法
[[NSFileManager defaultManager] removeItemAtPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:kFileName] error:nil];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:kChooseInterestTime];
[[NSURLSession sharedSession] resetWithCompletionHandler:^{}];
[ShareSDK cancelAuthorize:SSDKPlatformTypeFacebook];
[ShareSDK cancelAuthorize:SSDKPlatformTypeTwitter];
- 对每一个需要清理的地方都进行模块化后,统一用一个通知发送
[[NSNotificationCenter defaultCenter] postNotificationName:kLogoutNotification object:nil];
暂时是用了常规写法,但是用通知进行统一处理,让每一个模块自己清理呢?貌似是确实是方便了,但是用通知的话感觉还是有点不妥:
- 每一个地方增加了注册通知和移除通知,无形中增加了代码量和不确定的隐患 (甚至有很多通知都会无法移除的)
- 有些固定好的第三方,例如 ShareSDK, 是不好再改变的,此时就是不适用的。
- 通知发送的消息那个删除是无法控制顺序的。
- 建议对每一个需要清理的地方都进行模块化后, 用外露方法直接移除:
[AccountManager removeSaveInfo];
[TimeManager removeSaveInfo];
[TestManager removeSaveInfo];
[[NSURLSession sharedSession] resetWithCompletionHandler:^{}];
[ShareSDK cancelAuthorize:SSDKPlatformTypeFacebook];
能直接用的还是直接用的,无需再封装......
感觉这样相比用通知或者所有一大串直接写在一起还是好一点的,尽量模块化,当然也不能为了封装而封装。
同时,如果另有朋友有好的建议,欢迎提出,谢谢。
网友评论