MicroStrategy(微策略) 一款优秀的数据可视化框架
https://www.microstrategy.com/
中文官网:https://www.microstrategy.com/cn
维基百科介绍:https://en.wikipedia.org/wiki/MicroStrategy
Microstrategy一直是GartnerMagicQuadrant评鉴中列为领先的前五大BI工具和服务厂家。MicroStrategy支持所有主流的数据库或数据源。MicroStrategy Mobile中区别于其他移动BI应用的地方是它支持多语言内容,离线分析功能,以及达到设定阈值或标准时发送通知的定制警报服务。
适用系统:Android、iOS
说明:
1、个人认为MSTR是所有移动BI工具里画面最酷炫、性能最好的,如果有企业经营数据可视化的业务需要,都建议集成MSTR。
2、本文只是记录个人使用MSTR实现功能的一些关键代码,不是写得步步到位的教程。要用好MSTR,您最重要的是在官网上仔细通读SDK,并下载官方dmg文件阅读里面的demo示例。
3,如果您公司没有使用MSTR的战略决策,也就是您没有使用MSTR的工作需求,那就不用研究它了,这里面有很多坑不说,关键是您学了也没任何鸟用,可以关掉这个页面了。
4、以下举例的类名不一定准确,请注意理解思路而不是copy名称去SDK里搜,容易找不到。
首先按官网https://www.microstrategy.com/us 中的介绍,集成好框架以后,具体应用场景代码简记如下:
1、集成时的坑、MSTR框架特性、开发时的各种坑
——官网教你集成环境时少写了一个webkit.framework, 所以怎么集成都是失败的,提示缺框架支持,加上这个就好了。这个毛病让我反复试了一两天。
——如果只有一个服务器,做简单集成时,connectionInfo.plist注意配置准确的主机信息,在APPDELEGATE.m里按官方demo的代码,先设置window,程序入口处用一行命令加载plist,就可以在最开始启动时配好MSTR的服务器环境。
——程序生命周期里每个地方都应按demo里写上对应的MSTR处理代码,MSTR是很霸道的框架,动不动就全面接管程序行为,漏掉就会出问题。如:
- (void)applicationDidBecomeActive:(UIApplication *)application {
[self.mstrAppDelegateUtils applicationDidBecomeActive:application];
}
当自定义一些程序行为时,也不要忘记了MSTR需要根据程序状态对自身进行处理,比如你想实现锁屏的话,在appdelegate.m里
-(void)lockScreen{
[self.mstrAppDelegateUtils applicationWillResignActive:[UIApplication sharedApplication]];
}
2、MSTR控制器页面两种不同的加载方式
一种是控制器直接继承MSTRObjectViewController,然后一句话调用loadObjectId: 就实现了页面加载,这种方式最简单,但是容易出毛病,反正我的项目里出了各种显示的bug,比如页面会连续推出两次,您可以先试试这么做,然后多测试,如果没问题就以这个为准,代码在官方demo里随便就看得到。
第二种是略详细一点的控制,既加了子控制器,也定义了视图和大小,能够实现详尽的控制,代码如下:
在你想展示MSTR的uiviewcontroller控制器里先声明
@property (strong, nonatomic) UIView *mMicroStrategyView;
@property (strong,nonatomic) MSTRObjectViewController *mMicroStrategyVC;
再实现
// 视图
self.mMicroStrategyView = [[UIView alloc] initWithFrame:CGRectMake(0, 20, KScreenWidth, KScreenHeight - 20)];
[self.view addSubview:self.mMicroStrategyView];
self.mMicroStrategyView.backgroundColor = [UIColor whiteColor];
[self.view bringSubviewToFront:self.mMicroStrategyView];
// 控制器
self.mMicroStrategyVC = [[MSTRObjectViewController alloc]initWithMode:ObjectVCMode];
[self addChildViewController:self.mMicroStrategyVC];
// 加载!
[self.mMicroStrategyVC loadMSTRView];
self.mMicroStrategyVC.view = self.mMicroStrategyView;
[self.mMicroStrategyVC didMoveToParentViewController:self];
// 抽取出的加载方法,用TRY防止异常崩溃
-(void)loadMSTRView{
// MSTR主要有两种页面,文档页面或报告页面,可以判断情况加载,给这个控制器传的NSString,如果有documentID,就是文档页面
if (_documentID) {
@try {
[self.mMicroStrategyVC loadWithObjectID:_documentID type:ObjectTypeDocumentDefinition];
} @catch (NSException *exception) {
[SVProgressHUD showErrorWithStatus:@"无法打开MSTR文档"];
} @finally {
}
}
// 如果有reportID参数,就是report页面
if (_reportID) {
@try {
[self.mMicroStrategyVC loadWithObjectID:reportID type:ObjectTypeReportDefinition];
} @catch (NSException *exception) {
[SVProgressHUD showErrorWithStatus:@"无法打开MSTR报表"];
} @finally {
}
}
}
3、MSTR分析页面参数配置
MSTRObjectViewController还有很多参数可以设置,只需从接口中获取相应的配置信息string,就可以了。主要参数是以下四个:
self.mMicroStrategyVC.valuePromptAnswers = valuePromptAnswers; // 右边是从接口获取并按参数分离出来的配置字段
self.mMicroStrategyVC.elementsPromptAnswers = elementsPromptAnswers;
self.mMicroStrategyVC.promptsAnswerXML = promptsAnswerXML;
self.mMicroStrategyVC.mode = (MSTRVCMode)[mode integerValue];
4、动态配置MSTR服务器参数(不用plist而是动态地从接口获取服务器信息并配置的方法)
如果你的业务需求是针对不同的企业用户群,动态地配置不同的MSTR服务器,那么就需要动态配置了
这个是高级功能,直接上代码:
出于适配的目的,删除了项目里很多逻辑判断,仅保留关键代码
#import "MicroStrategyMobileSDK/ApplicationLauncherController.h"
#import "MicroStrategyMobileSDK/MSIAppDelegateUtils.h"
#import "MicroStrategyMobileSDK/MSIPreferencesStore.h"
//MSTR SDK HEADER - 也引入,有备无患
#import "MSIGeneric.h"
#import "MSIDevicePreferences.h"
#import "MSIPreferencesStore.h"
#import "MSIProjectConfiguration.h"
#import "MSIProjectList.h"
#import "MSIServiceFactory.h"
@interface MSTRViewController (){
NSString *_sessionState;
}
-(void)setMSTRServerInfo{
[self.netManager GET:@"你的请求地址" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *infoArr = responseObject[@"data"]; // 看自定义的参数是啥了
// 获取服务器配置信息的数组
NSArray *mstrArr = [infoArr valueForKey:@"mstrMobileServerInfo"];
// 转化成根据服务器信息字段自定义的模型
MSTRInfo *info = [MSTRInfo mj_objectWithKeyValues:mstrArr[0]];
//动态配置MSTR
[self configMSTR: info];
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
}
/// 用MSTR自带的各个配置类,来配置服务器信息
- (void)configMSTR:(MSTRInfo *)mstrInfo
{
//MSIPreferencesStore这个类它用于访问设备首选项,创建设备首选项副本以进行修改,并将更新的设备首选项保存到文件。
MSIPreferencesStore *prefsStore = [MSIPreferencesStore preferencesStore ];
[prefsStore resetPreferences];
//MSIDevicePreferences保存所有MicroStrategy首选项,包括常规设置,连接设置,主屏幕设置等
MSIDevicePreferences *devicePreference = [ prefsStore preferencesCopy ];
WebServerList *webList = [ devicePreference getWebServers ];
// 创建实例
WebServerConfiguration *configuration = [[WebServerConfiguration alloc] init];
if ([mstrInfo.serverType isEqualToString:@"J2EE"]) {
configuration.type = 0; //J2EE = 0, DOTNET = 1
} else {
configuration.type = 1; //J2EE = 0, DOTNET = 1
}
configuration.name = mstrInfo.serverHost; //Use this property to get or set name of this web server. It can be host name or ip address.
configuration.port = [mstrInfo.serverPort integerValue]; //Use this property to get or set port of this web server
configuration.path = mstrInfo.serverContext;
configuration.requestType = mstrInfo.secureSchema;
[webList add:configuration];
//拿到Web服务器的所有项目的集合
MSIProjectList *prList = [configuration projects]; //拿到项目列表
MSIProjectConfiguration *projectConfig = [[MSIProjectConfiguration alloc] init];
projectConfig.serverName = mstrInfo.iserver; //Use this property to get or set the i-server name. It can be a host name or ip address.
projectConfig.serverPort = mstrInfo.iserverPort;
projectConfig.projectName = mstrInfo.project;
projectConfig.credentials.login = mstrInfo.loginname;
projectConfig.credentials.password = mstrInfo.password;
[prList add:projectConfig];
//保存结果并生效
[prefsStore storePreferences: devicePreference];
@try
{
//serverName 拿到webServer
//newProjectName 用户输入的projectName
MSIProjectInfo *projectInfo = [ URLLaunchHelper newProjectInfoWithServerName: mstrInfo.serverHost projectName: mstrInfo.project ];
NSLog(@"%@--projectInfo", projectInfo);
// getSessionState: will throw an exception if login was not successful.
if (1) { //服务器未连接
MSIConnectionManager *connectionManger = [[MSIMobileLoginManager sharedMobileLoginManager] getConnectionManager];
NSDictionary *dict = [connectionManger getConnection:@{@"projectInfo" : projectInfo}];
_sessionState = [dict objectForKey:@"sessionState"];
NSLog(@"%@ - 会话状态", _sessionState);
}
else //断开连接
{
}
}
@catch ( NSException *ex )
{
// Print exception information
NSLog( @"login failed" );
NSLog( @"Name: %@", ex.name );
NSLog( @"Reason: %@", ex.reason );
[SVProgressHUD showErrorWithStatus:[NSString stringWithFormat:@"%@", ex.reason]];
}
@catch ( id unhandledException ) // least specific type
{
NSLog( @"Login failed: unexpected errors!" );
NSLog( @"Description: %@", unhandledException );
[SVProgressHUD showErrorWithStatus:[NSString stringWithFormat:@"Login failed: unexpected errors:%@", unhandledException]];
}
@finally
{
// Sucessful Event Handling.
NSLog(@"配置成功! %@", _sessionState);
}
}
5、困了,待续
MicroStrategy(微策略)BI框架 iOS开发代码分享相关推荐
- ios nstimer实现延时_IOS_IOS开发代码分享之用nstimer实现倒计时功能,用nstimer实现倒计时功能,废话 - phpStudy...
IOS开发代码分享之用nstimer实现倒计时功能 用nstimer实现倒计时功能,废话不多说,直接上代码,详细解释请参照注释 // [NSTimer scheduledTimerWithTimeIn ...
- MicroStrategy微策略助力企业成为”智能企业”
原创: MicroStrategy微策略中国, Frank Wang 微策略企业级数据分析与移动应用 9月21日2018年 在数字化转型的趋势下, 数据分析与商务智能持续受到市场重视,如何运用各类 ...
- ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...
ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...
- [分享]错误“应用程序Xcode的这个版本不能与此版本的OS X配合使用”以及Mac源码和IOS开发资料分享
[分享]错误"应用程序Xcode的这个版本不能与此版本的OS X配合使用"以及Mac源码和IOS开发资料分享 安装Xcode时,出现"应用程序Xcode的这个版本不能 ...
- iOS 开发代码规范
前言: 最近新接手一个项目,代码无论是从基础的代码规范还是设计模式上来说,几乎没有任何规范性可言,都是自由奔放,随心所欲的写. 为了给团队整理一份iOS代码,自己先写一个版本. 一.规范制定说明 1. ...
- 德昂助力MicroStrategy微策略苏州峰会成功举办
导语 2018年8月10日,MicroStrategy苏州用户峰会在苏州金鸡湖凯宾斯基大酒店成功举办.本次峰会包括上午主会场和下午三个分会场,吸引了近200名制造业领域专家.企业高管以及数据分析人员前 ...
- iOS开发 代码重构心得
这段时间我处理了大量代码和业务逻辑的细节问题,特来总结一下重构中遇到的问题. 第一个让我觉得吓一跳的是代码的行数.功能没加多少,代码行数则快翻番了.我看到的最大的一个文件有将近2000行,而且这些代码 ...
- MicroStrategy 微策略 2022 招聘
公司抵制恶性内卷,工作.学习.生活平衡,良性循环. GitHub - formulahendry/955.WLB: 955 不加班的公司名单 - 工作 955,work–life balance (工 ...
- iOS开发高级分享 - App间账号共享与SDK封装
本篇博客就先封装一个LoginSDK, 让后将该SDK植入到两个App中(一个暂且叫做"App One", 另一个暂且称为"App Two").当App One ...
最新文章
- 有关CPU与内存的那些事
- mysql数据库的备份与还原
- 思维模型篇:数据分析必知必会的两个原则
- 【算法竞赛学习】心跳信号分类预测-数据分析
- leetcode674. 最长连续递增序列
- 准确率,召回率,F值,机器学习分类问题的评价指标
- ural 1066 uva 1555
- 如何判断stdin的数据类型
- TensorFlow人工智能入门教程之十一 最强网络DLSTM 双向长短期记忆网络(阿里小AI实现)...
- VBS 打开图片-幻灯片形式
- java 四分位算法_Java 四分位算法
- 苹果手机微信怎么接龙_【手机】微信接龙
- 家庭居室装修需做哪些项目
- springBoot 拦截器与过滤器
- Wireshark malformed packet
- Windows上解除宽带限速(网速明显提升)
- android系统重力感应传感器 方向控制与方向切换,android sensor orientation 方向传感器 重力感应...
- 计算机开始菜单打不开是什么原因,电脑开始菜单打不开怎么办_win7开始菜单点击无效解决方法...
- 鸿蒙符和无级符,《少年三国志》乾坤无极评析:乾坤闪避控制废,无极复活两将兴?...
- Ubuntu安装已下载了.deb文件的软件
热门文章
- 我就执行一个count(*)为什么这么慢?
- iPhone14Pro热销,但iPhone整体销量或下滑,库克的图谋失败了
- 嵌入式软件工程师笔试面试指南-C/C++
- 免费的oa办公系统好吗?
- ESP8266+RF433模块结合制作网络遥控器示例
- 超50%的新冠肺炎患者出现认知障碍,部分患者现抑郁症状
- 开发疣猪飞行摇杆A10C(第二章)
- 3CX邮箱服务器测试出现5.7.0 Denied错误
- WPS演示 里有超链接的文字怎么改变格式
- Python面型对象--重载运算符与动态添加属性