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这个应用设置为隐藏,这样的话从用户体验的角度来说就跟一个应用的体验是一样的,一般的需求这种策略就可以满足需求了。
在之后的工作中,想到了将两个应用合并的方法,稍后分享。