为什么要重写呢?因为使用它打开的页面在DFNavigationController中,会产生一些问题。
1.如何在前端不改任何代码的情况下,直接使starth5app从调用JsApiHandler4StartApp改为调用自己写的插件JsApiHandleriOSDIYStartApp ?
答:在内置插件列表Poseidon-Extra-Config.plist中,由原来的
改为
即可。
2.当然调试的时候可以这样,保险的做法是新写一个插件,前端调用参数不变,客户端来进行参数的处理。
前端传过来的跳转参数是:
- (void)handler:(NSDictionary *)data
context:(PSDContext *)context
callback:(PSDJsApiResponseCallbackBlock)callback
{
}
打印data
Printing description of data:
{
appId = 20120329;
param = {
param = {
};
readTitle = 0;
url = "/www/home.html";
};
}
原生的
- (UIViewController *)createH5ViewControllerWithNebulaApp:(NSDictionary *)params;
需要的参数格式为:
@{@"appid":data[@"appId"],
@"url": data[@"param"][@"url"],
@"param":param,
}
因此把前端传过来的参数中的appId直接放到param里面即可。
完整的代码:
//
// JsApiHandleriOSDIYStartApp.h
//
//
// Created by YYYFC on 2021/7/8.
// Copyright © 2021 Alibaba. All rights reserved.
//
#import <NebulaPoseidon/NebulaPoseidon.h>
NS_ASSUME_NONNULL_BEGIN
@interface JsApiHandleriOSDIYStartApp : PSDJsApiHandler
@end
NS_ASSUME_NONNULL_END
//
// JsApiHandleriOSDIYStartApp.m
//
//
// Created by YYYFC on 2021/7/8.
// Copyright © 2021 Alibaba. All rights reserved.
//
#import "JsApiHandleriOSDIYStartApp.h"
@implementation JsApiHandleriOSDIYStartApp
- (void)handler:(NSDictionary *)data
context:(PSDContext *)context
callback:(PSDJsApiResponseCallbackBlock)callback
{
[super handler:data context:context callback:callback];
//获取正确层级的导航控制器
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
DFNavigationController *dfNav = window.rootViewController;
UITabBarController *tabvc = dfNav.viewControllers[0];
UINavigationController *navc = tabvc.viewControllers[tabvc.selectedIndex];
//组装参数
NSDictionary *param = data[@"param"][@"param"];
NSDictionary *cParam = @{@"appId":data[@"appId"],
@"url": data[@"param"][@"url"],
@"param":param,
};
NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithDictionary:cParam];
[dict setObject:@NO forKey:@"showOptionMenu"];
[dict setObject:@NO forKey:@"readTitle"];
[dict setObject:@YES forKey:@"showProgress"];
//创建h5容器并跳转
[[MPNebulaAdapterInterface shareInstance]requestNebulaAppsWithParams:@{cParam[@"appId"]:@"0"} finish:^(NSDictionary *data, NSError *error) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
H5WebViewController *webVc = [[MPNebulaAdapterInterface shareInstance] createH5ViewControllerWithNebulaApp:dict];
[navc pushViewController:webVc animated:YES];
});
}];
callback(@{@"result":@"1"});
}
@end