最近在做支付宝支付时发现在未安装支付宝客户端的情况下,并不能跳转到H5支付页面进行支付,只是状态栏闪烁了一下后,状态栏信息由白色字体变成了黑色字体。后来发现原来是因为我在AppDelegate的代理方法中,用代码创建了一个window并设置为了keyWindow,但是却没有将Project ->Targets ->General ->MainInterface的main.storyboard入口置为空,导致APP出现了两个window从而把支付宝的H5页面个覆盖了。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window makeKeyAndVisible];
}
有两种方法可以解决这个问题:
-
我们只需要将Project ->Targets ->General ->MainInterface的main.storyboard入口置为空即可。
就是在调用支付API之前获取第一个window并设置其显示,然后在回调的block里再设置其隐藏(这种方法并不推荐)。代码如下:
// 获取底层的window
UIWindow *firstWindow = [[UIApplication sharedApplication] windows][0];
// 判断是否安装了支付宝客户端
NSURL * alipay_app_url = [NSURL URLWithString:@"alipay:"];
if (![[UIApplication sharedApplication] canOpenURL:alipay_app_url]) {
// 显示最底层window
firstWindow.hidden = NO;
}
// 调起阿里支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic){
/**回调成功后隐藏这个window*/
firstWindow.hidden = YES;
}
之所以不推荐这个方法,是因为它会导致我们APP主窗口的所有视图消失,变成黑色或者其他设置的颜色。
备注
还有一种可能就是像简友 6cb68282a5ce一样,项目里面集成了shareSDK,而shareSDK和支付宝的SDK冲突了, 把shareSDK换成最新的就可以了。在此感谢简友6cb68282a5ce所提供的问题和解决办法。