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开发代码分享相关推荐

  1. ios nstimer实现延时_IOS_IOS开发代码分享之用nstimer实现倒计时功能,用nstimer实现倒计时功能,废话 - phpStudy...

    IOS开发代码分享之用nstimer实现倒计时功能 用nstimer实现倒计时功能,废话不多说,直接上代码,详细解释请参照注释 // [NSTimer scheduledTimerWithTimeIn ...

  2. MicroStrategy微策略助力企业成为”智能企业”

    原创: MicroStrategy微策略中国, Frank Wang 微策略企业级数据分析与移动应用   9月21日2018年 在数字化转型的趋势下, 数据分析与商务智能持续受到市场重视,如何运用各类 ...

  3. ios 开发 微信分享失败_一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员...

    ios 开发 微信分享失败 by Jordan LaGrone 乔丹·拉格隆(Jordan LaGrone) 一个失落的孩子如何在失败的情况下从失败变成了iOS开发人员 (How a lost kid ...

  4. [分享]错误“应用程序Xcode的这个版本不能与此版本的OS X配合使用”以及Mac源码和IOS开发资料分享

    [分享]错误"应用程序Xcode的这个版本不能与此版本的OS X配合使用"以及Mac源码和IOS开发资料分享 安装Xcode时,出现"应用程序Xcode的这个版本不能 ...

  5. iOS 开发代码规范

    前言: 最近新接手一个项目,代码无论是从基础的代码规范还是设计模式上来说,几乎没有任何规范性可言,都是自由奔放,随心所欲的写. 为了给团队整理一份iOS代码,自己先写一个版本. 一.规范制定说明 1. ...

  6. 德昂助力MicroStrategy微策略苏州峰会成功举办

    导语 2018年8月10日,MicroStrategy苏州用户峰会在苏州金鸡湖凯宾斯基大酒店成功举办.本次峰会包括上午主会场和下午三个分会场,吸引了近200名制造业领域专家.企业高管以及数据分析人员前 ...

  7. iOS开发 代码重构心得

    这段时间我处理了大量代码和业务逻辑的细节问题,特来总结一下重构中遇到的问题. 第一个让我觉得吓一跳的是代码的行数.功能没加多少,代码行数则快翻番了.我看到的最大的一个文件有将近2000行,而且这些代码 ...

  8. MicroStrategy 微策略 2022 招聘

    公司抵制恶性内卷,工作.学习.生活平衡,良性循环. GitHub - formulahendry/955.WLB: 955 不加班的公司名单 - 工作 955,work–life balance (工 ...

  9. iOS开发高级分享 - App间账号共享与SDK封装

    本篇博客就先封装一个LoginSDK, 让后将该SDK植入到两个App中(一个暂且叫做"App One", 另一个暂且称为"App Two").当App One ...

最新文章

  1. 有关CPU与内存的那些事
  2. mysql数据库的备份与还原
  3. 思维模型篇:数据分析必知必会的两个原则
  4. 【算法竞赛学习】心跳信号分类预测-数据分析
  5. leetcode674. 最长连续递增序列
  6. 准确率,召回率,F值,机器学习分类问题的评价指标
  7. ural 1066 uva 1555
  8. 如何判断stdin的数据类型
  9. TensorFlow人工智能入门教程之十一 最强网络DLSTM 双向长短期记忆网络(阿里小AI实现)...
  10. VBS 打开图片-幻灯片形式
  11. java 四分位算法_Java 四分位算法
  12. 苹果手机微信怎么接龙_【手机】微信接龙
  13. 家庭居室装修需做哪些项目
  14. springBoot 拦截器与过滤器
  15. Wireshark malformed packet
  16. Windows上解除宽带限速(网速明显提升)
  17. android系统重力感应传感器 方向控制与方向切换,android sensor orientation 方向传感器 重力感应...
  18. 计算机开始菜单打不开是什么原因,电脑开始菜单打不开怎么办_win7开始菜单点击无效解决方法...
  19. 鸿蒙符和无级符,《少年三国志》乾坤无极评析:乾坤闪避控制废,无极复活两将兴?...
  20. Ubuntu安装已下载了.deb文件的软件

热门文章

  1. 我就执行一个count(*)为什么这么慢?
  2. iPhone14Pro热销,但iPhone整体销量或下滑,库克的图谋失败了
  3. 嵌入式软件工程师笔试面试指南-C/C++
  4. 免费的oa办公系统好吗?
  5. ESP8266+RF433模块结合制作网络遥控器示例
  6. 超50%的新冠肺炎患者出现认知障碍,部分患者现抑郁症状
  7. 开发疣猪飞行摇杆A10C(第二章)
  8. 3CX邮箱服务器测试出现5.7.0 Denied错误
  9. WPS演示 里有超链接的文字怎么改变格式
  10. Python面型对象--重载运算符与动态添加属性