iOS版MSTR Client登录壳改造策略一(分应用的实现方法)

MSTR的iOS版本目前没有提供自定义登录页面的功能,而往往企业内部应用(尤其是中国的企业)对于这一块特别看重,于是有了今天的话题"自定义登录壳"。
分应用的实现方法是我们起初想到的方法,其大致思路就是独立开发一个带有登录画面的登录壳程序,在"登录"按钮的事件处理方法中调用openURL方法,启动并传递用户名密码信息到MSTR Client应用,随后将一些自定义参数传递给通过WCE自定义过的MicroStrategyMobile工程,这样就完成了一次完整的登录操作。

具体的关键点实现步骤如下:

1.编写登录壳应用,在登录事件中添加如下代码

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"应用程序url启动前缀://?evt=2048001&documentID=随便找个文档的id*%@*%@", username, password]]];

这里传递的username,password对应的是mstr中用户(便于区分下文中把它称作MSTR角色)的用户名、密码,如果应用很多用户的权限是一致的,那么从节能减排的角度出发,在调用这个方法之前做一步用户名、密码到MSTR角色用户名和密码的映射,最后把MSTR角色的用户名、密码传给MSTR Client就可以了。(注:分割符'*'的选择,根据具体的MSTR角色的用户名和密码来定)

【补:这里的username如果是中文的话,记得通过其它变量传递到delegate中,因为中文的参数会导致mstr client程序无法激活。2013-6-27】

2.改造MSTR Client程序

2.1新建一个m文件扩展MSTRMobileAppDelegate,引用如下:

#import "MSTRMobileAppDelegate.h"
#import </usr/include/objc/objc-class.h>
#import "MicroStrategyMobileSDK/Generic.h"
@implementation MSTRMobileAppDelegate (Extension)

2.2在applicationShouldLaunch方法中swizzling自定义openURL方法,swizzling代码如下:

Method myReplacementMethod = class_getInstanceMethod([self class], @selector(my_application:openURL:sourceApplication:annotation:));
   
Method originMethod = class_getInstanceMethod([self class], @selector(application:openURL:sourceApplication:annotation:));
   
method_exchangeImplementations(myReplacementMethod, originMethod);

2.3my_application:openURL方法的定义,代码如下:

NSArray *components = [[url description] componentsSeparatedByString:@"*"];  
   
NSString *userid = [[NSString alloc] initWithString:(NSString *)[components objectAtIndex:1]];
NSString *password = [[NSString alloc] initWithString:(NSString *)[components objectAtIndex:2]];
   
NSString *urlString = [[NSURL URLWithString:[NSString stringWithString:@"应用程序url启动前缀://MicroStrategyMobile中配置的Mobile连接"]] retain];
   
//需要升级ios client端的版本
SDKEnvSettings *sdkEnvSettings = [Generic getSDKEnvSettings];
sdkEnvSettings.isUserDeviceUUID = YES;
    
[sdkEnvSettings setServerParam:userid forKey:@"myuserid"]; 
[sdkEnvSettings setServerParam:password forKey:@"mypassword"];

//内存释放
[userid release];
userid = nil;

[password release];
password = nil;

if([self my_application:[UIApplication sharedApplication] openURL:url sourceApplication:nil annotation:nil])
{
        return YES;
}

return NO;

3.MicroStrategyMobile WCE改造,具体的配置方法见MSTR sdk官方文档,修改MobileLoginTask如下:

public class MyMobileLoginTask extends MobileLoginTask {

     public MyMobileLoginTask() {
          super();
          // TODO Auto-generated method stub
     }

     protected void configureWebIServerSession(TaskRequestContext context,
               WebIServerSession wiss, String server, int port, String project,
               String login, String password, int authMode) throws TaskException {
          // TODO Auto-generated method stub
          String myuserid = context.getRequestKeys().getValue("myuserid");
          String mypassword = context.getRequestKeys().getValue("mypassword");

          if (myuserid == null || myuserid.equals("")) {
               myuserid = login;
          }

          if (mypassword == null || mypassword.equals("")) {
               mypassword = password;
          }
          super.configureWebIServerSession(context, wiss, server, port, project,
                    myuserid, mypassword, authMode);
     }

}

配置完,重启tomcat应用服务器。
通过这样的配置就可以实现登录壳的添加了。

优缺点:优点是思路简单清晰,不过最大的问题是用户需要安装两个应用,当然我们可以把MSTR Client这个应用设置为隐藏,这样的话从用户体验的角度来说就跟一个应用的体验是一样的,一般的需求这种策略就可以满足需求了。

在之后的工作中,想到了将两个应用合并的方法,稍后分享。

你可能感兴趣的:(ios,mstr,MicroStrategy,分应用,登录壳)