您好,登錄后才能下訂單哦!
最近在做支付寶快捷支付和快捷登錄,如果手機端裝有“支付寶錢包”這個很正常,但是在手機端沒有裝支付寶錢包時按照支付寶提供文檔應該會出現H5頁面(網頁版)進行操作,但是會遇到調用API:
//scheme與info.plist注冊的URL Scheme保持一致
[[AlipaySDK defaultService] auth_V2WithInfo:signString
fromScheme:@"Bao"
callback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
//授權成功后ResultStatus為9000,AuthCode會在result中,需對其做解析
NSString *resultStr = resultDic[@"result"];
if (resultStr&&resultStr.length>0) {
NSArray *resultArr = [resultStr componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
NSArray *subResultArr = [subResult componentsSeparatedByString:@"="];
if ([subResultArr[0] isEqualToString:@"auth_code"]) {
NSLog(@"authCode = %@",subResultArr[1]);
_strAuthCode = [NSString stringWithFormat:@"%@",subResultArr[1]];
}
}
}
}];
發現H5頁面一直不會出現,剛開始一直以為這種情況是動畫沖突,或者是下載的別的第三方庫的沖突,就一個一個來排查,發現并不是這個問題,用xcode-new-project 新建一個工程,將支付寶demo中相關信息導入就可以,最后發現區別是 自己項目是用代碼來創建 UIWindow ,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];
}
而新建project /支付寶demo 是用storyboard 來創建window,
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return yes;
}
支付寶技術支持建議在調用API前 用代碼:
UIWindow *firstWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
firstWindow.hidden = NO;
獲取到project中windows 列表最底層的window 將其可見,然后在回調成功后再隱藏,
callback:^(NSDictionary *resultDic) {firstWindow.hidden = YES;}
這種做法確實H5頁面出現,如下圖:但是在iOS6.0系統上點擊輸入框鍵盤不會出現,iOS7.0以后,剛開始點輸入框不會出現多點幾下會出現,
此處打印:
DLog(@"%@",[[UIApplication sharedApplication] windows])
DLog(@"%@",[[UIApplication sharedApplication] keyWindow]);
windows
(
"<UIWindow: 0x1dd9c090; frame = (0 0; 320 480); hidden = YES; autoresize = W+H; layer = <UIWindowLayer: 0x1dd9dec0>>",
"<UIWindow: 0x1dd9fa80; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x1dd9f940>>",
"<UITextEffectsWindow: 0x1e965f20; frame = (0 0; 320 480); hidden = YES; opaque = NO; layer = <UIWindowLayer: 0x1e965e70>>"
)
keywindow <UIWindow: 0x1dd9fa80; frame = (0 0; 320 480); layer = <UIWindowLayer: 0x1dd9f940>>
會發現有兩個UIWindow出現,[0] ,[1對應keywindow]但是一般project 中只會有一個window,怎么會出現兩個?于是將以下代碼注釋掉,
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
項目還是可以正常運行,最后經排查原因是項目引用了main.storyboard ,所以在項目啟動時候會自動創建一個window(0x1dd9c090),之后我們又用代碼初始化一個self.window(0x1dd9fa80),并且將自己創建的self.window設置為主窗口(makekeyAndVisible),但是windows 列表中最底層的window(0x1dd9c090)并不是keywindow,所以導致H5頁面出現不了(因為支付寶H5頁面是show in windows[0]上而不是 show in keywindow 所以感覺支付寶SDK也需要優化),即使將windows[0].hidden = NO,H5頁面出現,鍵盤也不會出現,輸入框不能輸入,因為鍵盤彈出一定要在keywindow上顯示,之所以在>iOS7.0之后可以正常彈出鍵盤是因為,>iOS7.0之后,主窗口和次窗口是沒有區別的
在ios7以前中有區別:哪個是主窗口,后面設置為主窗口會把之前設置的覆蓋掉。(只有主窗口才能響應鍵盤的輸入事件)
解決辦法有兩種:
1、將firstwindow --windows[0](0x1dd9c090) 設置為主窗口,
[firstWindow makeKeyAndVisible];
2、將firstwindow == windows[0] 去掉:也就是project不引用main.storyboard,
將
project-->Targets-->General-->Main Interface框里內容main 置空,
或者 info.plist-->Main storyboard file base name 對應內容main 置空
或者 直接刪除引用main.storyboard
反正是項目中不再用main.storyboard就行。
這個時候一切都沒問題了,也不用代碼:
UIWindow *firstWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
firstWindow.hidden = NO;
[firstWindow makeKeyAndVisible];
firstWindow.hidden = YES;
因為現在就只有一個window了并且就是keywindow,到現在H5頁面也會展示,鍵盤也可以呼出。
當然如果項目創建UIWindow正常的話 是不會出現這個問題的。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。