用户有本身的app,但愿把报表的移动端【本文中以FineReport移动端为例】功能集成到他们的app里面去,而不须要安装两个app。Android端和IOS端的集成接口是不同的,下面咱们分开详述如何实现。html
1. 资源准备web
准备好IOS端集成FineReport App的资源文件,包括本身的IOS工程、FineReport提供的资源包。服务器
下载FineReport提供的集成资源包,解压至文件夹中,能够看到以下图所示的文件:微信
其中FRDemo和FRDemo_目录树是示例demo,说明文件夹中是使用说明,剩下的三个文件夹才是集成时须要依赖的资源包。app
framework&bundle:里面包含了真机和模拟器集成时所须要的framework和bundle资源文件,图片资源(IFImages.xcassets);函数
WeiXinSDK:微信的SDK;测试
BaiduMap:百度地图的SDKui
FRDemo:集成示例,能够经过设置服务器地址,报表路径,加载报表,即直接经过URL访问报表;this
FRDemo_目录树:集成示例2,能够登陆服务器,展现目录树,即经过发送用户名密码进行验证,验证成功以后直接显示FineReport的主页或者目录树。url
二、资源导入
在本身的项目中导入资源文件framework&bundle\模拟器\FineResource.bundle,添加framework&bundle\IFImages.xcassets到项目中,并在Build Phases——Link Binary With Libraries中添加下图所示的lib包:
其中FineSoft.framework是FineReport提供的资源文件,在解压文件夹的framework&bundle\真机\FineSoft.framework目录下。
同时,在项目中添加前面下载资源中的微信SDK和百度SDK,以下图:
三、集成使用FineReport App
资源都导入配置完成以后,就须要集成App了,IOS端集成App有两种方式,一个是直接经过URL集成服务器上的模板,另一个是经过发送用户名密码至服务器,验证经过以后,显示FineReport目录树。
3.1直接URL集成
直接URL集成报表,就是经过URL连接直接访问FineReport服务器上的报表。
在项目中使用IFEntryViewController加载报表,根据报表路径,服务器路径,预览类型建立IFEntryViewController对象。
引入头文件:
1. #import <FineSoft/IFEntryViewController.h>
根据服务器地址和报表路径生成IFEntryViewController:IFEntryViewController*entryVC = [[IFEntryViewController al-loc] initWithPath:path ServerUrl:url]:
reportPath:报表路径,如app/DetailedDrillA-phone.cpt;
serverUrl:服务器地址,如http://192.168.1.100:8075/WebReport/ReportServer;
viewType:预览类型,可选值有IFEntryViewTypePage(分页预览),IFEntryViewTypeWrite(填报预览),可选用,默认为分页预览;
parameters:报表传递的参数,可选用;
若是上述四个接口所有使用,则其使用方法为:
-(id)initWithPath:(NSString *)reportPath serverUrl:(NSString *)serverUrlviewType:(IFEntryViewType)viewType parameters:(NSDictionary *) params;
好比说URL集成一张在线app demo下的表单,直接预览,不传递参数,代码以下:
1. IFEntryViewController *entryVC = [[IFEntryViewController alloc] initWithPath:@"app/sales/orders.frm" serverUrl:@"http://www.finereporthelp.com:8889/app/ReportServer"];
其详细使用状况可查看资源包中的FRDemo示例
3.2集成目录树查看模板
集成目录树,就是指发送用户名密码至服务器验证以后,访问系统的目录树,查看系统下的全部模板。
在项目中使用IFEntryViewController加载报表。
其接口代码以下:
· 引入头文件
1. #import <FineSoft/IFFrameUtils.h>
2. #import <FineSoft/IFFrameDirectoryViewController.h>
· 登陆服务器
1. [IFFrameUtils logInto:DEFAULT_SERVERNAME serverUrl:url withUsername:username andPassword:password success:^{
2. //登陆成功,加载目录树
3. [IFFrameUtils loadReportTree:^(NSMutableArray *reportsArray) {
4. //加载成功,展现目录树
5. IFFrameDirectoryViewController *directoryVC = [[IFFrameDirectoryViewController alloc] initWithReportsArray:reportsArray];
6. [self.navigationController presentViewController:directoryVC animated:YES comple-tion:nil];
7. } failure:^(NSString *) {
8. }];
9. } failure:^(NSString *) {
10. }];
登陆服务器的各个参数含义:
serverName:服务器名称,如Demo服务器;
serverUrl:服务器地址,如http://192.168.1.100:8075/WebReport/ReportServer;
username:用户名;
password:密码;
success:登陆成功的回调函数(通常是加载目录树);
failure:登陆失败的回调函数。
其各个参数的使用方法为:+ (void)logInto:(NSString *) serverNameserverUrl:(NSString *)serverUrl withUsername:(NSString *)usernameandPassword:(NSString *)password success:(void (^)())success failure:(void(^)(NSString *))failure;
好比说集成在线app demo工程的目录树,代码以下:
1. #import <FineSoft/IFFrameUtils.h>
2. #import <FineSoft/IFFrameDirectoryViewController.h>
3. //登陆服务器
4. [IFFrameUtils logInto:@"Demo服务器" serv-erUrl:@"http://www.finereporthelp.com:8889/app/ReportServer" withUsername:@"demo" andPassword:@"demo" success:^{
5. //登陆成功,加载目录树
6. [IFFrameUtils loadReportTree:^(NSMutableArray *reportsArray) {
7. //加载成功,展现目录树
8. IFFrameDirectoryViewController *directoryVC = [[IFFrameDirectoryViewController alloc] initWithReportsArray:reportsArray];
9. [self.navigationController presentViewController:directoryVC animated:YES comple-tion:nil];
10. } failure:^(NSString *) {
11. }];
12. } failure:^(NSString *) {
13. }];
其详细使用状况可查看资源包中的FRDemo_目录树示例
四、注意事项
一、须要配合FR8.0或者FR7.1.1版本使用;
二、提供的示例FRDemo只能在真机上运行,如需在模拟器上运行,请替换framework&bundle/模拟器中的framework和bundle文件;
三、若是遇到百度地图的集成c文件冲突报错,能够将other linker flags中的-all_load改成-ObjC。
五、里打开原生报表
若是集成的方式是从webView上的html元素事件触发,打开原生报表,那么须要自定义WebView继承UIWebView,并重写- (BOOL) webView:(UIWebView *)webViewTshouldStartLoadWithRequest:(NSURLRequest *)requestnavigationType:(UIWebViewNavigationType)navigationType方法来实现。原理就是分析url,若是url是报表类型,就用EntryViewController打开报表。
示例可见:
1. - (BOOL) webView:(UIWebView *)webViewT shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
2. if(navigationType != UIWebViewNavigationTypeLinkClicked) {
3. return YES;
4. }
5. NSString *urlString = [[request URL] absoluteString];
6. NSMutableDictionary *urlDict = [IFFrameUtils analysisUrl:urlString];
7. if([urlDict contain:KEY_URL]) {
8. //说明是普通超链
9. IFWebViewController *toWebView = [[IFWebViewController alloc] initWithUrl:[urlDict objectForKey:KEY_URL]];
10. toWebView.title = @"连接";
11. [self iFPushVC:toWebView animated:YES];
12. } else {
13. //说明是报表类型的超链
14. IFEntryViewType viewType = IFEntryViewTypePage;
15. if([[urlDict objectForKey:KEY_OP] isEqualToString:KEY_VIEWTYPE_WRITE]) {
16. viewType = IFEntryViewTypeWrite;
17. }
18. IFEntryViewController *entryVC = [[IFEntryViewController alloc] initWithPath:[urlDict objectForKey:KEY_PATH] serverUrl:[urlDict objectForKey:SERVERURL_KEY] viewType:viewType];
19. entryVC.title = urlDict[KEY_PATH];
20. [self iFPushVC:entryVC animated:YES];
21. }
22. return NO;
23. }
六、测试
FineReport提供一个Demo地址供测试。
服务器地址:www.finereporthelp.com:8889/app/ReportServer;
用户名:demo;
密码:demo;
可用报表路径:
app/DetailedDrillA-phone.cpt
app/para-phone.cpt
app/DetailedDrill-pad.cpt
app/parapad.cpt
app/sales/sales.frm
app/sales/map.frm
app/sales/saleseffects.frm
app/sales/TOP6-pad.frm
app/sales/product.frm
app/sales/SWOT.frm
app/sales/orders.frm
app/sales/abc.frm app/financial/FinaceStatistic.frmapp/Operations/area.frm
......
1. 资源准备
准备好须要集成FineReport App的Android工程,并下载FineReport提供的集成资源包。
下载FineReport提供的集成资源包,将其解压,获得以下图所示几个文件:
将解压出来的libs目录和res目录拷贝须要集成的Android工程项目中,并将libs目录下的JAR包和armeabi目录做为依赖库引用到Android开发工程中,以下图:
2. 修改AndroidManifest.xml文件
打开本身工程下的AndroidManifest.xml文件,并将解压出来的FineReport提供的AndroidManifest.xml中的内容写入到本身工程下的配置文件中
3. 集成使用FineReport App
FineReport Android App提供了2种类型的接口:直接使用url访问服务器上的模板,以链接的形式集成至本身的App当中,另一种是使用目录入口集成,即经过验证用户名密码,登陆到FineReportApp的主页或者目录页。
3.1 URL直接集成
使用URL集成. 直接使用URL访问服务器工程模板,好比说咱们想要集成服务器下的WorkBook2.cpt模板,而且是填报的形式,那么,代码以下:
1. Intent intent = new Intent();
2. intent.putExtra("url","http://192.168.100.121:8075/WebReport/ReportServer?reportlet=WorkBook2.cpt&op=write");
3. intent.setClass(this, IntegrationActivity.class);
4. startActivity(intent);
注:op=write表示参数op为write填报模式,正常预览模板,不须要添加op参数。
3.2 使用目录欢迎入口集成
使用目录欢迎入口集成,直接登录报表主页或者目录就至关于将FineReport的App嵌入到本身的App当中,当须要进入到FineReport App的时候,只须要发送相应的用户名密码验证便可登陆到FineReportApp的主页或者目录页当中,接口以下:
1. Intent welcomeIntent = new Intent(this, LoadAppFromWelcomeActivity.class);
2. welcomeIntent.putExtra("username", "demo"); // 数据决策系统 用户名
3. welcomeIntent.putExtra("password", "demo"); // 数据决策系统 用户密码
4. welcomeIntent.putExtra("serverIp", "http://www.finereporthelp.com:8889/app/ReportServer"); // 数据决策系统 地址ip
5. welcomeIntent.putExtra("serverName", "demo服务器"); // 数据决策系统 名称
6. startActivity(welcomeIntent);
注:若是服务器系统中设置了主页,那么登陆完成以后就跳转到主页,若是没有设置主页,就直接显示目录页。