拥有一次性登录iPhone的正确方法



我试图创建一个应用程序,将需要在第一次加载登录。一旦用户成功登录,凭据将被存储在一个密钥链中,这样用户就不必继续登录了。

下面是我写的代码的快速模型;是使用AppDelegate正确的方式去处理哪个视图首先显示?

AppDelegate.h

#import <UIKit/UIKit.h>
#import "KeychainItemWrapper.h"
#import "ViewController.h"
#import "TestBViewController.h"
#import "User.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) TestBViewController *mainVC;  //  User see's after loggin in
@property (strong, nonatomic) User *user;
@property (strong, nonatomic) KeychainItemWrapper *keychainItem;
- (void)saveKeychainUsername:(NSString *)username andPassword:(NSString *)password;
- (void)loadLoggedInViewControllers;
@end

AppDelegate.m

#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"AppUniqueID" accessGroup:nil];
//    [self.keychainItem resetKeychainItem];
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
// Override point for customization after application launch.
NSString *password = [self.keychainItem objectForKey:(__bridge id)(kSecValueData)];
NSString *username = [self.keychainItem objectForKey:(__bridge id)(kSecAttrAccount)];
NSLog(@"username: %@, password: %@", username, password);
if ([username length] <= 0 || [password length] <= 0) {
    // Login VC
    ViewController *loginVC = (ViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];
    self.window.rootViewController = loginVC;
} else {
    [self loadLoggedInViewControllers];
}
return YES;
}
- (void)loadLoggedInViewControllers {
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
//  Attempt to login user
self.user = [[User alloc] init];
self.user.name = @"Bob";
self.user.hasAccess = YES;
//  If user is no longer valid (for whatever reason) remove his keychain information so we can save the new ones.
//  Valid user! Skip Login VC
self.mainVC = (TestBViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"Main"];
self.mainVC.user = self.user;
self.window.rootViewController = self.mainVC;
}

ViewController。m -认为这是我的LoginViewController

- (IBAction)storePassButtonTap:(id)sender {
if ([[username text] length] > 0 && [[password text] length] > 0) {
     AppDelegate *shareDelegate = [[UIApplication sharedApplication] delegate];
    [shareDelegate saveKeychainUsername:[username text] andPassword:[password text]];
    [shareDelegate loadLoggedInViewControllers];
} else {
    if ([[username text] length] <= 0) {
        //  Error message
    }
    if ([[password text] length] <= 0) {
        //  Error message
    }
}
}

我不建议这样做。我过去这样做过,我遇到过这样的问题:一旦我像这样改变appdelegate的rootviewcontroller属性,定向委托就不工作了。看起来它在iOS 6中被修复了,但我的理解是这是不寻常的,不应该这样做。

相反,有一个虚拟的视图控制器作为rootviewcontroller,并添加其他视图控制器作为其childViewController。你可以通过这种方式删除和添加任何视图控制器

我个人不会。我使用故事板,并将视图控制器设置为根。如果我需要这样做,我会让视图控制器留空(如果需要一分钟才能登录,可能会有一个活动指示器),在这里运行登录代码,然后移动到登录segue或主应用segue。

确保下一个屏幕隐藏后退按钮,这样用户就不能回到这个屏幕。

我喜欢在appDeleage中重新建立tcp连接并在进入后台时关闭它们。

最新更新