iOS開源加密相簿Agony的實現(二)

來源:互聯網
上載者:User

標籤:

簡介

雖然目前市面上有一些不錯的加密相簿App,但不是內建廣告,就是對上傳的張數有所限制。本文介紹了一個加密相簿的製作過程,該加密相簿將包括多密碼(輸入不同的密碼即可訪問不同的空間,可掩人耳目)、WiFi傳圖、照片檔案加密等功能。目前項目和文章會同時前進,項目的原始碼可以在github上下載。
點擊前往GitHub

概述

上一篇文章主要介紹了賬戶儲存類與工具類的設計,這一篇將通過工具類,實現登陸與註冊的互動介面。

登入控制器與視圖設計自訂控制器視圖

為了分離視圖邏輯與商務邏輯,控制器視圖用一個自訂類去管理,在控制器的loadView方法中將自訂視圖指定為控制器視圖。
檔案結構如下。

指定自訂視圖為控制器視圖的方法如下。
由於要使用自訂視圖SGWelcomeView的一些API,因此需要將其引用,否則直接通過view擷取的還需要類型強轉才能使用。

@interface SGWelcomeViewController ()@property (nonatomic, weak) SGWelcomeView *welcomeView;@end@implementation SGWelcomeViewController- (void)loadView {    SGWelcomeView *view = [SGWelcomeView new];    self.view = view;    self.welcomeView = view;}
登入介面設計

登入介面如所示。

嘗試Touch ID的登入方式

如果裝置支援Touch ID,則會先嘗試Touch ID的驗證方式,如果驗證失敗則要求輸入密碼。
在登入控制器出現時,先清空已經登入的賬戶,並且嘗試Touch ID登入的實現如下。

- (void)viewDidAppear:(BOOL)animated {    [super viewDidAppear:animated];    [SGAccountManager  sharedManager].currentAccount = nil;    [self handleTouchIDLogin];}- (void)handleTouchIDLogin {    LAContext *context = [LAContext new];    if([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]) {        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Agony need your Touch ID to login" reply:^(BOOL success, NSError * _Nullable error) {            if (success) {                SGAccount *account = [[SGAccountManager sharedManager] getTouchIDAccount];                [self loginWithAccount:account];            } else {                [self handleCommonLogin];            }        }];    } else {        [self handleCommonLogin];    }}

Touch ID的驗證通過LAContext實現,成功則通過Touch ID綁定的密碼登入,失敗則進行密碼登入(調用handleCommonLogin方法)。
需要注意Touch ID的回調是在子線程,如果涉及到UI操作,不要忘記放到主線程操作。

密碼登入方式

密碼登入通過調用handleCommonLogin方法實現,該方法指定登入view的block回調,並且使得密碼輸入框成為第一響應者。

- (void)handleCommonLogin {    WS();  // 定義weakSelf的宏    [self.welcomeView setWelcomeHandler:^(SGAccount *account) {        [weakSelf loginWithAccount:account];    }];}

當使用者輸入完密碼按下Return鍵,會回調該block來執行登入。注意到Touch ID和密碼登入最後執行的方法都是loginWithAccount:方法,該方法的實現如下。

- (void)loginWithAccount:(SGAccount *)account {    dispatch_async(dispatch_get_main_queue(), ^{        if (!account) {            [MBProgressHUD showError:@"Password Error"];            return;        }        [SGAccountManager sharedManager].currentAccount = account;        AppDelegate *app = [UIApplication sharedApplication].delegate;        app.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[SGHomeViewController new]];    });}

之所以使用GCD,是因為在Touch ID的回調裡也進行了該方法的調用,而Touch ID的回調是子線程。
在登入驗證時如果密碼驗證成功返回賬戶對象,失敗則返回空,因此通過賬戶是否為空白可以判斷是否登入完成。如果登入成功則儲存登陸成功的對象到賬戶管理單例中,並且切換根控制器為相簿首頁的控制器。

登入視圖的細節

對於螢幕尺寸較小的手機,鍵盤可能會遮擋輸入框,應該監聽鍵盤的顯示與隱藏事件,判斷鍵盤是否遮擋了輸入框,從而決定是否要向上行動裝置檢視。
登入介面包含了表徵圖、文本和輸入框,三者通過約束來定位在父視圖SGWelcomeView上,在位移時,為了方便起見,將整個父視圖向上平移,平移通過transform來實現,具體如下。

註冊與登出通知

由於視圖通過代碼架構,因此一定會調用initWithFrame:方法,在該方法中註冊通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardShow:) name:UIKeyboardWillShowNotification object:nil];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardHide:) name:UIKeyboardWillHideNotification object:nil];

在dealloc方法中登出通知。

- (void)dealloc {    [[NSNotificationCenter defaultCenter] removeObserver:self];}
處理鍵盤的顯示

由於監聽的是鍵盤即將動作的事件,因此鍵盤的最終位置應通過endFrame來拿到。判斷鍵盤是否遮擋輸入框的關鍵是看鍵盤的topY是否小於輸入框的bottomY,如果topY小於bottomY,則應該將整個視圖向上平移bottomY-topY,為了美觀,應該多平移一段間距,deltaY就是應該平移的距離,向上為負值。
條件判斷中除去delta還判斷了視圖是否還實施了變換,這是因為變換是針對整個父視圖的,而計算時擷取的輸入框座標是相對父視圖的,因此父視圖的變換不會影響到輸入框座標,鍵盤顯示可能被多次調用,為了保證不會重複的將視圖向上平移,需要判斷是否已經進行過變換了。

- (void)keyboardShow:(NSNotification *)nof {    CGRect endFrame = [nof.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];    CGFloat endY = endFrame.origin.y;    CGFloat deltaY = endY - CGRectGetMaxY(self.pwdFiled.frame) - 10;    if (deltaY < 0 && CGAffineTransformEqualToTransform(self.transform, CGAffineTransformIdentity)) {        self.transform = CGAffineTransformTranslate(self.transform, 0, deltaY);    }}
處理鍵盤的隱藏

鍵盤隱藏時只需要複原變換即可。

- (void)keyboardHide:(NSNotification *)nof {    self.transform = CGAffineTransformIdentity;}

如果想要讓鍵盤的出現、消失與視圖位移同步移動,可以通過通知對象拿到鍵盤移動的duration,然後將變換寫在UIView的動畫block中。

註冊控制器與視圖設計

註冊控制器的設計與登入控制器設計一致,檔案結構如下。

介面如下。

註冊頁面與登入頁面一樣,也是通過block回調到控制器,來處理註冊,因為每個密碼對應一個儲存空間,註冊時要求密碼不能與已有賬戶重複。當輸入完確認密碼並按下鍵盤上的Return鍵後通過block回調,傳回密碼與確認密碼,控制器處理的實現如下。

- (void)handleRegisterWithPassword:(NSString *)password confirm:(NSString *)confirm {    // 密碼與確認密碼必須一致,並且不為空白    if (![password isEqualToString:confirm]) {        [MBProgressHUD showError:@"Passwords Do Not Match"];        return;    } else if (!password.length) {        [MBProgressHUD showError:@"Password Cannot be Empty"];        return;    }    // 使用賬戶管理對象來處理註冊的商務邏輯    SGAccountManager *mgr = [SGAccountManager sharedManager];    NSString *errorMessage = nil;    [mgr registerAccountWithPassword:password errorMessage:&errorMessage];    if (errorMessage == nil) {        // 註冊成功則回到登入頁面        [MBProgressHUD showSuccess:@"Register Succeeded"];        [self.navigationController popViewControllerAnimated:YES];    } else {        [MBProgressHUD showError:errorMessage];    }}
總結

本文主要介紹了登入與註冊介面的實現細節,歡迎關注項目後續,項目的在本文的開頭可以找到。

iOS開源加密相簿Agony的實現(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.