開源中國iOS用戶端學習——(十二)使用者登陸

來源:互聯網
上載者:User

上一篇部落格  開源中國iOS用戶端學習——(十一)AES加密 中提到將使用者名稱和密碼儲存到了本地沙箱之中,在從本地讀取使用者名稱和密碼,這是一個怎樣的過程?

-(void)saveUserNameAndPwd:(NSString *)userName andPwd:(NSString *)pwd{    NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];    [settings removeObjectForKey:@"UserName"];    [settings removeObjectForKey:@"Password"];    [settings setObject:userName forKey:@"UserName"];        pwd = [AESCrypt encrypt:pwd password:@"pwd"];        [settings setObject:pwd forKey:@"Password"];    [settings synchronize];}

上面的方法使用了NSUserDefaults類,它也是以字典形式實現對資料功能,並將這些資料儲存到本地應用程式沙箱之中,這種方法適合儲存較小的資料,例如使用者登陸配置資訊;這段代碼首先是定義了一個對象,進行初始化,移除索引值為UseName和Password的對象,防止資料混亂造成幹擾;然後就是重新設定索引值資訊; [settings synchronize];將索引值資訊同步道本地;

現在我們道沙箱中來看看這個使用者配置資訊

首先查看應用程式沙箱的路徑 ,使用


    NSString *homeDirectory = NSHomeDirectory();    NSLog(@"path:%@", homeDirectory);

列印結果:   path:/Users/DolBy/Library/Application Support/iPhone Simulator/5.1/Applications/55C49712-AD95-49E0-B3B9-694DC7D26E94

但是在我的DolBy使用者下並沒有Library這個目錄,這是因為系統隱藏了這些檔案目錄,現在需要顯示這些隱藏的檔案,開啟終端輸入 defaults write com.apple.finder AppleShowAllFiles -bool true  斷行符號,然後重啟Finder(不會?請看 查看iOS沙箱(SanBox)檔案),找到55C49712-AD95-49E0-B3B9-694DC7D26E94目錄下的Library/Preferences下的 net.oschina.iosapp.plist檔案,將其開啟





從中不難看出儲存在本地沙箱中使用者的一些基本資料,以及一些配置資訊,還記錄一些上次擷取資料時間等等;


登陸類在Setting目錄下的loginView類,先看看loginView.xib吧,介面比較簡陋,可能是缺美工吧;


從標頭檔中聲明部分

#import <UIKit/UIKit.h>#import "Tool.h"#import "ProfileBase.h"#import "MessageView.h"#import "Config.h"#import "MBProgressHUD.h"#import "MyThread.h"@interface LoginView : UIViewController<UIWebViewDelegate> {//    ASI類庫,擷取網路請求,進行登陸驗證    ASIFormDataRequest *request;}//接受使用者名稱輸入@property (strong, nonatomic) IBOutlet UITextField *txt_Name;//接受使用者屬於密碼@property (strong, nonatomic) IBOutlet UITextField *txt_Pwd;//開關按鈕,設定使用者是否要記住使用者名稱和密碼@property (strong, nonatomic) IBOutlet UISwitch *switch_Remember;//標記作用,用於記錄請求資料返回異常或錯誤時是否彈出一個警告@property BOOL isPopupByNotice;//webView,布局一個手機上的web網頁,顯示說明資訊,在這個web頁面有富文本使用,直接可以跳轉到url上@property (strong, nonatomic) IBOutlet UIWebView *webView;//登陸處理- (IBAction)click_Login:(id)sender;//取消兩個textFile的第一響應對象- (IBAction)textEnd:(id)sender;//取消鍵盤第一響應對象,點擊頁面推出鍵盤- (IBAction)backgrondTouch:(id)sender;//根據返回的資料儲存使用者名稱和使用者ID到本地- (void)analyseUserInfo:(NSString *)xml;@end

在實現檔案裡,粘貼上主要方法代碼

- (void)viewDidLoad{    [super viewDidLoad];    [Tool clearWebViewBackground:webView];    [self.webView setDelegate:self];        self.navigationItem.title = @"登入";    //決定是否顯示使用者名稱以及密碼    NSString *name = [Config Instance].getUserName;    NSString *pwd = [Config Instance].getPwd;//    如果使用者名稱和密碼存在,且不為空白,取出付給相應text    if (name && ![name isEqualToString:@""]) {        self.txt_Name.text = name;    }    if (pwd && ![pwd isEqualToString:@""]) {        self.txt_Pwd.text = pwd;    }        UIBarButtonItem *btnLogin = [[UIBarButtonItem alloc] initWithTitle:@"登入" style:UIBarButtonItemStyleBordered target:self action:@selector(click_Login:)];    self.navigationItem.rightBarButtonItem = btnLogin;    self.view.backgroundColor = [Tool getBackgroundColor];    self.webView.backgroundColor = [Tool getBackgroundColor];//    web控制項上資訊    NSString *html = @"<body style='background-color:#EBEBF3'>1, 您可以在 <a href='http://www.oschina.net'>http://www.oschina.net</a> 上免費註冊一個帳號用來登陸<p />2, 如果您的帳號是使用OpenID的方式註冊的,那麼建議您在網頁上為帳號設定密碼<p />3, 您可以點擊 <a href='http://www.oschina.net/question/12_52232'>這裡</a> 瞭解更多關於手機用戶端登入的問題</body>";    [self.webView loadHTMLString:html baseURL:nil];    self.webView.hidden = NO;} 

 在 [ToolclearWebViewBackground:webView];作用描述不好,直接看方法

+ (void)clearWebViewBackground:(UIWebView *)webView{    UIWebView *web = webView;    for (id v in web.subviews) {        if ([v isKindOfClass:[UIScrollView class]]) {            [v setBounces:NO];        }    }}

[v
setBounces:NO];  如果[v setBounces:YES]; 滾動上下滾動是出現空隙,不美觀,為NO  時就不會;

  

- (IBAction)click_Login:(id)sender {//    擷取使用者名稱和密碼    NSString *name = self.txt_Name.text;    NSString *pwd = self.txt_Pwd.text;//    使用ASI類程式庫要求登陸API,    request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:api_login_validate]];    [request setUseCookiePersistence:YES];    [request setPostValue:name forKey:@"username"];    [request setPostValue:pwd forKey:@"pwd"];    [request setPostValue:@"1" forKey:@"keep_login"];    [request setDelegate:self];//    失敗調用 requestFailed:    [request setDidFailSelector:@selector(requestFailed:)];//    成功調用 equestLogin:    [request setDidFinishSelector:@selector(requestLogin:)];//    開始請求    [request startAsynchronous];//    動畫提示使用者等待    request.hud = [[MBProgressHUD alloc] initWithView:self.view];    [Tool showHUD:@"正在登入" andView:self.view andHUD:request.hud];}

//  登陸失敗,隱藏顯示的動畫- (void)requestFailed:(ASIHTTPRequest *)request{    if (request.hud) {        [request.hud hide:YES];    }}


- (void)requestLogin:(ASIHTTPRequest *)request{    if (request.hud) {        [request.hud hide:YES];    }//    根據請求回來的xml進行解析資料,判斷是否登陸成功    [Tool getOSCNotice:request];//    將請求回來的資訊儲存在用戶端    [request setUseCookiePersistence:YES];    ApiError *error = [Tool getApiError:request];       if (error == nil) {        [Tool ToastNotification:request.responseString andView:self.view andLoading:NO andIsBottom:NO];    }    switch (error.errorCode) {                case 1:        {            [[Config Instance] saveCookie:YES];            if (isPopupByNotice == NO)             {                NSUserDefaults  *d= [NSUserDefaults standardUserDefaults];                [self.navigationController popViewControllerAnimated:YES];            }                        //處理是否記住使用者名稱或者密碼            if (self.switch_Remember.isOn)             {                [[Config Instance] saveUserNameAndPwd:self.txt_Name.text andPwd:self.txt_Pwd.text];            }            //否則需要清空使用者名稱於密碼            else            {                [[Config Instance] saveUserNameAndPwd:@"" andPwd:@""];            }            //返回的處理            if ([Config Instance].viewBeforeLogin)             {                if([[Config Instance].viewNameBeforeLogin isEqualToString:@"ProfileBase"])                {                    ProfileBase *_parent = (ProfileBase *)[Config Instance].viewBeforeLogin;                    _parent.isLoginJustNow = YES;                }            }                        //開始分析 uid 等等資訊            [self analyseUserInfo:request.responseString];            //分析是否需要退回            if (self.isPopupByNotice) {                [self.navigationController popViewControllerAnimated:YES];            }//            查看startNotice方法可知是一個定時器,每隔60s重新整理一下使用者資訊,是否有新的粉絲或幾條評論            [[MyThread Instance] startNotice];        }            break;        case 0:        case -1:        {//            返回 當error.errorCode =0 || 1的時候,顯示相關錯誤資訊            [Tool ToastNotification:[NSString stringWithFormat:@"錯誤 %@",error.errorMessage] andView:self.view andLoading:NO andIsBottom:NO];        }            break;    }}

ApiError 這個類看起來可能很迷惑人,它並不完全像字面意思那樣指的是錯誤的api資訊,而是根據請求返回來的數字進行判斷。如果error.errorCode = 1表示成功返回了使用者的資料,0,-1就可能由於伺服器網路等原因不能正確返回資料;

在ApiError *error = [Tool getApiError:request];中,列印 request.responseString如下,

<?xml version="1.0" encoding="UTF-8"?><oschina>  <result>    <errorCode>1</errorCode>    <errorMessage><![CDATA[登入成功]]></errorMessage>  </result>    <user>    <uid>112617</uid>    <location><![CDATA[河南 南陽]]></location>    <name><![CDATA[新風作浪]]></name>    <followers>1</followers>    <fans>0</fans>    <score>1</score>    <portrait>http://static.oschina.net/uploads/user/56/112617_100.jpg?t=1350377690000</portrait>  </user>  <notice><atmeCount>0</atmeCount><msgCount>0</msgCount><reviewCount>0</reviewCount><newFansCount>0</newFansCount></notice></oschina><!-- Generated by OsChina.NET (init:3[ms],page:3[ms],ip:61.163.231.198) -->

在 [self analyseUserInfo:request.responseString]方法中, 根據請求成功返回的xml,解析使用者名稱和UID,儲存使用者的UID

- (void)analyseUserInfo:(NSString *)xml{    @try {        TBXML *_xml = [[TBXML alloc] initWithXMLString:xml error:nil];        TBXMLElement *root = _xml.rootXMLElement;            TBXMLElement *user = [TBXML childElementNamed:@"user" parentElement:root];        TBXMLElement *uid = [TBXML childElementNamed:@"uid" parentElement:user];        //擷取uid        [[Config Instance] saveUID:[[TBXML textForElement:uid] intValue]];    }    @catch (NSException *exception) {        [NdUncaughtExceptionHandler TakeException:exception];    }    @finally {            }    }

在後面也看到[[MyThread Instance] startNotice];看看startNotice方法,是一個定時器,每隔60s重新整理一下使用者資訊,是否有新的粉絲或幾條評論;

-(void)startNotice{    if (isRunning) {        return;    }    else {        timer = [NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(timerUpdate) userInfo:nil repeats:YES];        isRunning = YES;    }}

-(void)timerUpdate{    NSString * url = [NSString stringWithFormat:@"%@?uid=%d",api_user_notice,[Config Instance].getUID];    [[AFOSCClient sharedClient]getPath:url parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {                [Tool getOSCNotice2:operation.responseString];            } failure:^(AFHTTPRequestOperation *operation, NSError *error) {            }];    }

url請求擷取的返回的資訊(已經登陸情開源中國社區網站的況下)

<oschina><notice><atmeCount>0</atmeCount><msgCount>0</msgCount><reviewCount>0</reviewCount><newFansCount>0</newFansCount></notice></oschina><!-- Generated by OsChina.NET (init:1[ms],page:1[ms],ip:61.163.231.198) -->


關於本文提到的幾個動畫過渡顯示效果請看

[Tool showHUD:@"正在登入" andView:self.view andHUD:request.hud];    MBProgressHUD特效

[Tool ToastNotification:[NSString stringWithFormat:@"錯誤 %@",error.errorMessage] andView:self.view andLoading:NO andIsBottom:NO];       GCDiscreetNotificationView提示視圖




原創部落格歡迎轉載分享,請註明出處 http://blog.csdn.net/duxinfeng2010

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.