一些机制总结
登录及自动登录机制研究
首次登录,调用登录接口
之后登录,判断是否存在token【未过期】,调用自动登录接口
后台,对token进行控制,token在本地的有效期为七天
若用户经常登录,后台负责在合适的时机【即将过期】,自动登录的时候,更新本地token,保证经常登录的用户身份不会过期
若身份过期,提示重新登录
手势密码应用场景及机制
在每次调用自动登录接口时候,如果有设置手势密码,则进入手势密码界面输入手势,与系统保存的手势密码相同则登录,多次输入,不对,直接进入登录界面,手动输入密码
【与QQ登录机制一样】
手势密码的原理
将九宫格中的九个圆形用1-9标记,设置最少连四个点,就是最少四位数
如果两次手势最后的数字都一样就可以进行本地化保存了
手势的保存可以通过系统单例保存,如果手势密码在服务器也保存,换手机也可以使用手势密码了
[[NSUserDefaults standardUserDefaults] objectForKey:key];
引导页机制
在应用启动时,判断一个未存储过的字段是否存在,不存在则进入引导界面,并设置为根视图,在引导视图滚动结束进入登录界面,并将登录界面设置为根视图,登录成功,进入主页面,在将主页面设置为根视图
极光机制
针对用户推送消息,针对手机客户端推送消息
在应用启动的时候,对极光进行一些配置
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
if([UINavigationBar conformsToProtocol:@protocol(UIAppearanceContainer)]) {
[UINavigationBar appearance].tintColor = [UIColor whiteColor];
// //保证导航栏颜色与设置的颜色值一样
// [UINavigationBar appearance].translucent = NO;
// //去掉导航栏与视图间的线
// [[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init] forBarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault];
// [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
[[UINavigationBar appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:18], NSForegroundColorAttributeName : [UIColor whiteColor]}];
[[UINavigationBar appearance] setBarTintColor:naviBarAndButtonColor];
}
//极光部分
[JPUSHService registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge |
UIRemoteNotificationTypeSound |
UIRemoteNotificationTypeAlert)
categories:nil];
NSString *str = [[NSBundle mainBundle] pathForResource:@"PushConfig" ofType:@"plist"];
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:str];
[JPUSHService setupWithOption:launchOptions appKey:[dic objectForKey:@"APP_KEY"] channel:[dic objectForKey:@"CHANNEL"] apsForProduction:[[dic objectForKey:@"APS_FOR_PRODUCTION"] boolValue]];
[JPUSHService crashLogON];
[JPUSHService registrationID];
return YES;
}
登录成功,设置别名
为安装了应用程序的用户,取个别名来标识。以后给该用户 Push 消息时,就可以用此别名来指定。
每个用户只能指定一个别名。
同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。
标签 tag
为安装了应用程序的用户,打上标签。其目的主要是方便开发者根据标签,来批量下发 Push 消息。
可为每个用户打多个标签。
-(void)loginSuccessed:(NSObject *)obj
{
/*设置极光推送的唯一标识,与群体标识*/
NSString *alias = [NSString stringWithFormat:@"NT_%@",g_loginUser.userId];
[JPUSHService setTags:nil alias:alias callbackSelector:@selector(tagsAliasCallback:tags:alias:) target:self];
//判断是否是通过别的app打开我们的应用
//登录(包括自动登录)成功,判断是否是通过外部应用登录(crm调用聊天)
if (_schemeUserDic) {
//判断登录身份[该数组中的第一个数据是本人工号,第二个是要找的人工号]
if ([g_loginUser.userName isEqualToString:_schemeUserDic[@"userName"]]) {
[self showMainUIWithIndex:0];
[g_notify postNotificationName:@"usernameArrNoti" object:nil userInfo:_schemeUserDic];
}else {
[self goLoginVC];
}
}else {
[self showMainUIWithIndex:1];
}
[NTDatabaseHelper refreshDatabase];
NTLastMessage *systemMsg = [[NTLastMessage alloc]init];
[systemMsg createNoticCenter];
}
退出取消用户的极光别名,保证退出后,不再收到有关用户的别名
[JPUSHService setTags:nil alias:@"" callbackSelector:@selector(tagsAliasCallback:tags:alias:) target:self];
版本更新机制
1.在应用启动的时候,调用配置文件接口,获取到我们应用所有需要的接口
2.调用成功后,开始调用[检查更新]接口
获取配置文件接口
#pragma mark -- getConfigInfo
-(void)configInfo
{
[NTServiceShell ConfigInfo:nil completion:^(NSDictionary *response) {
[g_config didReceive:response];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self checkUpdate : nil];
});
} withError:^(NSString *errorMsg) {
[HUDNotificationCenter showMessage:[errorMsg description] hideAfter:2.0f];
}];
}
检查更新接口
#pragma mark - checkUpdate
-(void)checkUpdate:(NSObject *)obj
{
NSDictionary *infoDic = [[NSBundle mainBundle] infoDictionary];
NSString *appVersion = [infoDic objectForKey:@"CFBundleShortVersionString"];
//请求服务器检查版本
NSDictionary *dic = @{@"os":@"ios", @"version":appVersion};
[NTServiceShell CheckUpdateInfo:dic completion:^(NSDictionary *response) {
NSString *ret = nil;
NSString *newNote = @"是否更新?";
NSString *titleStr = @"发现新版本";
if (response != nil) {
if (response[@"ret"]) {
ret = response[@"ret"];
newNote = response[@"newNote"];
titleStr = [NSString stringWithFormat:@"%@%@",titleStr,response[@"newVer"]];
}
}
if ([ret isEqualToString:@"0"]) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *avUpdate = [[UIAlertView alloc] initWithTitle:titleStr
message:newNote
delegate:self
cancelButtonTitle:@"立刻访问"
otherButtonTitles:@"下次再说", nil];
avUpdate.tag = 100;
[avUpdate show];
});
}
if ([ret isEqualToString:@"-1"]) {
dispatch_async(dispatch_get_main_queue(), ^{
UIAlertView *avUpdate = [[UIAlertView alloc] initWithTitle:titleStr
message:newNote
delegate:self
cancelButtonTitle:nil
otherButtonTitles:@"立刻访问", nil];
avUpdate.tag = 101;
[avUpdate show];
});
}
} withError:^(NSString *error) {
}];
}