赞
踩
APP里面的uniapp小程序要接入微信支付,但是支付的调起为实现统一管理是由APP原生调起支付,不是每个小程序自己实现。所以,支付完成的页面也是写在APP宿主原生页面的,涉及到小程序打开原生页面的跳转方式。
众所周知,常见的IOS页面跳转有present和push两种。
前者弹出的视图是模态视图,由UIViewController
管理的视图控制器堆栈。新弹出的页面可以看见上一个页面。
后者是由UINavigationController
管理的视图控制器堆栈,打开新视图都入栈,调用之前的视图则需要出栈。在window下同时只能显示一个ViewController。
为了实现新页面的全覆盖,我使用了push打开方式。为了保证小程序能push打开,修改APP宿主打开uniapp小程序的方式从默认DCUniMPOpenModePresent变成DCUniMPOpenModePush。
小程序打开的配置代码:
- // 初始化小程序的配置信息对象
- DCUniMPConfiguration *configuration = [[DCUniMPConfiguration alloc] init];
- /**
- 修改打开方式present变成push
- */
- configuration.openMode = DCUniMPOpenModePush;
- // 配置启动小程序时传递的参数
- configuration.extraData = @{ @"arguments":@"Hello uni microprogram" };
- // 启动小程序
- [DCUniMPSDKEngine openUniMP:k_AppId configuration:configuration completed:^(DCUniMPInstance * _Nullable uniMPInstance, NSError * _Nullable error) {
- if (uniMPInstance) {
- // success
- } else {
- // error
- }
- }];

在小程序打开的时候,使用push方式打开。
- //第二个页面
- PayResultVC *vc=[PayResultVC new];
- //当前小程序页面
- / 小程序打开状态,调用此方法可获取小程序对应的 DCUniMPViewController 实例
- UIViewController *currentVC=[DCUniMPSDKEngine getUniMPViewController];
- [currentVC.navigationController pushViewController:vc animated:YES];
优点:保证了全部新页面都是通过由UINavigationController
管理,保证了整个APP打开页面的统一性。
缺点:uniapp通过push方式打开的小程序侧滑退出会出现多层标题栏。如图:
解决方案一:
翻阅官方文档,通过uniapp代码修改小程序控制器标题栏显隐,结果侧滑还是会出现两个按钮。
- /// 注意:只有通过 push 的方式打开小程序才生效
- /// @param hidden 是否隐藏
- + (void)whenUniMPCloseSetNavigationBarHidden:(BOOL)hidden;
-
-
- /// 设置 push 打开方式小程序内是否自动控制原生导航栏的显隐(默认控制)
- /// @param isControl Bool
- + (void)setAutoControlNavigationBar:(BOOL)isControl;
官方代码文档地址:DCUniMPSDKEngine | uni小程序SDK
解决方案二:
修改项目控制页面跳转的UINavigationController
,判断若是小程序实例则隐藏,Debug模式下发现小程序打开未走过UINavigationController
。
方案失败。
默认打开uniapp的方式,不修改。
打开原生APP页面代码:
- //第二个页面
- PayResultVC *vc=[PayResultVC new];
- //当前小程序页面
- / 小程序打开状态,调用此方法可获取小程序对应的 DCUniMPViewController 实例
- UIViewController *currentVC=[DCUniMPSDKEngine getUniMPViewController];
- [currentVC presentModalViewController:vc animated:YES];
优点:没有push打开小程序侧滑出现的多个导航栏Bug。
缺点:打开的新页面无法全部覆盖上一层页面,有空隙。如图:
修改跳转模式,变成全屏模式。代码:
- //第二个页面
- PayResultVC *vc=[PayResultVC new];
-
- //模式要加在新打开的页面
- vc.modalPresentationStyle=UIModalPresentationFullScreen;
-
- //当前小程序页面
- / 小程序打开状态,调用此方法可获取小程序对应的 DCUniMPViewController 实例
- UIViewController *currentVC=[DCUniMPSDKEngine getUniMPViewController];
- [currentVC presentModalViewController:vc animated:YES];
可以全部覆盖上级页面,也没有多个导航栏的Bug。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。