iOS客戶端接入
本文為您介紹iOS客戶端融合認(rèn)證的集成方法及接口的功能示例。
下載SDK
登錄號(hào)碼認(rèn)證產(chǎn)品控制臺(tái),在概覽頁面的右側(cè)API&SDK區(qū)域,單擊立即下載,進(jìn)入API&SDK頁面,根據(jù)頁面提示下載并解壓對(duì)應(yīng)SDK。
創(chuàng)建認(rèn)證方案
您導(dǎo)入項(xiàng)目或調(diào)用API接口時(shí),會(huì)用到方案Code等參數(shù)信息,請(qǐng)先在號(hào)碼認(rèn)證產(chǎn)品控制臺(tái),創(chuàng)建認(rèn)證方案,獲取方案Code等參數(shù)信息。
開始集成
動(dòng)態(tài)庫不一定包含模擬器架構(gòu),可使用
lipo -info
指令查詢動(dòng)態(tài)庫支持的模擬器架構(gòu)。若因包含模擬器架構(gòu)而導(dǎo)致編譯報(bào)錯(cuò),使用lipo -thin
指令剔除可執(zhí)行文件中的模擬器架構(gòu)。解壓包內(nèi)含AlicomFusionAuth.framework.dSYM符號(hào)文件,集成時(shí)請(qǐng)勿將動(dòng)態(tài)庫解壓文件直接拖入工程中。該文件是線上crash符號(hào)翻譯專用,如果放入工程中會(huì)影響App上架審核。
融合認(rèn)證默認(rèn)提供的SDK為動(dòng)態(tài)庫,路徑為\SDK\AlicomFusionAuthSDK\iphoneos\AlicomFusionAuth.framework。
若需模擬器運(yùn)行,可以集成\SDK\AlicomFusionAuthSDK\iphoneos+iphonesimulator\AlicomFusionAuth.framework。
請(qǐng)注意:該SDK新增arm64+x86支持,只能用于調(diào)試,可以解決模擬器無法編譯的問題,提交AppStore建議使用iphoneos庫,因?yàn)閯?dòng)態(tài)庫包含x86,有被拒的風(fēng)險(xiǎn)。
創(chuàng)建工程。
下載并安裝Xcode,點(diǎn)擊Create a new Xcode project,根據(jù)頁面引導(dǎo)創(chuàng)建一個(gè)新工程。
添加主庫和Network系統(tǒng)依賴庫。
在菜單欄選擇Targets > General > Frameworks,Libraries, and Embedded Content,添加主庫AlicomFusionAuth.framework和系統(tǒng)依賴庫Network.framework。
說明請(qǐng)將AlicomFusionAuth.framework的Embed設(shè)置為Embed & Sign。
請(qǐng)將Network.framework的Embed設(shè)置為Do Not Embed。
BuildSettings設(shè)置。
在菜單欄選擇TARGETS > BuildSettings > Other Linker Flags,Other Linker Flags增加-ObjC。
添加ATAuthSDK.bundle資源文件。
添加SDK文件夾中的
ATAuthSDK.bundle
資源文件到您的工程中,否則授權(quán)頁面默認(rèn)的圖片或icon不顯示。可選:友盟功能組件。
若您之前已集成友盟基礎(chǔ)組件,則忽略此步驟,調(diào)用相關(guān)接口關(guān)閉融合認(rèn)證關(guān)聯(lián)的友盟插件,即可使用您現(xiàn)有友盟組件。
若您還未集成友盟組件,請(qǐng)將SDK文件夾的UMCommon.framework和UMDevice.framework集成到您的工程中,Embed設(shè)置為Do Not Embed。
鑒權(quán)
SDK在啟動(dòng)時(shí)需要接入方傳入鑒權(quán)Token,用于合法性校驗(yàn)。
Token鑒權(quán)成功,通過
onSDKTokenAuthSuccess():
回調(diào)。Token鑒權(quán)失敗,通過
onSDKTokenAuthFailure(AlicomFusionAuthToken token, AlicomFusionEvent alicomFusionEvent)
回調(diào)。
更新
SDK在運(yùn)行時(shí)若Token過期,請(qǐng)通過onSDKTokenUpdate()
更新Token。
使用場(chǎng)景
/* 默認(rèn)登錄注冊(cè)場(chǎng)景 */
public static final String ALICOMFUSIONAUTHTEMPLATED_10001 = "100001";
/* 默認(rèn)更換手機(jī)號(hào)場(chǎng)景 */
public static final String ALICOMFUSIONAUTHTEMPLATED_10002 = "100002";
/* 默認(rèn)重置密碼場(chǎng)景 */
public static final String ALICOMFUSIONAUTHTEMPLATED_10003 = "100003";
/* 默認(rèn)綁定新手機(jī)號(hào)場(chǎng)景 */
public static final String ALICOMFUSIONAUTHTEMPLATED_10004 = "100004";
/* 默認(rèn)驗(yàn)證綁定手機(jī)號(hào)場(chǎng)景 */
public static final String ALICOMFUSIONAUTHTEMPLATED_10005 = "100005";
類別 | 說明 | |
開始場(chǎng)景 | 調(diào)用 說明 調(diào)用該接口的前提是沒有正在執(zhí)行的場(chǎng)景。 |
|
繼續(xù)場(chǎng)景 | 調(diào)用 說明 調(diào)用該接口的前提是有正在執(zhí)行的場(chǎng)景。 |
|
結(jié)束場(chǎng)景 | 調(diào)用 | templateId:場(chǎng)景唯一標(biāo)識(shí)與控制臺(tái)場(chǎng)景ID唯一對(duì)應(yīng),用于決策結(jié)束哪個(gè)場(chǎng)景。 |
獲取Token成功 | SDK執(zhí)行到一個(gè)節(jié)點(diǎn)后或通過 | |
中途獲取Token成功 | 中途獲取Token成功的回調(diào),在AlicomFusionTemplateId_100002場(chǎng)景下驗(yàn)證當(dāng)前手機(jī)號(hào)節(jié)點(diǎn)觸發(fā),回調(diào) 在接入方驗(yàn)證完成當(dāng)前手機(jī)號(hào)后,通過verifyResult告知SDK驗(yàn)證結(jié)果,SDK將根據(jù)該結(jié)果執(zhí)行之后的流程。 | |
獲取Token失敗 | 如果SDK在某個(gè)節(jié)點(diǎn)獲取Token失敗,通過 | |
場(chǎng)景結(jié)束 | 回調(diào) 接入方調(diào)用 |
交互流程詳解
完整的功能交互流程請(qǐng)參見融合認(rèn)證的交互流程。
SDK方法說明
創(chuàng)建實(shí)例
/**
* 初始化,傳入鑒權(quán)Token
* @note 由App維護(hù)Token的生命周期,可以提升SDK中Token處理效率,快速拉起場(chǎng)景頁面
* @param token 鑒權(quán)Token
* @param schemeCode 方案號(hào)
*/
- (instancetype)initWithToken:(AlicomFusionAuthToken *)token schemeCode:(NSString *)schemeCode;
使用示例
AlicomFusionAuthToken *token = [[AlicomFusionAuthToken alloc] initWithTokenStr:tokenStr];
self.handler = [[AlicomFusionAuthHandler alloc] initWithToken:token schemeCode:@"xxx"];
Token需要從服務(wù)端獲取。
Token鑒權(quán)成功,通過
onSDKTokenAuthSuccess
回調(diào),場(chǎng)景操作必須在回調(diào)成功后進(jìn)行;Token鑒權(quán)失敗,通過onSDKTokenAuthFailure
回調(diào)。Token過期前五分鐘,通過
onSDKTokenUpdate
回調(diào)獲取新的Token,?戶必須實(shí)現(xiàn)此回調(diào)獲取新的Token。
設(shè)置流程監(jiān)控回調(diào)
/**
* 設(shè)置回調(diào)
* @param delegate SDK核心回調(diào)
*/
- (void)setFusionAuthDelegate:(id<AlicomFusionAuthDelegate>)delegate;
使用示例
[self.handler setFusionAuthDelegate:self];
開始場(chǎng)景
使用默認(rèn)UI
該接口使用的是默認(rèn)UI,接入方無法修改UI。
需要Token鑒權(quán)成功后才可使用。
沒有其他場(chǎng)景正在執(zhí)行方可調(diào)用,否則將報(bào)100003錯(cuò)誤。
templateId請(qǐng)參考使用場(chǎng)景。
/**
* 開始拉起場(chǎng)景,使用SDK內(nèi)置UI
* @param templateId 場(chǎng)景唯一標(biāo)識(shí)與控制臺(tái)場(chǎng)景ID唯一對(duì)應(yīng)
* @param controller 基礎(chǔ)頁面,SDK將從該頁面彈出融合認(rèn)證相關(guān)頁面
*/
- (void)startSceneWithTemplateId:(NSString *)templateId viewController:(UIViewController *)controller;
使用示例
[self.handler startSceneUIWithTemplateId:AlicomFusionTemplateId_100001 viewController:controller];
使用自定義UI
根據(jù)實(shí)際場(chǎng)景可以通過UI回調(diào)接口修改相關(guān)UI。
一鍵登錄
onPhoneNumberVerifyUICustomDefined:templateId:nodeId:UIModel:
短信驗(yàn)證碼
onSMSCodeVerifyUICustomDefined:templateId:nodeId:isAutoInput:view:
用戶主動(dòng)發(fā)短信
onSMSSendVerifyUICustomDefined:templateId:nodeId:smsContent:receiveNum:view:
導(dǎo)航欄:
onNavigationControllerCustomDefined:templateId:nodeId:navigation:
需要Token鑒權(quán)后才可使用。
templateId請(qǐng)參考使用場(chǎng)景。
/**
* 開始拉起場(chǎng)景,使用APP自定義UI
* @param templateId 場(chǎng)景唯一標(biāo)識(shí)與控制臺(tái)場(chǎng)景ID唯一對(duì)應(yīng)
* @param controller 基礎(chǔ)頁面,SDK將從該頁面彈出融合認(rèn)證相關(guān)UI界面
* @param delegate UI回調(diào),自定義UI需通過該回調(diào)實(shí)現(xiàn)
*/
- (void)startSceneUIWithTemplateId:(NSString *)templateId
viewController:(UIViewController *)controller
delegate:(id<AlicomFusionAuthUIDelegate> _Nullable)delegate;
使用示例
[self.handler startSceneUIWithTemplateId:AlicomFusionTemplateId_100001 viewController:controller delegate:self];
繼續(xù)場(chǎng)景
用于場(chǎng)景中斷后恢復(fù)流程,如獲取到號(hào)碼校驗(yàn)Token后,假設(shè)服務(wù)端效驗(yàn)失敗,可以通過該接口繼續(xù)進(jìn)行場(chǎng)景流程。
isSuccess的作用在于當(dāng)前的認(rèn)證是否成功,決定SDK的認(rèn)證走向,如SDK透出Token后,進(jìn)行取號(hào)操作失敗,如需下一步鑒權(quán),可通過該參數(shù)控制走向。
需要在start后才能使用。
templateId請(qǐng)參考使用場(chǎng)景。
/**
* 繼續(xù)場(chǎng)景
* @param templateId 場(chǎng)景唯一標(biāo)識(shí)與控制臺(tái)場(chǎng)景ID唯一對(duì)應(yīng)
* @param isSuccess 當(dāng)前場(chǎng)景驗(yàn)證是否成功,成功與否決定繼續(xù)場(chǎng)景后的業(yè)務(wù)流程走向
* @note 該接口用于場(chǎng)景中斷后恢復(fù)流程,如獲取到號(hào)碼效驗(yàn)token后,假設(shè)服務(wù)端效驗(yàn)失敗,可以通過該接口繼續(xù)進(jìn)行場(chǎng)景流程
*/
- (void)continueSceneWithTemplateId:(NSString *)templateId isSuccess:(BOOL)isSuccess;
使用示例
[self.handler continueSceneWithTemplateId:AlicomFusionTemplateId_100001 isSuccess:NO];
結(jié)束場(chǎng)景
當(dāng)需要結(jié)束場(chǎng)景時(shí)調(diào)用該接口,對(duì)應(yīng)的場(chǎng)景將不再執(zhí)行。
需要在start后才能使用。
templateId請(qǐng)參考使用場(chǎng)景。
/**
* 結(jié)束場(chǎng)景
* @param templateId 場(chǎng)景唯一標(biāo)識(shí)與控制臺(tái)場(chǎng)景ID唯一對(duì)應(yīng)
* @note 隨時(shí)調(diào)用,隨時(shí)停止,與start接口對(duì)應(yīng),結(jié)束后才可以start下一次場(chǎng)景,不可同時(shí)start多個(gè)場(chǎng)景
*/
- (void)stopSceneWithTemplateId:(NSString *)templateId;
使用示例
[self.handler stopSceneWithTemplateId:AlicomFusionTemplateId_100001];
其他接口說明
友盟組件依賴設(shè)置
用戶如果需要使用友盟組件的端風(fēng)險(xiǎn)檢測(cè)及手機(jī)號(hào)評(píng)分功能,需要配置aar后調(diào)用下面的方法決定友盟組件的初始化位置。
如果用戶只是簡(jiǎn)單的調(diào)用此方法而不引入aar則設(shè)置無效,因?yàn)榇斯δ軐儆诓寮揭蕾嚕粚儆趶?qiáng)制性依賴。
/**
* 設(shè)置是否使用SDK關(guān)聯(lián)友盟統(tǒng)計(jì)組件
* @note SDK默認(rèn)使用融合認(rèn)證關(guān)聯(lián)友盟組件,如果您當(dāng)前APP未集成友盟組件,根據(jù)SDK集成文檔接入各個(gè)SDK后,無需再關(guān)心此接口設(shè)置
* @note 如果您當(dāng)前已經(jīng)集成過友盟組件,則無需重復(fù)集成,使用此接口關(guān)閉內(nèi)置鏈接,并確保使用本SDK前已經(jīng)完成友盟組件初始化
* @param isUseSupply YES:使用SDK默認(rèn)關(guān)聯(lián)友盟組件。NO:不使用SDK關(guān)聯(lián)友盟組件,即使用APP原有友盟組件,默認(rèn)YES
*/
+ (void)useSDKSupplyUMSDK:(BOOL)isUseSupply;
使用示例
[AlicomFusionAuthHandler useSDKSupplyUMSDK:YES];
銷毀服務(wù)
銷毀服務(wù)后需要重新創(chuàng)建對(duì)象。
/**
* 銷毀服務(wù)
* @note 銷毀服務(wù)后,SDK內(nèi)部各個(gè)模塊同步銷毀,若想繼續(xù)使用SDK,請(qǐng)重新初始化
*/
- (void)destroy;
使用示例
[self.handler destroy];
self.handler = nil;
主動(dòng)更新Token
此方法為用戶主動(dòng)更新Token,Token相關(guān)鑒權(quán)及更新邏輯參考initWithToken中的Token邏輯。
/**
* 主動(dòng)更新鑒權(quán)Token
* @param Token 鑒權(quán)Token
* @note 鑒權(quán)Token具有時(shí)效性,App可再Token即將過期時(shí),主動(dòng)向SDK更新token
* @note 非必要接口:SDK內(nèi)部存在Token的過期監(jiān)控,過期前會(huì)通過AlicomFusionAuthDelegate回調(diào)通知APP,APP可不感知此項(xiàng)邏輯
*/
- (void)updateToken:(AlicomFusionAuthToken *)token;
使用示例
AlicomFusionAuthToken *token = [[AlicomFusionAuthToken alloc] initWithTokenStr:tokenStr];
[self.handler updateToken:token];
獲取版本號(hào)
/**
* 獲取SDK版本號(hào)
* @return 版本號(hào)
*/
+ (NSString *)getSDKVersion;
使用示例
NSString *version = [AlicomFusionAuthHandler getSDKVersion];
獲取場(chǎng)景ID
/**
* 獲取當(dāng)前正在運(yùn)行中的場(chǎng)景ID
* @return templateId 場(chǎng)景唯一標(biāo)識(shí) 與控制臺(tái)場(chǎng)景ID唯一對(duì)應(yīng)
*/
- (NSString *)getCurrentTemplateId;
使用示例
NSString *templateId = [self.handler getCurrentTemplateId];
日志功能
//是否打印log,默認(rèn)開啟
+ (void)logEnable:(BOOL)enable;
使用示例
[AlicomFusionLog logEnable:YES];
UI接口說明
?鍵登錄自定義UI參數(shù)
typedef NS_ENUM(NSUInteger, AlicomFusionPresentationDirection){
AlicomFusionPresentationDirectionBottom = 0,
AlicomFusionPresentationDirectionRight,
AlicomFusionPresentationDirectionTop,
AlicomFusionPresentationDirectionLeft,
};
/**
* 構(gòu)建控件的frame,view布局時(shí)會(huì)調(diào)用該block得到控件的frame
* @param screenSize 屏幕的size,可以通過該size來判斷是橫屏還是豎屏
* @param superViewSize 該控件的super view的size,可以通過該size,輔助該控件重新布局
* @param frame 控件默認(rèn)的位置
* @return 控件新設(shè)置的位置
*/
typedef CGRect(^AlicomFusionBuildFrameBlock)(CGSize screenSize, CGSize superViewSize, CGRect frame);
/* 一鍵登錄自定義UI */
@interface AlicomFusionNumberAuthModel : NSObject
/// 如果將otherLoginButton重新指向自己定義的button,其他手機(jī)號(hào)登錄,如果想按照編排流程走,需要點(diǎn)擊按鈕之后調(diào)用該方法
- (void)otherPhoneLogin;
/// 標(biāo)題
@property (nonatomic, strong) UILabel * _Nullable nameLabel;
/// 切換手機(jī)號(hào)登錄,如果該按鈕移除,自己實(shí)現(xiàn)了一個(gè)按鈕,要想繼續(xù)執(zhí)行SDK的內(nèi)部邏輯,按鈕的點(diǎn)擊需要調(diào)用otherPhoneLogin方法實(shí)現(xiàn)原有邏輯
@property (nonatomic, strong) UIButton * _Nullable otherLoginButton;
/// 更多登錄方式點(diǎn)擊回調(diào)
@property (nonatomic, copy) void(^moreLoginActionBlock)(void);
/** 構(gòu)建導(dǎo)一鍵登錄頁面“登錄”文字的布局,不實(shí)現(xiàn)則按默認(rèn)處理 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock nameLabelFrameBlock;
/** 構(gòu)建導(dǎo)一鍵登錄頁面“其他手機(jī)號(hào)登錄”按鈕的布局,不實(shí)現(xiàn)則按默認(rèn)處理 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock otherLoginButtonFrameBlock;
/**
* 說明,可設(shè)置的Y軸距離,waring: 以下所有關(guān)于Y軸的設(shè)置<=0都將不生效,請(qǐng)注意
* 全屏模式:默認(rèn)是以375x667pt為基準(zhǔn),其他屏幕尺寸可以根據(jù)(ratio = 屏幕高度/667)比率來適配,比如 Y*ratio
*/
#pragma mark- 全屏、彈窗模式設(shè)置
/**
* 授權(quán)頁面中,渲染并顯示所有控件的view,稱content view,不實(shí)現(xiàn)該block默認(rèn)為全屏模式
* 實(shí)現(xiàn)彈窗的方案 x >= 0 || y >= 0 width <= 屏幕寬度 || height <= 屏幕高度
*/
@property (nonatomic, copy) AlicomFusionBuildFrameBlock contentViewFrameBlock;
#pragma mark- 豎屏、橫屏模式設(shè)置
/** 屏幕是否支持旋轉(zhuǎn)方向,默認(rèn)UIInterfaceOrientationMaskPortrait,注意:在劉海屏,UIInterfaceOrientationMaskPortraitUpsideDown屬性慎用! */
@property (nonatomic, assign) UIInterfaceOrientationMask supportedInterfaceOrientations;
#pragma mark- 導(dǎo)航欄(只對(duì)全屏模式有效)
/**授權(quán)頁顯示中,導(dǎo)航欄是否隱藏,默認(rèn)NO*/
@property (nonatomic, assign) BOOL navIsHidden;
/**授權(quán)頁push到其他頁面后,導(dǎo)航欄是否隱藏,默認(rèn)NO*/
@property (nonatomic, assign) BOOL navIsHiddenAfterLoginVCDisappear;
/**是否需要中斷返回,如果設(shè)置為YES,則點(diǎn)擊左上角返回按鈕的時(shí)候默認(rèn)頁面不消失,同時(shí)透出狀態(tài)碼700010,需要自己調(diào)用TXCommonHandler cancelLoginVCAnimated方法隱藏頁面,默認(rèn)為NO*/
@property (nonatomic, assign) BOOL suspendDisMissVC;
/** 導(dǎo)航欄主題色 */
@property (nonatomic, strong) UIColor *navColor;
/** 導(dǎo)航欄標(biāo)題,內(nèi)容、字體、大小、顏色 */
@property (nonatomic, copy) NSAttributedString *navTitle;
/** 導(dǎo)航欄返回圖片 */
@property (nonatomic, strong) UIImage *navBackImage;
/** 是否隱藏授權(quán)頁導(dǎo)航欄返回按鈕,默認(rèn)不隱藏 */
@property (nonatomic, assign) BOOL hideNavBackItem;
/** 導(dǎo)航欄右側(cè)自定義控件,可以在創(chuàng)建該VIEW的時(shí)候添加手勢(shì)操作,或者創(chuàng)建按鈕或其他賦值給VIEW */
@property (nonatomic, strong) UIView *navMoreView;
/** 構(gòu)建導(dǎo)航欄返回按鈕的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock navBackButtonFrameBlock;
/** 構(gòu)建導(dǎo)航欄標(biāo)題的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock navTitleFrameBlock;
/** 構(gòu)建導(dǎo)航欄右側(cè)more view的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理,邊界 CGRectGetMinX(frame) >= (superViewSizeViewSize / 0.3) && CGRectGetWidth(frame) <= (superViewSize.width / 3.0) */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock navMoreViewFrameBlock;
#pragma mark- 全屏、彈窗模式共同屬性
#pragma mark- 授權(quán)頁動(dòng)畫相關(guān)
/** 授權(quán)頁彈出方向,默認(rèn)AlicomFusionPresentationDirectionBottom,該屬性只對(duì)自帶動(dòng)畫起效,不影響自定義動(dòng)畫 */
@property (nonatomic, assign) AlicomFusionPresentationDirection presentDirection;
/** 授權(quán)頁顯示和消失動(dòng)畫時(shí)間,默認(rèn)為0.25s,<= 0 時(shí)關(guān)閉動(dòng)畫,該屬性只對(duì)自帶動(dòng)畫起效,不影響自定義動(dòng)畫 **/
@property (nonatomic, assign) CGFloat animationDuration;
/** 授權(quán)頁顯示動(dòng)畫(彈窗 & 全屏),不設(shè)置或設(shè)置為nil默認(rèn)使用自帶動(dòng)畫,SDK內(nèi)部會(huì)主動(dòng)更改動(dòng)畫的一些屬性(包括:removedOnCompletion = NO、fillMode = kCAFillModeForwards 及 delegate) **/
@property (nonatomic, strong, nullable) CAAnimation *entryAnimation;
/** 授權(quán)頁消失動(dòng)畫(彈窗 & 全屏),不設(shè)置或設(shè)置為nil默認(rèn)使用自帶動(dòng)畫,SDK內(nèi)部會(huì)主動(dòng)更改動(dòng)畫的一些屬性(包括:removedOnCompletion = NO、fillMode = kCAFillModeForwards 及 delegate) **/
@property (nonatomic, strong, nullable) CAAnimation *exitAnimation;
/** 授權(quán)頁顯示時(shí)的背景動(dòng)畫(僅彈窗),不設(shè)置或設(shè)置為nil默認(rèn)使用自帶動(dòng)畫,SDK內(nèi)部會(huì)主動(dòng)更改動(dòng)畫的一些屬性(包括:removedOnCompletion = NO、fillMode = kCAFillModeForwards 及 delegate) **/
@property (nonatomic, strong, nullable) CAAnimation *bgEntryAnimation;
/** 授權(quán)頁消失時(shí)的背景動(dòng)畫(僅彈窗),不設(shè)置或設(shè)置為nil默認(rèn)使用自帶動(dòng)畫,SDK內(nèi)部會(huì)主動(dòng)更改動(dòng)畫的一些屬性(包括:removedOnCompletion = NO、fillMode = kCAFillModeForwards 及 delegate) **/
@property (nonatomic, strong, nullable) CAAnimation *bgExitAnimation;
#pragma mark- 狀態(tài)欄
/** 狀態(tài)欄是否隱藏,默認(rèn)NO */
@property (nonatomic, assign) BOOL prefersStatusBarHidden;
/** 狀態(tài)欄主題風(fēng)格,默認(rèn)UIStatusBarStyleDefault */
@property (nonatomic, assign) UIStatusBarStyle preferredStatusBarStyle;
#pragma mark- 背景
/** 授權(quán)頁背景色 */
@property (nonatomic, strong) UIColor *backgroundColor;
/** 授權(quán)頁背景圖片 */
@property (nonatomic, strong) UIImage *backgroundImage;
/** 授權(quán)頁背景圖片view的 content mode,默認(rèn)為 UIViewContentModeScaleAspectFill */
@property (nonatomic, assign) UIViewContentMode backgroundImageContentMode;
#pragma mark- logo圖片
/** logo圖片設(shè)置 */
@property (nonatomic, strong) UIImage *logoImage;
/** logo是否隱藏,默認(rèn)NO */
@property (nonatomic, assign) BOOL logoIsHidden;
/** 構(gòu)建logo的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock logoFrameBlock;
#pragma mark- slogan
/** slogan文案,內(nèi)容、字體、大小、顏色 */
@property (nonatomic, copy) NSAttributedString *sloganText;
/** slogan是否隱藏,默認(rèn)NO */
@property (nonatomic, assign) BOOL sloganIsHidden;
/** 構(gòu)建slogan的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock sloganFrameBlock;
#pragma mark- 號(hào)碼
/** 號(hào)碼顏色設(shè)置 */
@property (nonatomic, strong) UIColor *numberColor;
/** 號(hào)碼字體大小設(shè)置,大小小于16則不生效 */
@property (nonatomic, strong) UIFont *numberFont;
/**
* 構(gòu)建號(hào)碼的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,只有x、y生效,不實(shí)現(xiàn)則按默認(rèn)處理,
* 注:設(shè)置不能超出父視圖 content view
*/
@property (nonatomic, copy) AlicomFusionBuildFrameBlock numberFrameBlock;
#pragma mark- 登錄
/** 登錄按鈕文案,內(nèi)容、字體、大小、顏色*/
@property (nonatomic, strong) NSAttributedString *loginBtnText;
/** 登錄按鈕背景圖片組,默認(rèn)高度50.0pt,@[激活狀態(tài)的圖片,失效狀態(tài)的圖片,高亮狀態(tài)的圖片] */
@property (nonatomic, strong) NSArray<UIImage *> *loginBtnBgImgs;
/**
* 是否自動(dòng)隱藏點(diǎn)擊登錄按鈕之后授權(quán)頁上轉(zhuǎn)圈的 loading, 默認(rèn)為YES,在獲取登錄Token成功后自動(dòng)隱藏
* 如果設(shè)置為 NO,需要自己手動(dòng)調(diào)用 [[TXCommonHandler sharedInstance] hideLoginLoading] 隱藏
*/
@property (nonatomic, assign) BOOL autoHideLoginLoading;
/**
* 構(gòu)建登錄按鈕的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理
* 注:不能超出父視圖 content view,height不能小于20,width不能小于父視圖寬度的一半
*/
@property (nonatomic, copy) AlicomFusionBuildFrameBlock loginBtnFrameBlock;
#pragma mark- 協(xié)議
/** checkBox圖片組,[uncheckedImg,checkedImg]*/
@property (nonatomic, copy) NSArray<UIImage *> *checkBoxImages;
/** checkBox圖片距離控件邊框的填充,默認(rèn)為 UIEdgeInsetsZero,確保控件大小減去內(nèi)填充大小為資源圖片大小情況下,圖片才不會(huì)變形 **/
@property (nonatomic, assign) UIEdgeInsets checkBoxImageEdgeInsets;
/** checkBox是否勾選,默認(rèn)NO */
@property (nonatomic, assign) BOOL checkBoxIsChecked;
/** checkBox是否隱藏,默認(rèn)NO */
@property (nonatomic, assign) BOOL checkBoxIsHidden;
/** checkBox大小,高寬一樣,必須大于0 */
@property (nonatomic, assign) CGFloat checkBoxWH;
/** 協(xié)議1,[協(xié)議名稱,協(xié)議Url],注:三個(gè)協(xié)議名稱不能相同 */
@property (nonatomic, copy) NSArray<NSString *> *privacyOne;
/** 協(xié)議2,[協(xié)議名稱,協(xié)議Url],注:三個(gè)協(xié)議名稱不能相同 */
@property (nonatomic, copy) NSArray<NSString *> *privacyTwo;
/** 協(xié)議3,[協(xié)議名稱,協(xié)議Url],注:三個(gè)協(xié)議名稱不能相同 */
@property (nonatomic, copy) NSArray<NSString *> *privacyThree;
/** 協(xié)議名稱之間連接字符串?dāng)?shù)組,默認(rèn) ["和","、","、"] ,即第一個(gè)為"和",其他為"、",按順序讀取,為空則取默認(rèn) */
@property (nonatomic, copy) NSArray<NSString *> *privacyConectTexts;
/** 協(xié)議內(nèi)容顏色數(shù)組,[非點(diǎn)擊文案顏色,點(diǎn)擊文案顏色] */
@property (nonatomic, copy) NSArray<UIColor *> *privacyColors;
/** 協(xié)議文案支持居中、居左、居右設(shè)置,默認(rèn)居左 */
@property (nonatomic, assign) NSTextAlignment privacyAlignment;
/** 協(xié)議整體文案,前綴部分文案 */
@property (nonatomic, copy) NSString *privacyPreText;
/** 協(xié)議整體文案,后綴部分文案 */
@property (nonatomic, copy) NSString *privacySufText;
/** 運(yùn)營(yíng)商協(xié)議名稱前綴文案,僅支持 <([《(【『 */
@property (nonatomic, copy) NSString *privacyOperatorPreText;
/** 運(yùn)營(yíng)商協(xié)議名稱后綴文案,僅支持 >)]》)】』*/
@property (nonatomic, copy) NSString *privacyOperatorSufText;
/** 運(yùn)營(yíng)商協(xié)議指定顯示順序,默認(rèn)0,即第1個(gè)協(xié)議顯示,最大值可為3,即第4個(gè)協(xié)議顯示*/
@property (nonatomic, assign) NSInteger privacyOperatorIndex;
/** 協(xié)議整體文案字體大小,小于12.0不生效 */
@property (nonatomic, strong) UIFont *privacyFont;
/** checkBox是否擴(kuò)大按鈕可交互范圍至"協(xié)議前綴部分文案(默認(rèn):我已閱讀并同意)"區(qū)域,默認(rèn)NO */
@property (nonatomic, assign) BOOL expandAuthPageCheckedScope;
/**
* 構(gòu)建協(xié)議整體(包括checkBox)的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理
* 如果設(shè)置的width小于checkBox的寬則不生效,最小x、y為0,最大width、height為父試圖寬高
* 最終會(huì)根據(jù)設(shè)置進(jìn)來的width對(duì)協(xié)議文本進(jìn)行自適應(yīng),得到的size是協(xié)議控件的最終大小
*/
@property (nonatomic, copy) AlicomFusionBuildFrameBlock privacyFrameBlock;
/**
* 未同意協(xié)議時(shí)點(diǎn)擊登錄按鈕,協(xié)議整體文案的動(dòng)畫效果,不設(shè)置或設(shè)置為nil默認(rèn)沒有動(dòng)畫,SDK內(nèi)部會(huì)主動(dòng)更改動(dòng)畫的一些屬性(包括:removedOnCompletion = NO、fillMode = kCAFillModeRemoved 及 delegate)
*/
@property (nonatomic, strong, nullable) CAAnimation *privacyAnimation;
#pragma mark- 切換到其他方式
/** changeBtn標(biāo)題,內(nèi)容、字體、大小、顏色 */
@property (nonatomic, copy) NSAttributedString *changeBtnTitle;
/** changeBtn是否隱藏,默認(rèn)NO*/
@property (nonatomic, assign) BOOL changeBtnIsHidden;
/** 構(gòu)建changeBtn的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock changeBtnFrameBlock;
#pragma mark- 協(xié)議詳情頁
/** 導(dǎo)航欄背景顏色設(shè)置 */
@property (nonatomic, strong) UIColor *privacyNavColor;
/** 導(dǎo)航欄標(biāo)題字體、大小 */
@property (nonatomic, strong) UIFont *privacyNavTitleFont;
/** 導(dǎo)航欄標(biāo)題顏色 */
@property (nonatomic, strong) UIColor *privacyNavTitleColor;
/** 導(dǎo)航欄返回圖片 */
@property (nonatomic, strong) UIImage *privacyNavBackImage;
#pragma mark- 其他自定義控件添加及布局
/**
* 自定義控件添加,注意:自定義視圖的創(chuàng)建初始化和添加到父視圖,都需要在主線程!!
* @param superCustomView 父視圖
*/
@property (nonatomic, copy) void(^customViewBlock)(UIView *superCustomView);
/**
* 每次授權(quán)頁布局完成時(shí)會(huì)調(diào)用該block,可以在該block實(shí)現(xiàn)里面可設(shè)置自定義添加控件的frame
* @param screenSize 屏幕的size
* @param contentViewFrame content view的frame,
* @param navFrame 導(dǎo)航欄的frame,僅全屏?xí)r有效
* @param titleBarFrame 標(biāo)題欄的frame,僅彈窗時(shí)有效
* @param logoFrame logo圖片的frame
* @param sloganFrame slogan的frame
* @param numberFrame 號(hào)碼欄的frame
* @param loginFrame 登錄按鈕的frame
* @param changeBtnFrame 切換到其他方式按鈕的frame
* @param privacyFrame 協(xié)議整體(包括checkBox)的frame
*/
@property (nonatomic, copy) void(^customViewLayoutBlock)(CGSize screenSize, CGRect contentViewFrame,CGRect nameLabelFrame,CGRect otherLoginBtnFrame,CGRect navFrame, CGRect titleBarFrame, CGRect logoFrame, CGRect sloganFrame, CGRect numberFrame, CGRect loginFrame, CGRect changeBtnFrame, CGRect privacyFrame);
#pragma mark - 二次隱私協(xié)議彈窗設(shè)置
/** 二次隱私協(xié)議彈窗是否需要顯示, 默認(rèn)NO */
@property (nonatomic, assign) BOOL privacyAlertIsNeedShow;
/** 二次隱私協(xié)議彈窗點(diǎn)擊按鈕是否需要執(zhí)行登錄,默認(rèn)YES */
@property (nonatomic, assign) BOOL privacyAlertIsNeedAutoLogin;
/** 二次隱私協(xié)議彈窗顯示自定義動(dòng)畫,默認(rèn)從下往上位移動(dòng)畫 */
@property (nonatomic, strong, nullable) CAAnimation *privacyAlertEntryAnimation;
/** 二次隱私協(xié)議彈窗隱藏自定義動(dòng)畫,默認(rèn)從上往下位移動(dòng)畫 */
@property (nonatomic, strong, nullable) CAAnimation *privacyAlertExitAnimation;
/** 二次隱私協(xié)議彈窗的四個(gè)圓角值,順序?yàn)樽笊希笙拢蚁拢疑希枰畛?個(gè)值,不足4個(gè)值則無效,如果值<=0則為直角 ,默認(rèn)0*/
@property (nonatomic, copy) NSArray<NSNumber *> *privacyAlertCornerRadiusArray;
/** 二次隱私協(xié)議彈窗背景顏色,默認(rèn)為白色 */
@property (nonatomic, strong) UIColor *privacyAlertBackgroundColor;
/** 二次隱私協(xié)議彈窗透明度,默認(rèn)不透明1.0 ,設(shè)置范圍0.3~1.0之間 */
@property (nonatomic, assign) CGFloat privacyAlertAlpha;
/** 二次隱私協(xié)議彈窗標(biāo)題文字大小,最小12,默認(rèn)12 */
@property (nonatomic, strong) UIFont *privacyAlertTitleFont;
/** 二次隱私協(xié)議彈窗標(biāo)題文字顏色,默認(rèn)黑色 */
@property (nonatomic, strong) UIColor *privacyAlertTitleColor;
/** 二次隱私協(xié)議彈窗標(biāo)題背景顏色,默認(rèn)白色*/
@property (nonatomic, strong) UIColor *privacyAlertTitleBackgroundColor;
/** 二次隱私協(xié)議彈窗標(biāo)題位置,默認(rèn)居中*/
@property (nonatomic, assign) NSTextAlignment privacyAlertTitleAlignment;
/** 二次隱私協(xié)議彈窗協(xié)議內(nèi)容文字大小,最小12,默認(rèn)12 */
@property (nonatomic, strong) UIFont *privacyAlertContentFont;
/** 二次隱私協(xié)議彈窗協(xié)議內(nèi)容背景顏色,默認(rèn)白色 */
@property (nonatomic, strong) UIColor *privacyAlertContentBackgroundColor;
/** 二次隱私協(xié)議彈窗協(xié)議內(nèi)容顏色數(shù)組,[非點(diǎn)擊文案顏色,點(diǎn)擊文案顏色],默認(rèn)[0x999999,0x1890FF] */
@property (nonatomic, copy) NSArray<UIColor *> *privacyAlertContentColors;
/** 二次隱私協(xié)議彈窗協(xié)議文案支持居中、居左、居右設(shè)置,默認(rèn)居左 */
@property (nonatomic, assign) NSTextAlignment privacyAlertContentAlignment;
/** 二次隱私協(xié)議彈窗按鈕背景圖片 ,默認(rèn)高度50.0pt,@[激活狀態(tài)的圖片,高亮狀態(tài)的圖片] */
@property (nonatomic, copy) NSArray<UIImage *> *privacyAlertBtnBackgroundImages;
/** 二次隱私協(xié)議彈窗按鈕文字顏色,默認(rèn)黑色, @[激活狀態(tài)的顏色,高亮狀態(tài)的顏色] */
@property (nonatomic, copy) NSArray<UIColor *> *privacyAlertButtonTextColors;
/** 二次隱私協(xié)議彈窗按鈕文字大小,最小10,默認(rèn)18*/
@property (nonatomic, strong) UIFont *privacyAlertButtonFont;
/** 二次隱私協(xié)議彈窗關(guān)閉按鈕是否顯示,默認(rèn)顯示 */
@property (nonatomic, assign) BOOL privacyAlertCloseButtonIsNeedShow;
/** 二次隱私協(xié)議彈窗右側(cè)關(guān)閉按鈕圖片設(shè)置,默認(rèn)內(nèi)置的X圖片*/
@property (nonatomic, strong) UIImage *privacyAlertCloseButtonImage;
/** 二次隱私協(xié)議彈窗背景蒙層是否顯示 ,默認(rèn)YES*/
@property (nonatomic, assign) BOOL privacyAlertMaskIsNeedShow;
/** 二次隱私協(xié)議彈窗點(diǎn)擊背景蒙層是否關(guān)閉彈窗 ,默認(rèn)YES*/
@property (nonatomic, assign) BOOL tapPrivacyAlertMaskCloseAlert;
/** 二次隱私協(xié)議彈窗蒙版背景顏色,默認(rèn)黑色 */
@property (nonatomic, strong) UIColor *privacyAlertMaskColor;
/** 二次隱私協(xié)議彈窗蒙版透明度 設(shè)置范圍0.3~1.0之間 ,默認(rèn)0.5*/
@property (nonatomic, assign) CGFloat privacyAlertMaskAlpha;
/** 二次隱私協(xié)議彈窗蒙版顯示動(dòng)畫,默認(rèn)漸顯動(dòng)畫 */
@property (nonatomic, strong) CAAnimation *privacyAlertMaskEntryAnimation;
/** 二次隱私協(xié)議彈窗蒙版消失動(dòng)畫,默認(rèn)漸隱動(dòng)畫 */
@property (nonatomic, strong) CAAnimation *privacyAlertMaskExitAnimation;
/** 二次隱私協(xié)議彈窗尺寸設(shè)置,不能超出父視圖 content view,height不能小于50,width不能小于0,默認(rèn)屏幕居中,寬為屏幕的寬度減掉80,高為200 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock privacyAlertFrameBlock;
/** 二次隱私協(xié)議彈窗標(biāo)題尺寸,默認(rèn)x=0,y=0,width=彈窗寬度,最小寬度為100,height=根據(jù)文本計(jì)算的高度,最小高度為15,不能超出父視圖 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock privacyAlertTitleFrameBlock;
/** 二次隱私協(xié)議彈窗內(nèi)容尺寸,默認(rèn)為從標(biāo)題頂部位置開始,最終會(huì)根據(jù)設(shè)置進(jìn)來的width對(duì)協(xié)議文本進(jìn)行自適應(yīng),得到的size是協(xié)議控件的最終大小。不能超出父視圖 */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock privacyAlertPrivacyContentFrameBlock;
/** 二次隱私協(xié)議彈窗尺寸,默認(rèn)為父視圖的寬度一半,居中顯示。高度默認(rèn)50, */
@property (nonatomic, copy) AlicomFusionBuildFrameBlock privacyAlertButtonFrameBlock;
/** 二次隱私協(xié)議彈窗右側(cè)關(guān)閉按鈕尺寸,默認(rèn)寬高44,居彈窗右側(cè)15,居彈窗頂部0*/
@property (nonatomic, copy) AlicomFusionBuildFrameBlock privacyAlertCloseFrameBlock;
短信認(rèn)證自定義UI參數(shù)
#pragma mark - 自己輸入手機(jī)號(hào),10001、100002、100003、100004模板使用
/// 獲取驗(yàn)證碼父View
@property (nonatomic, strong) UIView *verifyCodeSendView;
/// 國(guó)家代碼顯示區(qū)
@property (nonatomic, strong) UILabel *countryCodeLabel;
/// 手機(jī)號(hào)輸入
@property (nonatomic, strong) UITextField *phoneTextField;
/// 分割線
@property (nonatomic, strong) UIView *lineView;
#pragma mark - 自動(dòng)填充手機(jī)號(hào),10002、100005模板使用
/// 手機(jī)號(hào)部分
@property (nonatomic, strong) UILabel *phoneNumLabel;//帶*號(hào)
@property (nonatomic, strong) NSString *phoneNumText;//真實(shí)手機(jī)號(hào)
/// 說明部分
@property (nonatomic, strong) UILabel *phoneNumExplainLabel;
#pragma mark - 按鈕
/// 獲取驗(yàn)證碼按鈕
@property (nonatomic, strong) UIButton *verifyCodeSendBtn;
#pragma mark 協(xié)議 100001模板使用
/// checkbox
@property (nonatomic, strong) UIButton *checkBoxBtn;
/// 隱私協(xié)議
@property (nonatomic, strong) UITextView *privacyTextView;
#pragma mark - 驗(yàn)證碼部分
/// 提交驗(yàn)證碼父View
@property (nonatomic, strong) UIView *verifyCodeSubmitView;
/// 發(fā)送成功之后的文案
@property (nonatomic, strong) UILabel *expainLabel;
/// 驗(yàn)證碼輸入框
@property (nonatomic, strong) AlicomFusionVerifyCodeInputView *codeView;
/// 提交驗(yàn)證按鈕
@property (nonatomic, strong) UIButton *verifyCodeSubmitBtn;
/// 點(diǎn)擊手勢(shì),用于收回鍵盤
@property (nonatomic, strong) UITapGestureRecognizer *tapGesture;
上行短信驗(yàn)證碼自定義UI
/// 頂部說明文案背景
@property (nonatomic, strong) UIView *contentBgView;
/// 頂部說明文案
@property (nonatomic, strong) UILabel *contentLabel;
/// 短信內(nèi)容標(biāo)題
@property (nonatomic, strong) UILabel *upGoingTitleLabel;
/// 短信內(nèi)容
@property (nonatomic, strong) UILabel *upGoingContentLabel;
/// 短信接收號(hào)碼標(biāo)題
@property (nonatomic, strong) UILabel *phoneTitleLabel;
/// 短信接收號(hào)碼
@property (nonatomic, strong) UILabel *phoneContentLabel;
/// 去發(fā)送短信按鈕
@property (nonatomic, strong) UIButton *upGoingSendBtn;
/// 我已發(fā)送短信按鈕
@property (nonatomic, strong) UIButton *upGoingAlreadySendBtn;
SDK回調(diào)說明
AlicomFusionAuthDelegate
Token需要更新
每30秒重試獲取一次,連續(xù)兩次失敗SDK將報(bào)300004錯(cuò)誤。
/**
* Token需要更新
* @note 必選回調(diào),handler初始化&歷史Token過期前5分鐘,會(huì)觸發(fā)此回調(diào),由SDK維護(hù)Token的生命周期
* @param handler handler
* @return token,APP更新最新token后,給到SDK,SDK會(huì)通過此token進(jìn)行鑒權(quán)更新
*/
- (AlicomFusionAuthToken *)onSDKTokenUpdate:(AlicomFusionAuthHandler *)handler;
Token鑒權(quán)成功
請(qǐng)確保回調(diào)該接口后再使用SDK相關(guān)功能,否則SDK將報(bào)300001、300003、300006錯(cuò)誤。
/**
* Token鑒權(quán)成功
* @note 必選回調(diào),Token鑒權(quán)成功后,才可以使用startScene接口拉起場(chǎng)景
* @note 不建議在本回調(diào)中直接調(diào)用startScene接口,本回調(diào)跟隨Token鑒權(quán)事件觸發(fā),可能存在多次回調(diào)
* @param handler handler
*/
- (void)onSDKTokenAuthSuccess:(AlicomFusionAuthHandler *)handler;
Token鑒權(quán)失敗
該接口回調(diào),即Token發(fā)生錯(cuò)誤,SDK的業(yè)務(wù)功能將不可用,請(qǐng)重新設(shè)置Token或銷毀SDK。
/**
* token鑒權(quán)失敗
* @note 必選回調(diào),token初次鑒權(quán)失敗&token更新后鑒權(quán)失敗均會(huì)觸發(fā)此回調(diào)
* @note token鑒權(quán)失敗后,無法繼續(xù)使用SDK的功能,請(qǐng)銷毀SDK后重新初始化
* @param handler handler
* @param failToken 錯(cuò)誤token
* @param error 錯(cuò)誤定義
*/
- (void)onSDKTokenAuthFailure:(AlicomFusionAuthHandler *)handler
failToken:(AlicomFusionAuthToken *)failToken
error:(AlicomFusionEvent *)error;
認(rèn)證成功
SDK根據(jù)業(yè)務(wù)流程返回認(rèn)證Token,App側(cè)需使用該Token進(jìn)行換號(hào)服務(wù),進(jìn)行最終的認(rèn)證流程。
SDK在是一鍵登錄、短信認(rèn)證、用戶主動(dòng)發(fā)短信時(shí),會(huì)產(chǎn)生認(rèn)證Token。用戶主動(dòng)發(fā)短信的Token可以多次使用,其他的Token只能使用一次。
該接口只在認(rèn)證最終階段進(jìn)行回調(diào)。
若Token換號(hào)失敗可在該接口中執(zhí)行
continueSceneWithTemplateId:isSuccess:
方法進(jìn)行下一步認(rèn)證工作。
/**
* 認(rèn)證成功
* @note 必選回調(diào)
* @note 可以使用號(hào)碼效驗(yàn)maskToken去APP Server做最終驗(yàn)證換取真實(shí)手機(jī)號(hào)碼,如果換取手機(jī)號(hào)失敗,可以通過SDK的continue接口繼續(xù)后續(xù)場(chǎng)景流程
* @param handler handler
* @param nodeName 獲取token的節(jié)點(diǎn)名稱
* @param maskToken 號(hào)碼效驗(yàn)token
*/
- (void)onVerifySuccess:(AlicomFusionAuthHandler *)handler
nodeName:(NSString *)nodeName
maskToken:(NSString *)maskToken
event:(AlicomFusionEvent *)event;
中途認(rèn)證節(jié)點(diǎn)
/**
* 中途認(rèn)證節(jié)點(diǎn),需要知道中途認(rèn)證結(jié)果,否則影響流程繼續(xù)執(zhí)行,目前只有更換手機(jī)號(hào)的時(shí)候第一次驗(yàn)證碼會(huì)回調(diào)
* @note 必選回調(diào)
* @note 可以使用號(hào)碼效驗(yàn)maskToken去APP Server做最終驗(yàn)證換取真實(shí)手機(jī)號(hào)碼,通過resultBlock告知SDK驗(yàn)證結(jié)果,如果失敗則SDK不進(jìn)行任何操作,成功則進(jìn)入下一個(gè)節(jié)點(diǎn)
* @param handler handler
* @param nodeName 獲取token的節(jié)點(diǎn)名稱
* @param maskToken 號(hào)碼效驗(yàn)token
* @param resultBlock 告知SDK校驗(yàn)結(jié)果
*/
- (void)onHalfwayVerifySuccess:(AlicomFusionAuthHandler *)handler
nodeName:(NSString *)nodeName
maskToken:(NSString *)maskToken
event:(AlicomFusionEvent *)event
resultBlock:(void (^)(BOOL))resultBlock;
認(rèn)證失敗
回調(diào)該接口即當(dāng)前節(jié)點(diǎn)認(rèn)證存在問題,可繼續(xù)執(zhí)行continueSceneWithTemplateId:isSuccess:
方法進(jìn)行其他的認(rèn)證方案。
/**
* 認(rèn)證失敗
* @note 必選回調(diào)
* @note 當(dāng)接收到這個(gè)回調(diào)時(shí)表示在場(chǎng)景的某個(gè)節(jié)點(diǎn)出現(xiàn)獲取token失敗的情況,業(yè)務(wù)方可以根據(jù)實(shí)際情況決定是否需要執(zhí)行下一個(gè)節(jié)點(diǎn)
* @param handler handler
* @param nodeName 獲取token的節(jié)點(diǎn)名稱
* @param error 錯(cuò)誤
*/
- (void)onVerifyFailed:(AlicomFusionAuthHandler *)handler
nodeName:(NSString *)nodeName
error:(AlicomFusionEvent *)error;
場(chǎng)景流程結(jié)束
需在此回調(diào)中執(zhí)行stopSceneWithTemplateId:
方法,以便下次場(chǎng)景再次發(fā)起。
/**
* 場(chǎng)景流程結(jié)束
* @note 必選回調(diào),SDK當(dāng)前場(chǎng)景流程結(jié)束,場(chǎng)景正常結(jié)束和異常結(jié)束均會(huì)觸發(fā)此回調(diào)
* @param handler handler
* @param event 結(jié)束事件
*/
- (void)onTemplateFinish:(AlicomFusionAuthHandler *)handler
event:(AlicomFusionEvent *)event;
填充手機(jī)號(hào)
用于短信驗(yàn)證碼認(rèn)證頁面的自動(dòng)填充手機(jī)號(hào)。
自動(dòng)填充手機(jī)號(hào)用于更換手機(jī)號(hào)場(chǎng)景(AlicomFusionTemplateId_100002)的第一步校驗(yàn)當(dāng)前手機(jī)號(hào),驗(yàn)證當(dāng)前手機(jī)號(hào)場(chǎng)景(AlicomFusionTemplateId_100005)。
校驗(yàn)手機(jī)號(hào)一致性,用于重置密碼場(chǎng)景(AlicomFusionTemplateId_100003),若不一致,則整個(gè)場(chǎng)景結(jié)束,回調(diào)
onTemplateFinish:event:
。
/**
* 填充手機(jī)號(hào),用于校驗(yàn)手機(jī)號(hào)是否和輸入的一致,或者重新綁定手機(jī)號(hào)場(chǎng)景自動(dòng)填充手機(jī)號(hào)
* @note 必選回調(diào),SDK內(nèi)置UI部分手機(jī)號(hào)
* @note 比如重置密碼場(chǎng)景,需要先填寫原手機(jī)號(hào)碼進(jìn)行第一步效驗(yàn),SDK需效驗(yàn)該填寫值是否為真實(shí)的原手機(jī)號(hào)碼,或者重新綁定手機(jī)號(hào)場(chǎng)景自動(dòng)填充手機(jī)號(hào)
* @param handler handler
* @param event 事件
* @return 返回當(dāng)前用戶正在使用的手機(jī)號(hào)用于下一步操作
*/
- (NSString *)onGetPhoneNumberForVerification:(AlicomFusionAuthHandler *)handler
event:(AlicomFusionEvent *)event;
點(diǎn)擊協(xié)議富文本
注冊(cè)登錄場(chǎng)景(AlicomFusionTemplateId_100001)需要顯示協(xié)議,點(diǎn)擊相應(yīng)協(xié)議的回調(diào),App側(cè)根據(jù)返回內(nèi)容,創(chuàng)建webview進(jìn)行展示。
/**
* 點(diǎn)擊協(xié)議富文本,返回協(xié)議標(biāo)題以及協(xié)議URL,外部需要自定義容器打開該協(xié)議
* @note 必選回調(diào),SDK協(xié)議詳情頁
* @note 一鍵登錄的協(xié)議點(diǎn)擊,短信驗(yàn)證碼的協(xié)議點(diǎn)擊
* @param handler handler
* @param protocolName 協(xié)議名稱
* @param protocolUrl 協(xié)議URL
* @param event 事件
*/
- (void)onProtocolClick:(AlicomFusionAuthHandler *)handler
protocolName:(NSString *)protocolName
protocolUrl:(NSString *)protocolUrl
event:(AlicomFusionEvent *)event;
認(rèn)證中斷
第一種認(rèn)證中斷指流程無法繼續(xù)執(zhí)行,在某節(jié)點(diǎn)無法校驗(yàn)通過,如手機(jī)號(hào)的長(zhǎng)度不正確、未勾選隱私協(xié)議框等,App側(cè)可以選擇彈出toast提示。
第二種認(rèn)證中斷指進(jìn)行一些耗時(shí)操作,需要loading指示,如目前端風(fēng)險(xiǎn)檢測(cè)開始、獲取短信驗(yàn)證碼開始、獲取用戶主動(dòng)發(fā)短信內(nèi)容開始。SDK會(huì)回調(diào)900003狀態(tài)碼,表示開始loading,端風(fēng)險(xiǎn)檢測(cè)結(jié)束,獲取短信驗(yàn)證碼結(jié)束。獲取用戶主動(dòng)發(fā)短信內(nèi)容結(jié)束會(huì)回調(diào)900004狀態(tài)碼,表示loading結(jié)束。App側(cè)根據(jù)狀態(tài)碼添加對(duì)應(yīng)的指示器。
/**
* 認(rèn)證中斷
* @note 必選回調(diào)
* @note 認(rèn)證流程臨時(shí)中斷,App可根據(jù)不同事件顯示對(duì)應(yīng)的提示信息
* @note 觸發(fā)條件:1. 未勾選隱私協(xié)議框,進(jìn)行認(rèn)證;2. 驗(yàn)證手機(jī)號(hào)碼輸入格式錯(cuò)誤,3.SDK開始加載某個(gè)節(jié)點(diǎn)和結(jié)束加載某個(gè)節(jié)點(diǎn),4、相關(guān)的接口可用校驗(yàn)
* @param handler handler
* @param event 中斷原因
*/
- (void)onVerifyInterrupt:(AlicomFusionAuthHandler *)handler
event:(AlicomFusionEvent *)event;
場(chǎng)景事件回調(diào)
/**
* 場(chǎng)景事件回調(diào)
* @note 可選回調(diào),包括SDK內(nèi)所有event通知,例如場(chǎng)景流程中各個(gè)界面點(diǎn)擊事件、界面跳轉(zhuǎn)事件、錯(cuò)誤事件等等
* @note 本回調(diào)接口僅做事件通知,不可再此回調(diào)內(nèi)處理業(yè)務(wù)邏輯
* @param handler handler
* @param event 點(diǎn)擊事件,具體定義參考AlicomFusionEvent.h
*/
- (void)onAuthEvent:(AlicomFusionAuthHandler *)handler
eventData:(AlicomFusionEvent *)event;
AlicomFusionAuthUIDelegate
一鍵登錄自定義UI
/**
* 一鍵登錄自定義UI
* @note 自定義一鍵登錄相關(guān)UI界面,一鍵登錄界面不可100%完全自定義,請(qǐng)通過AlicomFusionNumberAuthModel參數(shù)進(jìn)行修改
* @param handler handler
* @param templateId 模板id
* @param nodeId 節(jié)點(diǎn)ID
* @param model 自定義UI屬性
*/
- (void)onPhoneNumberVerifyUICustomDefined:(AlicomFusionAuthHandler *)handler
templateId:(NSString *)templateId
nodeId:(NSString *)nodeId
UIModel:(AlicomFusionNumberAuthModel *)model;
短信驗(yàn)證碼認(rèn)證自定義UI
如果自定義了發(fā)送按鈕,發(fā)送按鈕的點(diǎn)擊事件請(qǐng)調(diào)用
verifyCodeBtnClick:checked:
方法進(jìn)行驗(yàn)證碼發(fā)送。如果自定義了提交按鈕,提交按鈕的點(diǎn)擊事件請(qǐng)調(diào)用
submitVerifyCodeBtnClick:code:
進(jìn)行驗(yàn)證碼提交。
/**
* 短信驗(yàn)證碼認(rèn)證自定義UI
* @note 短信驗(yàn)證碼界面相關(guān)UI修改
* @param handler handler
* @param templateId 模板ID
* @param nodeId 節(jié)點(diǎn)ID
* @param isAutoInput 手機(jī)號(hào)是否是自動(dòng)填充
* @param view 短信驗(yàn)證碼界面view
*/
- (void)onSMSCodeVerifyUICustomDefined:(AlicomFusionAuthHandler *)handler
templateId:(NSString *)templateId
nodeId:(NSString *)nodeId
isAutoInput:(BOOL)isAutoInput
view:(AlicomFusionVerifyCodeView *)view;
用戶主動(dòng)發(fā)短信認(rèn)證自定義UI
如果自定義了發(fā)送按鈕,發(fā)送按鈕的點(diǎn)擊事件請(qǐng)調(diào)用
gotoSendUpGoing:receiveNum:
方法進(jìn)行驗(yàn)證碼發(fā)送。如果自定義了已發(fā)送按鈕,提交按鈕的點(diǎn)擊事件請(qǐng)調(diào)用
upGoingAlreadySend
進(jìn)行認(rèn)證操作。
/**
* 上行短信認(rèn)證自定義UI
* @note 上行短信認(rèn)證界面相關(guān)UI修改
* @param handler handler
* @param templateId 模板ID
* @param nodeId 節(jié)點(diǎn)ID
* @param smsContent 短信內(nèi)容
* @param receiveNum 接收號(hào)碼
* @param view 上行短信認(rèn)證界面view
*/
- (void)onSMSSendVerifyUICustomDefined:(AlicomFusionAuthHandler *)handler
templateId:(NSString *)templateId
nodeId:(NSString *)nodeId
smsContent:(NSString *)smsContent
receiveNum:(NSString *)receiveNum
view:(AlicomFusionUpGoingView *)view;
navigationController自定義UI
/**
* navigationController自定義UI
* @note iOS特有
* @param handler handler
* @param templateId 模板ID
* @param nodeId 節(jié)點(diǎn)ID
* @param naviController navigationController
*/
- (void)onNavigationControllerCustomDefined:(AlicomFusionAuthHandler *)handler
templateId:(NSString *)templateId
nodeId:(NSString *)nodeId
navigation:(UINavigationController *)naviController;
使用示例
@interface AlicomFusionManager ()
@property (nonatomic, copy) NSString *currTemplateId;
@property (nonatomic, weak) UIViewController *currVC;
@property (nonatomic, assign) NSInteger reGetTime;
@property (nonatomic, assign) AlicomFusionNumberAuthModel *authmodel;
@property (nonatomic, strong) AlicomFusionVerifyCodeView *verifyView;
@property (nonatomic, strong) AlicomFusionUpGoingView *upGoingView;
@property (nonatomic, copy) NSString *smsContent;
@property (nonatomic, copy) NSString *receiveNum;
@end
@implementation AlicomFusionManager
+ (instancetype)shareInstance {
static AlicomFusionManager *instance = nil ;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (instance == nil) {
[AlicomFusionLog logEnable:YES];
instance = [[AlicomFusionManager alloc] init];
instance.reGetTime = 3;
}
});
return instance;
}
- (void)destory {
[self.handler destroy];
self.handler = nil;
self.isActive = NO;
}
- (void)start{
[AlicomFusionAuthTokenManager getAuthToken:^(NSString * _Nonnull tokenStr,NSString *errorMsg) {
if (errorMsg){
dispatch_async(dispatch_get_main_queue(), ^{
[AlicomFusionToastTool showToastMsg:errorMsg];
});
} else {
[self initFusionAuth];
}
}];
}
- (void)startSceneWithTemplateId:(NSString *)templateId viewController:(UIViewController *)controller{
self.currTemplateId = templateId;
self.currVC = controller;
[self.handler startSceneUIWithTemplateId:self.currTemplateId viewController:controller delegate:self];
}
- (void)stopScene{
[self.handler stopSceneWithTemplateId:self.currTemplateId];
}
- (void)initFusionAuth{
if (!self.handler){
NSString *tokenStr = [AlicomFusionAuthTokenManager shareInstance].authTokenStr;
AlicomFusionAuthToken *token = [[AlicomFusionAuthToken alloc] initWithTokenStr:tokenStr];
self.handler = [[AlicomFusionAuthHandler alloc] initWithToken:token schemeCode:DEMO_SCHEME_CODE];
[self.handler setFusionAuthDelegate:self];
}
}
- (void)dealWithPhone:(NSString *)phoneNum {
if (phoneNum.length < 11) {
[AlicomFusionToastTool showToastMsg:@"獲取手機(jī)號(hào)失敗"];
return;
}
if ([AlicomFusionTemplateId_100001 isEqualToString:self.currTemplateId]) {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:phoneNum forKey:kDEMO_UD_PHONE_NUM];
[ud synchronize];
[AlicomFusionToastTool showToastMsg:@"登錄成功"];
[self.handler stopSceneWithTemplateId:self.currTemplateId];
} else if ([AlicomFusionTemplateId_100002 isEqualToString:self.currTemplateId]) {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:phoneNum forKey:kDEMO_UD_PHONE_NUM];
[ud synchronize];
[AlicomFusionToastTool showToastMsg:@"修改手機(jī)號(hào)成功"];
[self.handler stopSceneWithTemplateId:self.currTemplateId];
} else if ([AlicomFusionTemplateId_100003 isEqualToString:self.currTemplateId]) {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSString *loginPhone = [ud objectForKey:kDEMO_UD_PHONE_NUM];
if ([phoneNum isEqualToString:loginPhone]) {
[AlicomFusionToastTool showToastMsg:@"手機(jī)號(hào)驗(yàn)證通過,可以去修改密碼了"];
[self.handler stopSceneWithTemplateId:self.currTemplateId];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if ([self.delegate respondsToSelector:@selector(verifySuccess)]){
[self.delegate verifySuccess];
}
});
} else {
[AlicomFusionToastTool showToastMsg:@"手機(jī)號(hào)驗(yàn)證不通過"];
[self.handler continueSceneWithTemplateId:self.currTemplateId isSuccess:NO];
}
} else if ([AlicomFusionTemplateId_100004 isEqualToString:self.currTemplateId]) {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:phoneNum forKey:kDEMO_UD_PHONE_NUM];
[ud synchronize];
[AlicomFusionToastTool showToastMsg:@"新手機(jī)號(hào)綁定成功"];
[self.handler stopSceneWithTemplateId:self.currTemplateId];
} else if ([AlicomFusionTemplateId_100005 isEqualToString:self.currTemplateId]) {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSString *loginPhone = [ud objectForKey:kDEMO_UD_PHONE_NUM];
if ([phoneNum isEqualToString:loginPhone]) {
[AlicomFusionToastTool showToastMsg:@"手機(jī)號(hào)驗(yàn)證通過"];
[self.handler stopSceneWithTemplateId:self.currTemplateId];
} else {
[AlicomFusionToastTool showToastMsg:@"手機(jī)號(hào)驗(yàn)證不通過"];
[self.handler continueSceneWithTemplateId:self.currTemplateId isSuccess:NO];
}
}
}
#pragma mark - AlicomFusionAuthDelegate
/**
* token需要更新
* @note 必選回調(diào),handler 初始化&歷史token過期前5分鐘,會(huì)觸發(fā)此回調(diào),由SDK維護(hù)token的生命周期
* @param handler handler
* @return token,APP更新最新token后,組裝AlicomFusionAuthToken返回給到SDK,SDK會(huì)通過此token進(jìn)行鑒權(quán)更新
*/
- (AlicomFusionAuthToken *)onSDKTokenUpdate:(AlicomFusionAuthHandler *)handler {
NSLog(@"%s,調(diào)用",__func__);
NSString *tokenStr = [AlicomFusionAuthTokenManager updateAuthToken];
AlicomFusionAuthToken *token = [[AlicomFusionAuthToken alloc] initWithTokenStr:tokenStr];
return token;
}
/**
* token鑒權(quán)成功
* @note 必選回調(diào),token鑒權(quán)成功后,才可以調(diào)用startScene接口拉起場(chǎng)景
* @param handler handler
*/
- (void)onSDKTokenAuthSuccess:(AlicomFusionAuthHandler *)handler {
NSLog(@"%s,調(diào)用",__func__);
self.isActive = YES;
self.reGetTime = 3;
}
/**
* token鑒權(quán)失敗
* @note 必選回調(diào),token初次鑒權(quán)失敗&token更新后鑒權(quán)失敗均會(huì)觸發(fā)此回調(diào)
* @note token鑒權(quán)失敗后,無法繼續(xù)使用SDK的功能,請(qǐng)銷毀SDK后重新初始化
* @param handler handler
* @param failToken 錯(cuò)誤token
* @param error 錯(cuò)誤定義
*/
- (void)onSDKTokenAuthFailure:(AlicomFusionAuthHandler *)handler
failToken:(AlicomFusionAuthToken *)failToken
error:(AlicomFusionEvent *)error {
NSLog(@"%s,調(diào)用:{\n%@}",__func__,error.description);
self.isActive = NO;
if (self.reGetTime > 0) {
NSString *tokenStr = [AlicomFusionAuthTokenManager updateAuthToken];
AlicomFusionAuthToken *token = [[AlicomFusionAuthToken alloc] initWithTokenStr:tokenStr];
[handler updateToken:token];
self.reGetTime --;
} else {
self.reGetTime = 3;
[self.handler destroy];
self.handler = nil;
[AlicomFusionAuthTokenManager shareInstance].authTokenStr = nil;
return;
}
}
/**
* 認(rèn)證成功
* @note 必選回調(diào)
* @note 可以使用號(hào)碼效驗(yàn)maskToken去APP Server做最終驗(yàn)證換取真實(shí)手機(jī)號(hào)碼,如果換取手機(jī)號(hào)失敗,可以通過SDK的continue接口繼續(xù)后續(xù)場(chǎng)景流程
* @param handler handler
* @param maskToken 號(hào)碼效驗(yàn)token
*/
- (void)onVerifySuccess:(AlicomFusionAuthHandler *)handler
nodeName:(nonnull NSString *)nodeName
maskToken:(NSString *)maskToken
event:(nonnull AlicomFusionEvent *)event {
NSLog(@"%s,調(diào)用.nodeName=%@",__func__,nodeName);
//換手機(jī)號(hào)
dispatch_async(dispatch_get_main_queue(), ^{
[AlicomFusionToastTool showLoading];
});
[AlicomFusionNetAdapter verifyTokenRequest:maskToken complete:^(id data,NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[AlicomFusionToastTool hideLoading];
if (data&&!error){
//保存手機(jī)號(hào)
if ([data isKindOfClass:NSDictionary.class]) {
NSString *verifyResult = ((NSDictionary *)data)[@"VerifyResult"];
if ([@"PASS" isEqualToString:verifyResult]) {
[self dealWithPhone:((NSDictionary *)data)[@"PhoneNumber"]];
} else if ([@"REJECT" isEqualToString:verifyResult] || [@"UNKNOW" isEqualToString:verifyResult]) {
if ([nodeName isEqualToString:AlicomFusionNodeNameNumberAuth]) {
[AlicomFusionToastTool showToastMsg:@"一鍵登錄失敗"];
} else if ([nodeName isEqualToString:AlicomFusionNodeNameVerifyCodeAuth]) {
[AlicomFusionToastTool showToastMsg:@"獲取手機(jī)號(hào)失敗,請(qǐng)檢查驗(yàn)證碼是否正確或是否過期"];
} else if ([nodeName isEqualToString:AlicomFusionNodeNameUpGoingAuth]) {
[AlicomFusionToastTool showToastMsg:@"獲取手機(jī)號(hào)失敗,請(qǐng)檢查短信是否發(fā)送成功"];
}
if (![AlicomFusionNodeNameVerifyCodeAuth isEqualToString:nodeName]) {
[self.handler continueSceneWithTemplateId:self.currTemplateId isSuccess:NO];
}
}
} else {
if (![AlicomFusionNodeNameVerifyCodeAuth isEqualToString:nodeName]) {
[self.handler continueSceneWithTemplateId:self.currTemplateId isSuccess:NO];
}
}
}else{
//結(jié)束認(rèn)證
[self.handler stopSceneWithTemplateId:self.currTemplateId];
[AlicomFusionToastTool showToastMsg:error.userInfo[NSLocalizedDescriptionKey] ?:@"操作失敗"];
}
});
}];
}
- (void)onHalfwayVerifySuccess:(AlicomFusionAuthHandler *)handler nodeName:(NSString *)nodeName maskToken:(NSString *)maskToken event:(nonnull AlicomFusionEvent *)event resultBlock:(void (^)(BOOL))resultBlock {
NSLog(@"%s,調(diào)用.nodeName=%@",__func__,nodeName);
dispatch_async(dispatch_get_main_queue(), ^{
[AlicomFusionToastTool showLoading];
});
[AlicomFusionNetAdapter verifyTokenRequest:maskToken complete:^(id data,NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[AlicomFusionToastTool hideLoading];
if (data&&!error){
//保存手機(jī)號(hào)
if ([data isKindOfClass:NSDictionary.class]) {
NSString *verifyResult = ((NSDictionary *)data)[@"VerifyResult"];
if ([@"PASS" isEqualToString:verifyResult]) {
[AlicomFusionToastTool showToastMsg:@"校驗(yàn)成功"];
if (resultBlock) {
resultBlock(YES);
}
} else if ([@"REJECT" isEqualToString:verifyResult] || [@"UNKNOW" isEqualToString:verifyResult]) {
[AlicomFusionToastTool showToastMsg:@"校驗(yàn)失敗"];
}
} else {
[AlicomFusionToastTool showToastMsg:@"校驗(yàn)失敗"];
}
}else{
[AlicomFusionToastTool showToastMsg:@"校驗(yàn)失敗"];
}
});
}];
}
- (void)onVerifyFailed:(AlicomFusionAuthHandler *)handler nodeName:(nonnull NSString *)nodeName error:(nonnull AlicomFusionEvent *)error {
NSLog(@"%s,nodeName=%@,調(diào)用:{\n%@}",__func__,nodeName,error.description);
if ([nodeName isEqualToString:AlicomFusionNodeNameVerifyCodeAuth]) {
if ([error.resultCode isEqualToString:AlicomFusionVerifyCodeFrequency] || [error.resultCode isEqualToString:AlicomFusionVerifyCodeRisk]) {
dispatch_async(dispatch_get_main_queue(), ^{
[AlicomFusionToastTool showToastMsg:error.resultMsg];
});
[self.handler continueSceneWithTemplateId:self.currTemplateId isSuccess:NO];
} else if ([AlicomFusionVerifyCodeAutoNumberShowFail isEqualToString:error.resultCode]) {
dispatch_async(dispatch_get_main_queue(), ^{
[AlicomFusionToastTool showToastMsg:error.resultMsg];
});
[self.handler stopSceneWithTemplateId:self.currTemplateId];
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[AlicomFusionToastTool showToastMsg:error.resultMsg];
});
}
} else {
[self.handler continueSceneWithTemplateId:self.currTemplateId isSuccess:NO];
}
}
/**
* 認(rèn)證結(jié)束
* @note 必選回調(diào),SDK認(rèn)證流程結(jié)束
* @param handler handler
* @param event 結(jié)束事件
*/
- (void)onTemplateFinish:(AlicomFusionAuthHandler *)handler event:(AlicomFusionEvent *)event {
NSLog(@"%s,調(diào)用:{\n%@}",__func__,event.description);
//結(jié)束認(rèn)證
[self.handler stopSceneWithTemplateId:self.currTemplateId];
}
- (void)onProtocolClick:(AlicomFusionAuthHandler *)handler protocolName:(NSString *)protocolName protocolUrl:(NSString *)protocolUrl event:(AlicomFusionEvent *)event
{
NSLog(@"%s,調(diào)用:{\n%@}",__func__,event.description);
AlicomFusionWebViewController *controller = [[AlicomFusionWebViewController alloc] initWithUrl:protocolUrl andUrlName:protocolName];
UINavigationController *navigationController = self.currVC.navigationController;
if (self.currVC.presentedViewController) {
//如果授權(quán)頁成功拉起,這個(gè)時(shí)候則需要使用授權(quán)頁的導(dǎo)航控制器進(jìn)行跳轉(zhuǎn)
navigationController = (UINavigationController *)self.currVC.presentedViewController;
}
[navigationController pushViewController:controller animated:YES];
}
- (void)onVerifyInterrupt:(AlicomFusionAuthHandler *)handler event:(AlicomFusionEvent *)event {
if ([event.resultCode isEqualToString:AlicomFusionStartLoading]) {
[AlicomFusionToastTool showLoading];
} else if ([event.resultCode isEqualToString:AlicomFusionEndLoading]) {
[AlicomFusionToastTool hideLoading];
} else {
[AlicomFusionToastTool showToastMsg:[NSString stringWithFormat:@"%@,%@", event.resultCode, event.resultMsg]];
}
}
/**
* 場(chǎng)景事件回調(diào)
* @note 可選回調(diào),SDK場(chǎng)景流程中各個(gè)界面點(diǎn)擊事件&界面跳轉(zhuǎn)事件等UI相關(guān)回調(diào)
* @note 本回調(diào)接口僅做事件通知,不可再此回調(diào)內(nèi)處理業(yè)務(wù)邏輯
* @param handler handler
* @param event 點(diǎn)擊事件,具體定義參考AlicomFusionEvent.h
*/
- (void)onAuthEvent:(AlicomFusionAuthHandler *)handler
eventData:(AlicomFusionEvent *)event {
NSLog(@"%s,調(diào)用:{\n%@}",__func__,event.description);
}
/**
* 填充手機(jī)號(hào),用于校驗(yàn)手機(jī)號(hào)是否和輸入的一致,或者重新綁定手機(jī)號(hào)場(chǎng)景自動(dòng)填充手機(jī)號(hào)
* @note 必選回調(diào),SDK內(nèi)置UI部分手機(jī)號(hào)
* @note 比如重置密碼場(chǎng)景,需要先填寫原手機(jī)號(hào)碼進(jìn)行第一步效驗(yàn),SDK需效驗(yàn)該填寫值是否為真實(shí)的原手機(jī)號(hào)碼,或者重新綁定手機(jī)號(hào)場(chǎng)景自動(dòng)填充手機(jī)號(hào)
* @param handler handler
* @param event 事件
* @return 返回當(dāng)前用戶正在使用的手機(jī)號(hào)用于下一步操作
*/
- (NSString *)onGetPhoneNumberForVerification:(AlicomFusionAuthHandler *)handler
event:(nonnull AlicomFusionEvent *)event {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
NSString *phoneNum = [ud objectForKey:kDEMO_UD_PHONE_NUM];
return phoneNum;
}
- (void)otherPhoneLoginClick {
[self.authmodel otherPhoneLogin];
}
#pragma mark - AlicomFusionAuthUIDelegate
- (void)onPhoneNumberVerifyUICustomDefined:(AlicomFusionAuthHandler *)handler
templateId:(nonnull NSString *)templateId
nodeId:(NSString *)nodeId
UIModel:(AlicomFusionNumberAuthModel *)model {
self.authmodel = model;
model.supportedInterfaceOrientations = UIInterfaceOrientationMaskPortrait;
model.presentDirection = AlicomFusionPresentationDirectionBottom;
model.suspendDisMissVC = NO;
model.navTitle = [[NSAttributedString alloc] initWithString:@"一鍵登錄"];
model.navColor = AlicomColorHex(0xEFF3F2);
model.logoIsHidden = YES;
model.numberColor = AlicomColorHex(0x262626);
model.numberFont = [UIFont systemFontOfSize:24];
NSDictionary *loginAttriDict = @{
NSFontAttributeName: [UIFont systemFontOfSize:16],
NSForegroundColorAttributeName: AlicomColorHex(0xFFFFFF)
};
NSMutableAttributedString *loginAttr = [[NSMutableAttributedString alloc] initWithString:@"一鍵登錄" attributes:loginAttriDict];
model.loginBtnText = loginAttr;
UIImage *unSelectImage = [AlicomFusionDemoUtil demoImageWithColor:AlicomColorHex(0x0064C8) size:CGSizeMake(ALICOM_FUSION_DEMO_SCREEN_WIDTH - 32, 44) isRoundedCorner:NO radius:0.0];
UIImage *selectImage = [AlicomFusionDemoUtil demoImageWithColor:AlicomColorHex(0x0064C8) size:CGSizeMake(ALICOM_FUSION_DEMO_SCREEN_WIDTH - 32, 44) isRoundedCorner:NO radius:0.0];
UIImage *heighLightImage = [AlicomFusionDemoUtil demoImageWithColor:AlicomColorHex(0x0064C8) size:CGSizeMake(ALICOM_FUSION_DEMO_SCREEN_WIDTH - 32, 44) isRoundedCorner:NO radius:0.0];
model.loginBtnBgImgs = @[unSelectImage, selectImage, heighLightImage];
NSDictionary *sloganAttriDict = @{
NSFontAttributeName: [UIFont systemFontOfSize:15],
NSForegroundColorAttributeName: AlicomColorHex(0x555555)
};
NSMutableAttributedString *sloganAttr = [[NSMutableAttributedString alloc] initWithString:@"阿里云為您提供認(rèn)證服務(wù)" attributes:sloganAttriDict];
model.sloganText = sloganAttr;
model.privacyOperatorIndex = 2;
model.privacyOne = @[@"用戶協(xié)議",@"https://terms.alicdn.com/legal-agreement/terms/product/20230213121650869/20230213121650869.html"];
model.privacyTwo = @[@"個(gè)人信息保護(hù)政策",@"https://terms.aliyun.com/legal-agreement/terms/suit_bu1_ali_cloud/suit_bu1_ali_cloud202112211045_86198.html?spm=a2c4g.11186623.0.0.72701a9edzzvbz"];
model.privacyConectTexts = @[@"、",@" 和 "];
model.privacyPreText = @"我已閱讀并同意 ";
model.privacyOperatorPreText = @"";
model.privacyOperatorSufText = @"";
model.privacyColors = @[AlicomColorHex(0x262626), AlicomColorHex(0x262626)];
model.privacyFont = [UIFont systemFontOfSize:14];
model.checkBoxIsHidden = NO;
model.checkBoxIsChecked = NO;
model.checkBoxWH = 21;
model.backgroundColor = AlicomColorHex(0xEFF3F2);
model.moreLoginActionBlock = ^{
NSLog(@"其他登錄方式");
};
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, ALICOM_FUSION_DEMO_SCREEN_WIDTH, 100)];
label.text = @"登錄";
label.textColor = AlicomColorHex(0x262626);
label.font = [UIFont systemFontOfSize:24];
[label sizeToFit];
model.nameLabel = label;
UIButton *otherLogin = [UIButton buttonWithType:UIButtonTypeCustom];
[otherLogin setTitle:@"其他手機(jī)號(hào)登錄" forState:UIControlStateNormal];
otherLogin.backgroundColor = UIColor.whiteColor;
[otherLogin setTitleColor:AlicomColorHex(0x262626) forState:UIControlStateNormal];
otherLogin.titleLabel.font = [UIFont systemFontOfSize:16];
[otherLogin addTarget:self action:@selector(otherPhoneLoginClick) forControlEvents:UIControlEventTouchUpInside];
model.otherLoginButton = otherLogin;
model.numberFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGFloat x = (screenSize.width - frame.size.width) * 0.5;
CGFloat y = 214;
CGRect rect = CGRectMake(x, y, frame.size.width, frame.size.height);
return rect;
};
model.sloganFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGFloat y = 252;
CGRect rect = CGRectMake(frame.origin.x, y, frame.size.width, frame.size.height);
return rect;
};
model.loginBtnFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGFloat y = 318;
CGRect rect = CGRectMake(frame.origin.x, y, frame.size.width, frame.size.height);
return rect;
};
model.nameLabelFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
return frame;
};
model.otherLoginButtonFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
return frame;
};
model.privacyFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGRect rect = CGRectMake(frame.origin.x, screenSize.height - 60 - ALICOM_FUSION_DEMO_STATUS_BAR_HEIGHT - frame.size.height - 34, frame.size.width, frame.size.height);
return rect;
};
model.customViewLayoutBlock = ^(CGSize screenSize, CGRect contentViewFrame, CGRect nameLabelFrame, CGRect otherLoginBtnFrame, CGRect navFrame, CGRect titleBarFrame, CGRect logoFrame, CGRect sloganFrame, CGRect numberFrame, CGRect loginFrame, CGRect changeBtnFrame, CGRect privacyFrame) {
};
model.customViewBlock = ^(UIView * _Nonnull superCustomView) {};
model.privacyAlertIsNeedShow = YES;
model.privacyAlertIsNeedAutoLogin = YES;
model.privacyAlertCornerRadiusArray = @[@4, @4, @4, @4];
model.privacyAlertTitleFont = [UIFont systemFontOfSize:16];
model.privacyAlertTitleColor = AlicomColorHex(0x262626);
model.privacyAlertContentFont = [UIFont systemFontOfSize:16];
model.privacyAlertContentAlignment = NSTextAlignmentCenter;
model.privacyAlertButtonTextColors = @[AlicomColorHex(0x0064C8), AlicomColorHex(0x0064C8)];
UIImage *imageUnselect = [AlicomFusionDemoUtil demoImageWithColor:AlicomColorHex(0xFFFFFF) size:CGSizeMake(ALICOM_FUSION_DEMO_SCREEN_WIDTH, 56) isRoundedCorner:NO radius:0.0];
UIImage *imageSelect = [AlicomFusionDemoUtil demoImageWithColor:AlicomColorHex(0xFFFFFF) size:CGSizeMake(ALICOM_FUSION_DEMO_SCREEN_WIDTH, 56) isRoundedCorner:NO radius:0.0];
model.privacyAlertBtnBackgroundImages = @[imageUnselect, imageSelect];
model.privacyAlertButtonFont = [UIFont systemFontOfSize:16];
model.tapPrivacyAlertMaskCloseAlert = NO;
model.privacyAlertMaskColor = AlicomColorHex(0x262626);
model.privacyAlertMaskAlpha = 0.88;
model.privacyAlertFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGRect rect = CGRectMake(27, (superViewSize.height - 200)*0.382, superViewSize.width - 54, 200);
return rect;
};
model.privacyAlertTitleFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGRect rect = CGRectMake(0, 32, frame.size.width, frame.size.height);
return rect;
};
model.privacyAlertPrivacyContentFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGRect rect = CGRectMake(24, 70, superViewSize.width - 48, frame.size.height);
return rect;
};
model.privacyAlertButtonFrameBlock = ^CGRect(CGSize screenSize, CGSize superViewSize, CGRect frame) {
CGRect rect = CGRectMake(0, superViewSize.height - 56, superViewSize.width, 56);
return rect;
};
}
- (void)onSMSCodeVerifyUICustomDefined:(AlicomFusionAuthHandler *)handler
templateId:(nonnull NSString *)templateId
nodeId:(NSString *)nodeId
isAutoInput:(BOOL)isAutoInput
view:(AlicomFusionVerifyCodeView *)view {
self.verifyView = view;
}
- (void)onSMSSendVerifyUICustomDefined:(AlicomFusionAuthHandler *)handler
templateId:(nonnull NSString *)templateId
nodeId:(NSString *)nodeId
smsContent:(nonnull NSString *)smsContent
receiveNum:(nonnull NSString *)receiveNum
view:(AlicomFusionUpGoingView *)view {
self.upGoingView = view;
self.smsContent = smsContent;
self.receiveNum = receiveNum;
NSLog(@"smsContent-====%@,receiveNum=-------%@",smsContent,receiveNum);
}
- (void)onNavigationControllerCustomDefined:(AlicomFusionAuthHandler *)handler
templateId:(nonnull NSString *)templateId
nodeId:(NSString *)nodeId
navigation:(UINavigationController *)naviController {
}
UI頁面接口說明
頁面 | 方法 |
狀態(tài)欄 | prefersStatusBarHidden: 狀態(tài)欄是否隱藏,默認(rèn)NO。 preferredStatusBarStyle: 狀態(tài)欄主題風(fēng)格,默認(rèn)UIStatusBarStyleDefault。 |
導(dǎo)航欄 |
|
Logo區(qū) |
|
Slogan |
|
掩碼欄 |
|
登錄按鈕 |
|
切換到其他方式 |
|
自定義控件區(qū)(如其他方式登錄) |
|
協(xié)議欄 |
|
其他全屏頁面屬性 |
|
標(biāo)題欄 |
|
其他彈窗頁面屬性 |
|
配置二次隱私協(xié)議彈窗頁面
方法 | 參數(shù)類型 | 說明 |
privacyAlertIsNeedShow | BOOL | 設(shè)置二次隱私協(xié)議彈窗是否顯示。取值:
說明 針對(duì)彈窗形式的授權(quán)頁暫時(shí)不支持二次隱私協(xié)議彈窗頁面。 |
privacyAlertIsNeedAutoLogin | BOOL | 設(shè)置二次隱私協(xié)議彈窗點(diǎn)擊按鈕是否需要執(zhí)行登錄。取值:
|
privacyAlertEntryAnimation | CAAnimation | 設(shè)置二次隱私協(xié)議彈窗顯示自定義動(dòng)畫,默認(rèn)從下往上位移動(dòng)畫。 |
privacyAlertExitAnimation | CAAnimation | 設(shè)置二次隱私協(xié)議彈窗隱藏自定義動(dòng)畫,默認(rèn)從上往下位移動(dòng)畫。 |
privacyAlertCornerRadiusArray | NSArray<NSNumber *> | 設(shè)置二次隱私協(xié)議彈窗的四個(gè)圓角值。 說明 順序?yàn)樽笊希笙拢蚁拢疑希枰畛?個(gè)值,不足4個(gè)值則無效,如果值小于等于0則為直角。 |
privacyAlertBackgroundColor | UIColor | 設(shè)置二次隱私協(xié)議彈窗背景顏色。 |
privacyAlertAlpha | CGFloat | 設(shè)置二次隱私協(xié)議彈窗透明度,默認(rèn)值1.0。 說明 設(shè)置范圍0.3~1.0。 |
privacyAlertTitleFont | UIFont | 設(shè)置二次隱私協(xié)議彈窗標(biāo)題文字大小。 |
privacyAlertTitleColor | UIColor | 設(shè)置二次隱私協(xié)議彈窗標(biāo)題文字顏色。 |
privacyAlertTitleBackgroundColor | UIColor | 設(shè)置二次隱私協(xié)議彈窗標(biāo)題背景顏色。 |
privacyAlertTitleAlignment | NSTextAlignment | 設(shè)置二次隱私協(xié)議彈窗標(biāo)題位置,默認(rèn)居中。 |
privacyAlertContentFont | UIFont | 設(shè)置二次隱私協(xié)議彈窗協(xié)議內(nèi)容文字大小,默認(rèn)值13 dp,最小值12 dp。 |
privacyAlertContentBackgroundColor | UIColor | 設(shè)置二次隱私協(xié)議彈窗協(xié)議內(nèi)容背景顏色。 |
privacyAlertContentColors | NSArray<UIColor *> | 設(shè)置二次隱私協(xié)議彈窗協(xié)議內(nèi)容顏色數(shù)組。 說明 默認(rèn)值[#999999,#1890FF],[非點(diǎn)擊文案顏色,點(diǎn)擊文案顏色]。 |
privacyAlertContentAlignment | NSTextAlignment | 設(shè)置二次隱私協(xié)議彈窗協(xié)議文案居中、居左,默認(rèn)居左。 |
privacyAlertBtnBackgroundImages | NSArray<UIImage *> | 設(shè)置二次隱私協(xié)議彈窗按鈕背景圖片。 |
privacyAlertButtonTextColors | NSArray<UIColor *> | 設(shè)置二次隱私協(xié)議彈窗按鈕文字顏色。 |
privacyAlertButtonFont | UIFont | 設(shè)置二次隱私協(xié)議彈窗按鈕文字大小,默認(rèn)值18 dp,最小值10 dp。 |
privacyAlertCloseButtonIsNeedShow | BOOL | 設(shè)置二次隱私協(xié)議彈窗關(guān)閉按鈕是否顯示。
|
privacyAlertCloseButtonImage | UIImage | 設(shè)置二次隱私協(xié)議彈窗右側(cè)關(guān)閉按鈕圖片。 |
privacyAlertMaskIsNeedShow | BOOL | 設(shè)置二次隱私協(xié)議彈窗背景蒙層是否顯示。
|
tapPrivacyAlertMaskCloseAlert | BOOL | 設(shè)置二次隱私協(xié)議彈窗點(diǎn)擊背景蒙層是否關(guān)閉彈窗。
|
privacyAlertMaskColor | UIColor | 設(shè)置二次隱私協(xié)議彈窗蒙版背景顏色。 |
privacyAlertMaskAlpha | CGFloat | 設(shè)置二次隱私協(xié)議彈窗蒙版透明度,默認(rèn)值0.5。 說明 設(shè)置范圍0.3~1.0。 |
privacyAlertOperatorColor | UIColor | 二次隱私協(xié)議彈窗協(xié)議運(yùn)營(yíng)商協(xié)議內(nèi)容顏色,優(yōu)先級(jí)最高,如果privacyAlertOperatorColors不設(shè)置,則取privacyAlertContentColors中的點(diǎn)擊文案顏色,privacyAlertContentColors不設(shè)置,則是默認(rèn)色。 |
privacyAlertOneColor | UIColor | 二次隱私協(xié)議彈窗協(xié)議1內(nèi)容顏色,優(yōu)先級(jí)最高,如果privacyAlertOneColors不設(shè)置,則取privacyAlertContentColors中的點(diǎn)擊文案顏色,privacyAlertContentColors不設(shè)置,則是默認(rèn)色。 |
privacyAlertTwoColor | UIColor | 二次隱私協(xié)議彈窗協(xié)議2內(nèi)容顏色,優(yōu)先級(jí)最高,如果privacyAlertTwoColors不設(shè)置,則取privacyAlertContentColors中的點(diǎn)擊文案顏色,privacyAlertContentColors不設(shè)置,則是默認(rèn)色。 |
privacyAlertThreeColor | UIColor | 二次隱私協(xié)議彈窗協(xié)議3內(nèi)容顏色,優(yōu)先級(jí)最高,如果privacyAlertThreeColors不設(shè)置,則取privacyAlertContentColors中的點(diǎn)擊文案顏色,privacyAlertContentColors不設(shè)置,則是默認(rèn)色。 |
privacyAlertPreText | NSString | 二次隱私協(xié)議彈窗協(xié)議整體文案,前綴部分文案,如果不賦值,默認(rèn)使用privacyPreText。 |
privacyAlertSufText | NSString | 二次隱私協(xié)議彈窗協(xié)議整體文案,后綴部分文案,如果不賦值,默認(rèn)使用privacySufText。 |
privacyAlertMaskEntryAnimation | CAAnimation | 設(shè)置二次隱私協(xié)議彈窗蒙版顯示動(dòng)畫,默認(rèn)漸顯動(dòng)畫。 |
privacyAlertMaskExitAnimation | CAAnimation | 設(shè)置二次隱私協(xié)議彈窗蒙版消失動(dòng)畫,默認(rèn)漸隱動(dòng)畫。 |
privacyAlertFrameBlock | PNSBuildFrameBlock | 設(shè)置二次隱私協(xié)議彈窗尺寸。 說明 默認(rèn)值:20 px,(SH-100)*0.5 px,(SW-40) px,100 px。不能超出父視圖,高度不小于50 px,寬度不小于0 px。 |
privacyAlertTitleFrameBlock | PNSBuildFrameBlock | 設(shè)置二次隱私協(xié)議彈窗標(biāo)題尺寸。 說明 不能超出父視圖,最小寬度100 px,最小高度15 px。 |
privacyAlertPrivacyContentFrameBlock | PNSBuildFrameBlock | 設(shè)置二次隱私協(xié)議彈窗內(nèi)容尺寸。 說明 從標(biāo)題頂部位置開始,不能超出父視圖。 |
privacyAlertButtonFrameBlock | PNSBuildFrameBlock | 設(shè)置二次隱私協(xié)議彈窗確認(rèn)并繼續(xù)按鈕尺寸。 說明 居中顯示,不能超出父視圖。最小寬度40 px,最小高度20 px。 |
privacyAlertCloseFrameBlock | PNSBuildFrameBlock | 設(shè)置二次隱私協(xié)議彈窗右側(cè)關(guān)閉按鈕尺寸。 說明 不能超出父視圖。 |
privacyAlertBtnContent | NSString | 二次隱私協(xié)議彈窗按鈕文字內(nèi)容。默認(rèn)值:同意。 |
privacyAlertTitleContent | NSString | 二次隱私協(xié)議彈窗標(biāo)題文字內(nèi)容。默認(rèn)值:請(qǐng)閱讀并同意以下條款。 |
privacyAlertCustomViewBlock | Block | 二次授權(quán)頁彈窗自定義控件添加。 |
privacyAlertCustomViewLayoutBlock | Block | 二次授權(quán)頁設(shè)置自定義添加控件的frame。 |