基于生活物聯(lián)網(wǎng)平臺的賬號及用戶SDK,您可以自定義自有品牌App的開放賬號OA(Open Account)模塊相關(guān)的用戶界面UI(User Interface),主要包括登錄頁面、注冊頁面、密碼重置頁面等。
前提條件
定制項
iOS App的OA UI定制項如下。
App界面圖示 | 可定制內(nèi)容 |
---|---|
修改原生元素
|
|
新增元素
|
顯示手機區(qū)號
登錄和注冊頁面中默認不顯示手機區(qū)號,如果您需要顯示手機區(qū)號,如+86,請根據(jù)以下步驟來操作。
修改登錄和注冊按鈕的顏色
App的登錄和注冊按鈕默認為淺灰色,如果您需要修改App登錄和注冊按鈕的顏色,請根據(jù)以下步驟來操作。
修改提示信息樣式
當OA模塊發(fā)生業(yè)務(wù)錯誤(如密碼錯誤)時,App會彈出相關(guān)提示信息的對話框。如果您需要修改該提示對話框的樣式,可以通過設(shè)置回調(diào)來實現(xiàn)。
[ALBBService(ALBBOpenAccountUIService) setHandleBizErrorCallback:^(NSString *errMsg) {
UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:errMsg preferredStyle:UIAlertControllerStyleAlert];
[controller addAction:[UIAlertAction actionWithTitle:@"確認" style:UIAlertActionStyleDefault handler:nil]];
[[self getCurrentVC] presentViewController:controller animated:true completion:nil];
}];
其中,getCurrentVC
方法可參見本文檔登錄密碼輸入超限后提示找回密碼中getCurrentVC
的方法。
新增控件和單擊事件
當您需要在App中增加新的單擊事件時,例如新增一個Button控件的單擊事件,您可以根據(jù)以下步驟來操作。
現(xiàn)有控件增加自定義事件
當您需要對現(xiàn)有控件增加自定義事件時,例如統(tǒng)計某控件的單擊次數(shù)等,您可以參考以下示例方法來更改OA內(nèi)部邏輯并增加自定義事件。
//以統(tǒng)計按鈕單擊次數(shù)的邏輯為例
@implementation ALBBOpenAccountSetPwdViewController (aspect)
+ (void)load {
Method originalMethod = class_getInstanceMethod(self, @selector(submitPassword));
Method newMethod = class_getInstanceMethod(self, @selector(newSubmitPassword));
BOOL addMethod = class_addMethod(self, @selector(submitPassword), method_getImplementation(newMethod), method_getTypeEncoding(newMethod));
if (addMethod) {
class_replaceMethod(self, @selector(newSubmitPassword), method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, newMethod);
}
}
- (void)newSubmitPassword {
[self newSubmitPassword];
//處理統(tǒng)計次數(shù)邏輯
}
@end
新增郵箱登錄方式
如果您需要App支持郵箱方式登錄,您需要開發(fā)郵箱相關(guān)的功能,包括郵箱登錄(圖示中①)、郵箱注冊(圖示中②)、忘記郵箱密碼(圖示中③)等。
登錄密碼輸入次數(shù)超限后提示找回密碼
登錄App時,如果輸入登錄密碼的次數(shù)達到上限,App會限制繼續(xù)操作,并提示找回密碼。登錄賬號如果是手機號碼則跳轉(zhuǎn)至手機忘記密碼頁面;如果是郵箱則跳轉(zhuǎn)至郵箱忘記密碼頁面。
有兩種方案可實現(xiàn)登錄密碼輸入次數(shù)超限后提示找回密碼,您任選一種即可。
- 升級SDK
最新版本賬號及用戶SDK中已默認支持該能力,您可以通過升級SDK來實現(xiàn)該功能。完成SDK升級后,您無需額外操作。
pod 'AlicloudALBBOpenAccount', '3.4.0.39' //3.4.0.39及以上版本都支持
- 添加該功能代碼邏輯
您還可以通過反射+Runtime自定義跳轉(zhuǎn)的方式來實現(xiàn)該功能。
// 通過runtime方式做一個方法來替換,將ALBBOpenAccountLoginViewController的私有方法showFindPasswordView轉(zhuǎn)到自己定義的方法findPwdStyleChoose中 + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Method findPwdMethod = class_getInstanceMethod([self class], @selector(findPwdStyleChoose)); IMP findPwdNewImp = method_getImplementation(findPwdMethod); const char * typeEncodeing = method_getTypeEncoding(findPwdMethod); class_replaceMethod([ALBBOpenAccountLoginViewController class], NSSelectorFromString(@"showFindPasswordView"), findPwdNewImp, typeEncodeing); }); } /** 顯示找回密碼方式sheet */ - (void)findPwdStyleChoose { __weak typeof(self) weakSelf = self; UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"請選擇你要修改的密碼類型" message:nil preferredStyle:UIAlertControllerStyleActionSheet]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) { }]; UIAlertAction *phoneAction = [UIAlertAction actionWithTitle:@"忘記手機密碼?" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { id<ALBBOpenAccountUIService> uiService = ALBBService(ALBBOpenAccountUIService); [uiService showFindPasswordInNavigationController:[weakSelf getCurrentVC].navigationController success:nil failure:nil]; }]; UIAlertAction *emailAction = [UIAlertAction actionWithTitle:@"忘記郵箱密碼?" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) { id<ALBBOpenAccountUIService> uiService = ALBBService(ALBBOpenAccountUIService); [uiService showEmailFindPasswordInNavigationController:[self getCurrentVC].navigationController success:nil failure:nil]; }]; [alert addAction:cancelAction]; [alert addAction:phoneAction]; [alert addAction:emailAction]; [[self getCurrentVC] presentViewController:alert animated:YES completion:nil]; } - (UIViewController *)getCurrentVC { UIViewController *result = nil; UIWindow *window = [[UIApplication sharedApplication] keyWindow]; if (window.windowLevel != UIWindowLevelNormal) { NSArray *windows = [[UIApplication sharedApplication] windows]; for (UIWindow *temp in windows) { if (temp.windowLevel == UIWindowLevelNormal) { window = temp; break; } } } result = window.rootViewController; while (result.presentedViewController) { result = result.presentedViewController; } if ([result isKindOfClass:[UITabBarController class]]) { result = [(UITabBarController *)result selectedViewController]; } if ([result isKindOfClass:[UINavigationController class]]) { result = [(UINavigationController *)result visibleViewController]; } return result; }
更多UI定制
如果您還需定制更多的UI,例如修改更多原生元素,您可以根據(jù)以下內(nèi)容自行實現(xiàn)。
- 賬號及用戶SDK開放了所有xib組件,每個xib對應(yīng)相應(yīng)的功能頁。
您可以在保證云賬號交互邏輯的基礎(chǔ)上,通過修改以下任意xib文件,實現(xiàn)改變頁面布局、調(diào)整控件樣式、新增控件等一系列自定義UI的操作。
- SDK開放了所有ViewController,以及每一個ViewController的UI控件的引用。
以登錄頁面對應(yīng)的UI控件ALBBOpenAccountLoginViewController為例,控件中包括以下元素。
@interface ALBBOpenAccountLoginViewController : ALBBOpenAccountBaseController @property (assign, nonatomic) BOOL isNeedBackButtonHidden; //預(yù)留的外掛引用 @property (nonatomic, strong) IBOutletCollection(NSObject) NSArray *outletCollection; // wrapper @property (weak, nonatomic) IBOutlet ALBBOpenAccountWrapperView *wrapperView; // form @property (weak, nonatomic) IBOutlet NSLayoutConstraint *heightOfFormView; //locale @property (weak, nonatomic) IBOutlet UILabel *prefixLabel; @property (weak, nonatomic) IBOutlet UIButton *prefixIcon; // username @property (weak, nonatomic) IBOutlet UILabel *usernameLabel; @property (weak, nonatomic) IBOutlet UITextField *usernameField; @property (weak, nonatomic) IBOutlet UIButton *historyButton; @property (weak, nonatomic) IBOutlet UITableView *historyView; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *heightOfHistoryView; // password @property (weak, nonatomic) IBOutlet UIView *passwordView; @property (weak, nonatomic) IBOutlet UILabel *passwordLabel; @property (weak, nonatomic) IBOutlet UITextField *passwordField; @property (weak, nonatomic) IBOutlet UIButton *visibleButton; // control @property (weak, nonatomic) IBOutlet UIButton *submitButton; - (IBAction)submitLogin; // 前往國家列表 - (IBAction)prefixNumberChoose:(id)sender; // sso - (IBAction)taobaoSSO:(id)sender; #ifdef WECHAT_SSO - (IBAction)weChatSSO:(id)sender; #endif - (IBAction)weiBoSSO:(id)sender; - (IBAction)qqSSO:(id)sender; @property (weak, nonatomic) IBOutlet UIButton *registerLinkBtn; @property (weak, nonatomic) IBOutlet UIButton *findPwdLinkBtn; - (IBAction)showRegisterView; - (IBAction)showFindPasswordView; @end
- SDK開放了每一個ViewController的生命周期回調(diào),便于您定制ViewController的UI控件。
以ALBBOpenAccountLoginViewDelegate為例,使用方式如下。
- 設(shè)置一個登錄界面的代理。
[ALBBService(ALBBOpenAccountUIService) setLoginViewDelegate:self];
- 設(shè)置ALBBOpenAccountLoginViewDelegate代理方式。
@protocol ALBBOpenAccountLoginViewDelegate <NSObject> @optional - (void)loginViewDidLoad:(ALBBOpenAccountLoginViewController *) viewController; - (void)loginViewWillAppear:(ALBBOpenAccountLoginViewController *) viewController; - (void)loginViewDidAppear:(ALBBOpenAccountLoginViewController *) viewController; - (void)loginViewWillDisappear; - (void)loginViewDidDisappear; - (void)loginViewWillLayoutSubviews:(ALBBOpenAccountLoginViewController *) viewController; - (void)loginViewDidLayoutSubviews:(ALBBOpenAccountLoginViewController *) viewController; @end
- 使用代理方法改變內(nèi)容。
- (void)loginViewDidLoad:(ALBBOpenAccountLoginViewController *) viewController{ viewController.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"login" style:UIBarButtonItemStyleDone target:nil action:nil]; }
- 設(shè)置一個登錄界面的代理。
如果您還需定制除原生元素以外的內(nèi)容,可以參考以下信息來實現(xiàn)。
常見問題
- 問題一
Q:使用賬號及用戶SDK時,Crash出現(xiàn)以下提示。
A:將ALBBOpenAccountUI.framework中的xib目錄放置到主工程目錄下即可。
- 問題二
Q:賬號及用戶SDK初始化成功后,單擊App登錄按鈕,沒有成功跳轉(zhuǎn)至相應(yīng)的頁面。
A:示例中VC未加入到導(dǎo)航棧,所以推送登錄頁面會失敗。可以用如下方式推出登錄頁面。
[uiService presentLoginViewController:self success:^(ALBBOpenAccountSession *currentSession) { } failure:^(NSError *error) { }];
- 問題三
Q:SDK接口報錯,提示:Http load fail。
A:打開工程的info.plist文件,設(shè)置ATS配置即可。