將報表移動端集成到自有移動端app方法【IOS、Android】

應用場景

用戶有本身的app,但願把報表的移動端【本文中以FineReport移動端爲例】功能集成到他們的app裏面去,而不須要安裝兩個app。Android端和IOS端的集成接口是不同的,下面咱們分開詳述如何實現。html

IOS端集成App

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

......

Android集成app

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);   

注:若是服務器系統中設置了主頁,那麼登陸完成以後就跳轉到主頁,若是沒有設置主頁,就直接顯示目錄頁。

相關文章
相關標籤/搜索