日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

iOS客戶端接入

更新時(shí)間:

本文為您介紹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)。

  1. 創(chuàng)建工程。

    下載并安裝Xcode,點(diǎn)擊Create a new Xcode project,根據(jù)頁面引導(dǎo)創(chuàng)建一個(gè)新工程。

  2. 添加主庫和Network系統(tǒng)依賴庫。

    在菜單欄選擇Targets > General > Frameworks,Libraries, and Embedded Content,添加主庫AlicomFusionAuth.framework和系統(tǒng)依賴庫Network.framework

    說明
    • 請(qǐng)將AlicomFusionAuth.frameworkEmbed設(shè)置為Embed & Sign。

    • 請(qǐng)將Network.frameworkEmbed設(shè)置為Do Not Embed

    image

  3. BuildSettings設(shè)置。

    在菜單欄選擇TARGETS > BuildSettings > Other Linker Flags,Other Linker Flags增加-ObjC。image

  4. 添加ATAuthSDK.bundle資源文件。

    添加SDK文件夾中的ATAuthSDK.bundle資源文件到您的工程中,否則授權(quán)頁面默認(rèn)的圖片或icon不顯示。image

  5. 可選:友盟功能組件。

    若您之前已集成友盟基礎(chǔ)組件,則忽略此步驟,調(diào)用相關(guān)接口關(guān)閉融合認(rèn)證關(guān)聯(lián)的友盟插件,即可使用您現(xiàn)有友盟組件。

    若您還未集成友盟組件,請(qǐng)將SDK文件夾的UMCommon.frameworkUMDevice.framework集成到您的工程中,Embed設(shè)置為Do Not Embed。image

鑒權(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)用startSceneWithTemplateId(Context mContext,String templateId)startSceneWithTemplateId(Context mContext,String templateId,AlicomFusionAuthUICallBack callback)

說明

調(diào)用該接口的前提是沒有正在執(zhí)行的場(chǎng)景。

  • mContext:上下文。

  • callback:為可選參數(shù),用于自定義UI時(shí)使用,如果默認(rèn)使用內(nèi)置UI,該參數(shù)可不傳。

  • templateId:場(chǎng)景唯一標(biāo)識(shí)與控制臺(tái)場(chǎng)景ID唯一對(duì)應(yīng),用于決策啟動(dòng)哪個(gè)場(chǎng)景。

繼續(xù)場(chǎng)景

調(diào)用continueSceneWithTemplateId(String templateId,boolean isSuccess)

說明

調(diào)用該接口的前提是有正在執(zhí)行的場(chǎng)景。

  • templateId:場(chǎng)景唯一標(biāo)識(shí)與控制臺(tái)場(chǎng)景ID唯一對(duì)應(yīng),用于決策啟動(dòng)哪個(gè)場(chǎng)景。

  • isSuccess:當(dāng)前場(chǎng)景驗(yàn)證是否成功,是否成功決定繼續(xù)場(chǎng)景后的業(yè)務(wù)流程走向。

結(jié)束場(chǎng)景

調(diào)用stopSceneWithTemplateId(String templateId)

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)后或通過onVerifySuccess(String token,String nodeName,AlicomFusionEvent event)回調(diào),對(duì)接入方返回節(jié)點(diǎn)換號(hào)Token,接入方獲取到該Token后通過接口換取號(hào)碼。

中途獲取Token成功

中途獲取Token成功的回調(diào),在AlicomFusionTemplateId_100002場(chǎng)景下驗(yàn)證當(dāng)前手機(jī)號(hào)節(jié)點(diǎn)觸發(fā),回調(diào)onHalfWayVerifySuccess(String nodeName, String maskToken,AlicomFusionEvent event,HalfWayVerifyResult verifyResult)

在接入方驗(yàn)證完成當(dāng)前手機(jī)號(hào)后,通過verifyResult告知SDK驗(yàn)證結(jié)果,SDK將根據(jù)該結(jié)果執(zhí)行之后的流程。

獲取Token失敗

如果SDK在某個(gè)節(jié)點(diǎn)獲取Token失敗,通過onVerifyFailed(AlicomFusionEvent error,String nodeName)接入方在收到該回調(diào)后,可以用continueSceneWithTemplateId(String templateId,boolean isSuccess)接口選擇下一節(jié)點(diǎn)的驗(yàn)證,或通過stopSceneWithTemplateId(String templateId)結(jié)束當(dāng)前場(chǎng)景,采用其他方案進(jìn)行驗(yàn)證。

場(chǎng)景結(jié)束

回調(diào)onTemplateFinish(AlicomFusionEvent event),結(jié)束場(chǎng)景內(nèi)的所有節(jié)點(diǎn)。

接入方調(diào)用stopSceneWithTemplateId(String templateId)結(jié)束當(dāng)前場(chǎng)景。

交互流程詳解

完整的功能交互流程請(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)航欄

  • navIsHidden: 設(shè)置導(dǎo)航欄是否隱藏。

  • navColor: 設(shè)置導(dǎo)航欄主題色。

  • navTitle: 設(shè)置導(dǎo)航欄標(biāo)題內(nèi)容、文字大小、顏色。

  • navBackImage: 設(shè)置導(dǎo)航欄返回圖片。

  • hideNavBackItem: 設(shè)置導(dǎo)航欄返回按鈕是否隱藏。

  • navMoreView: 導(dǎo)航欄右側(cè)自定義控件,可以在創(chuàng)建該VIEW時(shí)添加手勢(shì)操作,或者創(chuàng)建按鈕或者其他賦值給VIEW。

  • navBackButtonFrameBlock: 構(gòu)建導(dǎo)航欄返回按鈕的frame,view布局或者布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則默認(rèn)處理。

  • navTitleFrameBlock: 構(gòu)建導(dǎo)航欄標(biāo)題的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則默認(rèn)處理。

  • navMoreViewFrameBlock: 構(gòu)建導(dǎo)航欄右側(cè)more view 的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理。

  • privacyNavColor: 協(xié)議詳情頁導(dǎo)航欄背景顏色設(shè)置。

  • privacyNavTitleFont: 協(xié)議詳情頁導(dǎo)航欄標(biāo)題字體、大小。

  • privacyNavTitleColor: 協(xié)議詳情頁導(dǎo)航欄標(biāo)題顏色。

  • privacyNavBackImage: 協(xié)議詳情頁導(dǎo)航欄返回圖片。

Logo區(qū)

  • logoImage: logo圖片設(shè)置。

  • logoIsHidden: logo是否隱藏,默認(rèn)NO。

  • logoFrameBlock:構(gòu)建logo的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理。

Slogan

  • sloganText: 設(shè)置slogan文案,內(nèi)容、大小、顏色。

  • sloganIsHidden: 設(shè)置slogan是否隱藏、默認(rèn)不隱藏。

  • sloganFrameBlock: 構(gòu)建slogan的frame,view布局或者布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理。

掩碼欄

  • numberColor: 設(shè)置掩碼顏色。

  • numberFont: 設(shè)置掩碼字體大小設(shè)置,<16則不生效。

  • numberFrameBlock: 構(gòu)建號(hào)碼的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,只有x,y生效,不實(shí)現(xiàn)則按默認(rèn)處理,設(shè)置不能超出父視圖content view。

登錄按鈕

  • loginBtnText: 設(shè)置登錄按鈕文案、內(nèi)容、大小、顏色。

  • loginBtnBgImgs: 登錄按鈕背景圖片組,默認(rèn)高度50.0pt,@[激活狀態(tài)的圖片、失效狀態(tài)的圖片、高亮狀態(tài)的圖片]。

  • autoHideLoginLoading: 是否自動(dòng)隱藏點(diǎn)擊登錄按鈕之后授權(quán)頁上轉(zhuǎn)圈的loading,默認(rèn)為YES,在獲取登錄Token成功后自動(dòng)隱藏,如果設(shè)置為NO,需要自己手動(dòng)調(diào)用[[TXCommonHandler, sharedInstance] hideLoginLoading]隱藏。

  • loginBtnFrameBlock: 構(gòu)建登錄按鈕frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理,不能超出父視圖content view,height不能小于40,width不能小于父視圖寬度的一半。

切換到其他方式

  • changeBtnTitle: changeBtn標(biāo)題,內(nèi)容,大小,顏色。

  • changeBtnIsHidden: changeBtn是否隱藏,默認(rèn)NO。

  • changeBtnFrameBlock: 構(gòu)建changeBtn的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理。

自定義控件區(qū)(如其他方式登錄)

  • customViewBlock: 自定義控件添加,注意:自定義視圖的創(chuàng)建初始化和添加到父視圖都需要在主線程中。

  • customViewLayoutBlock: 每次授權(quán)頁布局完成時(shí)會(huì)調(diào)用該block,可以在該block實(shí)現(xiàn)里面設(shè)置自定義添加控件的frame。

  • 您可以在除了協(xié)議、掩碼、登錄按鈕之外的區(qū)域添加自定義控件。

協(xié)議欄

  • checkBoxImages: 設(shè)置checkBox圖片組,[uncheckedImg, checkedImg]。

  • checkBoxIsChecked: checkBox是否勾選,默認(rèn)NO。

  • checkBoxIsHidden: checkBox是否隱藏,默認(rèn)NO。

  • checkBoxWH: checkBox大小,高寬一樣,必須大于0。

  • privacyOne: 協(xié)議1,[協(xié)議名稱,協(xié)議Url], 注:三個(gè)協(xié)議名稱不能相同。

  • privacyTwo: 協(xié)議2,[協(xié)議名稱,協(xié)議Url], 注:三個(gè)協(xié)議名稱不能相同。

  • privacyThree: 協(xié)議3,[協(xié)議名稱,協(xié)議Url], 注:三個(gè)協(xié)議名稱不能相同。

  • privacyColors: 協(xié)議內(nèi)容顏色數(shù)組,[非點(diǎn)擊文案顏色,點(diǎn)擊文案顏色]。

  • privacyAligment: 協(xié)議文案支持居中,居左設(shè)置,默認(rèn)居左。

  • privacyPreText: 協(xié)議整體文案,前綴部分文案。

  • privacySufText: 協(xié)議整體文案,后綴部分文案。

  • privacyOperatorPreText: 運(yùn)營(yíng)商協(xié)議名稱前綴文案,僅支持<、(、[、{、(、【、『、。

  • privacyOperatorSufText: 運(yùn)營(yíng)商協(xié)議 >、)、]、}、)、】、』。

  • privacyFont: 協(xié)議整體文案字體大小,小于12.0 不生效。

  • privacyFrameBlock: 構(gòu)建協(xié)議整體(包括checkBox)的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理,如果設(shè)置的width小于checkBox的寬度則不生效,最小值為0,最大width,height為父視圖寬高,最終會(huì)根據(jù)設(shè)置進(jìn)來的width對(duì)協(xié)議文本進(jìn)行自適應(yīng),得到的size是協(xié)議空間的最終大小。

  • privacyOperatorColor:運(yùn)營(yíng)商協(xié)議內(nèi)容顏色 ,優(yōu)先級(jí)最高,如果privacyOperatorColors不設(shè)置,則取privacyColors中的點(diǎn)擊文案顏色,privacyColors不設(shè)置,則是默認(rèn)色。

  • privacyOneColor:協(xié)議1內(nèi)容顏色,優(yōu)先級(jí)最高,如果privacyOneColors不設(shè)置,則取privacyColors中的點(diǎn)擊文案顏色,privacyColors不設(shè)置,則是默認(rèn)色。

  • privacyTwoColor:協(xié)議2內(nèi)容顏色,優(yōu)先級(jí)最高,如果privacyTwoColors不設(shè)置,則取privacyColors中的點(diǎn)擊文案顏色,privacyColors不設(shè)置,則是默認(rèn)色。

  • privacyThreeColor:協(xié)議3內(nèi)容顏色,優(yōu)先級(jí)最高,如果privacyThreeColors不設(shè)置,則取privacyColors中的點(diǎn)擊文案顏色,privacyColors不設(shè)置,則是默認(rèn)色。

其他全屏頁面屬性

  • contentViewFrameBlock: 全屏、彈窗模式設(shè)置,授權(quán)頁面中,渲染并顯示所有空間的view,稱為content view,不實(shí)現(xiàn)該block默認(rèn)為全屏模式。

    * 實(shí)現(xiàn)彈窗的方案 x > 0 || y > 0, width < 屏幕寬度 || height < 屏幕高度。

  • supportedInterfaceOrientations: 橫屏、豎屏模式設(shè)置,注意:在劉海屏,UIInterfaceOrientationMaskPortraitUpsideDown 屬性慎用!

  • presentDirection: 授權(quán)頁面彈出方向,默認(rèn)PNSPresentationDirectionBottom。

標(biāo)題欄

  • alertTitleBarColor: 標(biāo)題欄背景顏色。

  • alertBarIsHidden: 標(biāo)題欄是否隱藏。

  • alertTitle: 標(biāo)題欄標(biāo)題內(nèi)容、大小、顏色。

  • alertCloseImage: 標(biāo)題欄右側(cè)關(guān)閉按鈕圖片設(shè)置。

  • alertCloseItemIsHidden: 標(biāo)題欄右側(cè)關(guān)閉按鈕是否顯示,默認(rèn)NO。

  • alertTitleBarFrameBlock: 構(gòu)建標(biāo)題欄的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理,實(shí)現(xiàn)時(shí)僅有height生效。

  • alertTitleFrameBlock: 構(gòu)建標(biāo)題欄的frame,view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理。

  • alertCloseItemFrameBlock: 構(gòu)建標(biāo)題欄右側(cè)關(guān)閉按鈕的frame、view布局或布局發(fā)生變化時(shí)調(diào)用,不實(shí)現(xiàn)則按默認(rèn)處理。

其他彈窗頁面屬性

  • contentViewFrameBlock: 全屏、彈窗模式設(shè)置,授權(quán)頁面中,渲染并顯示所有空間的view,稱content view,不實(shí)現(xiàn)該block默認(rèn)為全屏模式。

  • supportedInterfaceOrientations: 橫屏、豎屏模式設(shè)置,注意:在劉海屏,UIInterfaceOrientationMaskPortraitUpsideDown 屬性慎用!

  • presentDirection: 授權(quán)頁面彈出方向,默認(rèn)PNSPresentationDirectionBottom。

  • alertBlurViewColor: 底部蒙層背景色,默認(rèn)黑色。

  • alertBlurViewAlpha: 底部蒙層背景透明度,默認(rèn)0.5。

  • alertCornerRadiusArray: contentView的四個(gè)圓角值,順序?yàn)樽笊稀⒆笙隆⒂蚁隆⒂疑希枰畛?個(gè)值,不足4個(gè)值則無效,如果值<=0則為直角。

  • setTapAuthPageMaskClosePage:設(shè)置授權(quán)頁彈窗模式,點(diǎn)擊非彈窗區(qū)域關(guān)閉授權(quán)頁。true,關(guān)閉。false,不關(guān)閉。

配置二次隱私協(xié)議彈窗頁面

方法

參數(shù)類型

說明

privacyAlertIsNeedShow

BOOL

設(shè)置二次隱私協(xié)議彈窗是否顯示。取值:

  • NO(默認(rèn)值):表示不顯示。

  • YES:表示顯示。

說明

針對(duì)彈窗形式的授權(quán)頁暫時(shí)不支持二次隱私協(xié)議彈窗頁面。

privacyAlertIsNeedAutoLogin

BOOL

設(shè)置二次隱私協(xié)議彈窗點(diǎn)擊按鈕是否需要執(zhí)行登錄。取值:

  • NO:表示不需要執(zhí)行登錄。

  • YES(默認(rè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)閉按鈕是否顯示。

  • NO:表示隱藏。

  • YES(默認(rèn)值):表示顯示。

privacyAlertCloseButtonImage

UIImage

設(shè)置二次隱私協(xié)議彈窗右側(cè)關(guān)閉按鈕圖片。

privacyAlertMaskIsNeedShow

BOOL

設(shè)置二次隱私協(xié)議彈窗背景蒙層是否顯示。

  • NO:表示隱藏。

  • YES(默認(rèn)值):表示顯示。

tapPrivacyAlertMaskCloseAlert

BOOL

設(shè)置二次隱私協(xié)議彈窗點(diǎn)擊背景蒙層是否關(guān)閉彈窗。

  • NO:表示不關(guān)閉。

  • YES(默認(rè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。