ios telegram iOS telegram二次开发

news2024/11/22 17:59:20

二次开发方案
一、方案的确定及要实现的效果
       首先,最多的信息获取还是官方文档:https://lw.microstrategy.com/msdz/MobileUpdates/941_iOSU5/docs/mergedProjects/mobile_sdk/mobilesdk.htm

在本项目的一小部分,项目需求也是改来改去,最终需要实现的有:

应用图标的替换,应用名称的更改,启动图片的替换。
自定义登录界面。
登录时进行VPN验证,通过VPN服务器实现外网访问。
动态更改app的显示模式(文件夹目录或者默认报表)。
服务器集群,负载均衡的使用。


二、实现步骤
      1、需求一的实现很简单,图标更改在Images.xcassets里面直接替换。应用名称在Info_IPad.plist,Bundle display name对应的名字改掉就可以。

Home > Mobile SDK > Mobile SDK for iOS > Customizing MicroStrategy Mobile > Customization scenarios > Adding functionality with a custom Application Delegate。    

//
//  CustomAppDelegate.m
//  MicroStrategyMobile
//
//  Copyright (c) 2014 MicroStrategy Inc. All rights reserved.
//

#import "CustomAppDelegate.h"
#import "CustomLoginView.h"
#import <MicroStrategyMobileSDK/MSIAuthenticationModule.h>
#import <MicroStrategyMobileSDK/MSIAuthenticationPromptViewController.h>
#import <MicroStrategyMobileSDK/MSIMobileLoginManager.h>

@implementation CustomAppDelegate
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    BOOL res = [super application:application didFinishLaunchingWithOptions:launchOptions];
    //add custom logic here

    return res;
}
@end
 


      创建自定义的登录界面
Home > Mobile SDK > Mobile SDK for iOS > Customizing authentication > Client-side customizations > Programmatic customizations > Customizing login screen UI and authentication parameters programmatically

#import "CustomLoginView.h"

@implementation CustomLoginView

- (void) setupWithParameters:(NSDictionary*) promptViewParameters delegate:(id<MSIMobileLoginPromptViewDelegate>) delegate{

    [super setupWithParameters:promptViewParameters delegate:delegate];
    //After calling super, add additional code to setup the login UI, for example, add textfields, login buttons, background image

    
}

-(void) login{

    [self.delegate loginPromptView:self didInputAuthenticationParameters:@{

         @"username":([usernameTextField text]?[usernameTextField text]:EMPTY_STRING),

         @"password":([passwordTextField text]?[passwordTextField text]:EMPTY_STRING)

    }];

}

@end
 


      同时CustomAppDelegate.m文件也要做更改


//
//  CustomAppDelegate.m
//  MicroStrategyMobile
//
//  Copyright (c) 2014 MicroStrategy Inc. All rights reserved.
//

#import "CustomAppDelegate.h"
#import "CustomLoginView.h"
#import <MicroStrategyMobileSDK/MSIAuthenticationModule.h>
#import <MicroStrategyMobileSDK/MSIAuthenticationPromptViewController.h>
#import <MicroStrategyMobileSDK/MSIMobileLoginManager.h>
#import <MicroStrategyMobileSDK/ProjectInfo.h>

@implementation CustomAppDelegate

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    

    CustomLoginView *loginView = [[CustomLoginView alloc] initWithFrame:self.window.frame];

    MSIAuthenticationPromptViewController *loginViewController = [[MSIAuthenticationPromptViewController alloc] init];

    MSIAuthenticationModule *loginModule = [[MSIAuthenticationModule alloc] init];

    [[MSIMobileLoginManager sharedMobileLoginManager] setView:loginView controller:loginViewController module:loginModule forPromptType:AuthenticationPromptType];

    BOOL res = [super application:application didFinishLaunchingWithOptions:launchOptions];

    return res;
}

@end
 


Home > Mobile SDK > Mobile SDK for iOS > Customizing authentication > Client-side customizations > Programmatic customizations > Adding custom logic during authentication process。

到此,自定义登录界面已经实现。

    3、VPN服务器的认证和使用

      在iOS平台下,第三方应用程序通过调用移动应用安全认证开发包,使用证书与VPN服务器建立安全通道、以及单点登录等功能的实现。此处以北京国富安提供的开发包为例(具体细节参照国富安提供的开发文档)。

首先在iPad端安装移动认证证书(国富安提供)。
从Keychain里读取证书的cn。设置指定CN的证书,用此证书来做为身份。根据身份证书去跟vpn建立ssl连接。
根据VPN上配置的资源,启动本地监听的端口。
通过VPN调用服务器接口,获取配置文件。
显示登录界面,点击登录,根据证书和主账号密码进行统一安全认证。
认证成功返回的json,包含移动平台用户的主从账号信息,并会在Keychain中存储session,附应用可以通过Keychain中存储的session直接登录成功。
根据json信息,将主账号作为mstr用户账号和mstr用户默认密码一起,在应用内自动进行mstr的认证。成功界面会跳转,不跳转且无提示可以检查所使用mstr用户是否存在。(注:以移动平台主账号为账号,自定义统一的默认密码,提前在mstr创建用户)
      

/**
 *  2、从设备的钥匙串中获取证书,如果获取失败就返回nil;
 *  @return 证书或者nil
 */
-(NSString *)getCNfromKeychain
{
    NSMutableArray *outArray = [[NSMutableArray alloc] init];
    //获取证书cn项,因为有可能有多个证书,所以返回的是一个cn项的数组
    BOOL ret = [[CertHelper sharedInstance] getCNfromKeychain:outArray];
    if (!ret)
    {
        NSLog(@"获取证书失败,请联系管理员");
        return nil;
    }
    //一般情况只有一个证书
    NSString *certCN = [outArray objectAtIndex:0];
    return certCN;
}

if ([[CertHelper sharedInstance] setIndexbyCN:[self getCNfromKeychain]] == -1) //指定身份证书,返回-1表示设置指定证书失败
    {
        NSLog(@"your identity error");
    }

/**
 * 将身份证书和VPN做认证以登录VPN创建ssl连接
 *  @return VPN连接状态
 */
-(BOOL)connectVPN
{
    int iResult = -1;
    @try {
        iResult =[[L4Proxy sharedInstance] L4Proxy_ShakeHands_With_VPN:kVPNServer IPPort:kVPNPort username:@"" password:@""];
    }
    @catch (NSException *exception) {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:@"网络连接失败" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
        [alertView show];
        return NO;
    }
    @finally {
        if (iResult != 0) {
            NSLog(@"VPN 登录失败");
            return NO;
        }else {
            NSLog(@"VPN 登录成功");
            return YES;
        }
    }
}
 


// 3、获取监听端口
- (void)refreshConnectionInfo
{
    Constants* constants = [Constants sharedInstance];
    int webPort = [[L4Proxy sharedInstance] startLocalListen:@"BI-8080"];
    int port = [[L4Proxy sharedInstance] startLocalListen:@"BI-34952"];
    
    if(webPort > 0) {
        constants.webPort = webPort;
        constants.webServer = LOCAL_HOST;
    }
    
    if(port > 0) {
        constants.port = port;
        constants.iserver = LOCAL_HOST;
    }
}
 


/*
    5、6、点击登陆时调用的方法,将密码输入框的参数传过来,返回证书的主从账号信息,并会在Keychain中存储session,附应用可以通过调用相应的方法找到Keychain中存储的session直接登录成功
*/
- (Account *)ssoLogin:(NSString*) password
{
    int ssoLocalListenPort = [[L4Proxy sharedInstance] startLocalListen:ssoDesStr];
    if (ssoLocalListenPort > 0) {
        NSString *ssoHost = [NSString stringWithFormat:@"https://%@:%d",LOCAL_HOST, ssoLocalListenPort];
        NSString *retJson = [[SsoAuth sharedInstance] ssoAuthByCert:password withAppID:appId withServerAddress:ssoHost];
        NSLog(@"retJson = %@", retJson);
        NSError *error = nil;
        NSDictionary* result = [NSJSONSerialization JSONObjectWithData:[retJson dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
        NSLog(@"%@",result);
        if (error == nil && [@"success" isEqualToString:[result objectForKey:@"status"]]) {
            if(_account == nil) {
                _account = [[Account alloc] init];
            }
            _account.name = [result objectForKey:@"masterAccout"];
            _account.token = [result objectForKey:@"token"];
            return _account;
        } else {
            NSString *message = [result objectForKey:@"message"];
            if(message == nil)
            {
                message = @"请检查网络";
            }
            UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:nil cancelButtonTitle:@"确认" otherButtonTitles:nil, nil];
            [alertView show];
            
            NSLog(@"单点登录JSON解析失败, error:%@", error);
            return nil;
        }
    } else {
        return nil;
    }
}


4、动态更改app的显示模式(文件夹目录或者默认报表)

      上步的第4步骤,通过VPN调用服务器接口,获取配置文件,就是为了获取XML文件,每次启动都重新获取XML文件,所以可以在后台对XML文件内容进行更改,下次启动的时候,就会显示新更改的模式。

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSString *str = [NSString stringWithFormat:@"http://127.0.0.1:%d/MicroStrategy/findDocumentId?loginname=%@",constant.webPort,certName];
    NSString *urlString = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:urlString];
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *allStringdata = [NSURLConnection  sendSynchronousRequest:request returningResponse:&response error:&error];
    NSString *allString = [[NSString alloc] initWithData:allStringdata encoding:NSUTF8StringEncoding];
    //保存到沙盒目录下
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    NSString *xmlPath1 = [path stringByAppendingString:@"/Preferences.xml"];
    [allString writeToFile:xmlPath1 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    return YES;
}
 


         XML文件的获取,用浏览器登录mstr的mobile server,在mobile配置的地方,进行主屏幕的配置。之后会在mstr服务器的安装路径下找到一个刚生成的XML文件,例如,D:\apache-tomcat-6.0.36\webapps\MicroStrategyMobile\WEB-INF\xml\mobile。

         注意:取出的XML文件需要把服务器地址改为本地,端口号改为本地监听端口,项目地址不改。

      5、服务器集群,负载均衡的使用。

         负载均衡的使用,不需要app作何更改。由于VPN的使用app中只有本地地址127.0.0.1和监听端口号的存在。同样配置文件XML文件,里面的项目地址也无须更改。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1054697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机中对已经存在的磁盘扩容

如图所示&#xff0c;将虚拟机中已经存在的磁盘进行扩容&#xff1a; 扩展之后重启虚拟机&#xff0c;然后输入命令&#xff1a;lsblk进行查看虚拟机大小&#xff1b;发现这个盘的大小已经改变&#xff0c;如果想要给某个卷组或者逻辑卷进行扩容的话还需要将这个磁盘进行新建分…

osg实现鼠标框选

目录 1. 需求的提出 2. 具体实现 2.1. 禁止场景跟随鼠标转动 2.2. 矩形框前置绘制 3. 附加说明 3.1. 颜色设置说明 3.2.矩形框显示和隐藏的另一种实现 1. 需求的提出 有时需要在屏幕通过按住键盘上的某个键如Ctrl键且按住鼠标左键&#xff0c;拖出一个矩形&#xff0c;实现框…

MongoDB 2023年度纽约 MongoDB 年度大会话题 -- 企业级从传统数据库到NOSQL,你会更好...

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&…

Android学习之路(17) Android Adapter详解

Adapter基础讲解 本节引言 从本节开始我们要讲的UI控件都是跟Adapter(适配器)打交道的&#xff0c;了解并学会使用这个Adapter很重要&#xff0c; Adapter是用来帮助填充数据的中间桥梁&#xff0c;简单点说就是&#xff1a;将各种数据以合适的形式显示到view上,提供 给用户看…

读取一张图片各种颜色占比

提问之初 <small> 读取一张图片各种颜色占比 /storage/emulated/0/Pictures/Screenshots/Screenshot_20230725_195440.jpg有趣优雅热情沉着的代码与注释/每行每行 from PIL import Image # 导入PIL大法&#xff0c;这是处理图像的必备神器# 图片路径&#xff0c;此处为…

2023年哪款PDF虚拟打印机好用?

PDF文档想必大家都不陌生&#xff0c;在工作中经常会用到该格式的文档&#xff0c;那么有哪些方法能制作PDF文档呢&#xff1f;一般都是借助PDF虚拟打印机的&#xff0c;那么有哪些好用的软件呢&#xff1f; pdfFactory不仅为用户提供了丰富的PDF文档生成、打印功能&#xff0…

蓝桥杯每日一题2023.10.1

路径 - 蓝桥云课 (lanqiao.cn) 题目分析 求最短路问题&#xff0c;有多种解法&#xff0c;下面介绍两种蓝桥杯最常用到的两种解法 方法一 Floyd&#xff08;求任意两点之间的最短路&#xff09;注&#xff1a;不能有负权回路 初始化每个点到每个点的距离都为0x3f这样才能对…

00后老程序员不讲武德 偷袭 猿人学第二题解题记录 match/2

我是一个00后的老程序员&#xff0c;半夜00点有个Python群友发来一个题目&#xff0c;我以为是leetcode算法题呢&#xff0c;这不轻而易举、手到擒来、简简单单、有手就行&#xff0c;哪怕是博利叶排序我也能招架得住啊&#xff0c;结果发来一个链接。 题发出来了&#xff0…

GD32F10X ----RTC

1. RTC的简介 STM32 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相应软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC 模块和时钟配置…

BUUCTF-WEB-刷题记录

题目地址 https://buuoj.cn/challenges[HITCON 2017]SSRFme 代码理解 进入主页后发现是代码审计/ escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数— 抑制错误输出 mkdir — 创建目录 chdir 更改目录 shell_exec — 通过 shell 环境执行命令&#x…

第5章-宏观业务分析方法-5.3-主成分分析法

5.3.1 主成分分析简介 主成分分析是以最少的信息丢失为前提,将原有变量通过线性组合的方式综合成少数几个新变量;用新变量代替原有变量参与数据建模,这样可以大大减少分析过程中的计算工作量;主成分对新变量的选取不是对原有变量的简单取舍,而是原有变量重组后的结果,因此…

Spring注册Bean系列--方法1:@Component

原文网址&#xff1a;Spring注册Bean系列--方法1&#xff1a;Component_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法&#xff1a;Component。 注册Bean的方法我写了一个系列&#xff0c;见&#xff1a;Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘…

C++代码示例:排列数简单生成工具

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;编译和运行命令结果总结参考资料作者的话 前言 C代码示例&#xff1a;排列数简单生成工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) …

PHP 数码公司运营管理系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 数码公司运营管理系统系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php 数码公司运营管理系统 代码 https://download.csdn.net/download/qq_41…

实战教程:如何在API监控中实现高效报警和通知

问题 因一业务需要&#xff0c;想要对API服务接口添加一些监控&#xff0c;以帮助跟踪应用程序的性能、问题和用户活动等。实现监控的方式有多种多样的方式&#xff0c;以下是一些常用的方法&#xff1a; 日志记录&#xff1a; 在应用程序中添加详细的日志记录&#xff0c;包括…

如何开发一个微信小程序

微信小程序是微信公众平台推出的一种全新的应用形态&#xff0c;它具有跨平台、小巧、高效等特点&#xff0c;深受用户喜爱。 一直想学习开发小程序&#xff0c;最近找了一个教程来看&#xff0c;发现原生小程序写起来还是挺简单的&#xff0c;主要分为以下几步。 准备开发环境…

SpringCloud Alibaba - Sentinel 限流规则(案例 + JMeter 测试分析)

目录 一、Sentinel 限流规则 1.1、簇点链路 1.2、流控模式 1.2.1、直接流控模式 1.2.2、关联流控模式 a&#xff09;在 OrderController 中新建两个端点. b&#xff09;在 Sentinel 控制台中对订单查询端点进行流控 c&#xff09;使用 JMeter 进行测试 d&#xff09;分…

C语言 Cortex-A7核 PWM实验

1 实验目的 驱动开发板蜂鸣器风扇、马达进行工作 2 代码 pwm.h #ifndef __PWM_H__ #define __PWM_H__ #include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_ti…

网页一直跳转到国家反诈中心页面

很明显&#xff0c;我进入的是vscode的官方下载地址。 但是一直会出现反诈中心的拦截 我们需要在控制面板中&#xff0c;找到网络&#xff0c; 将Internet 协议版本 4 (TCP/IPv4)的属性改成 使用下面的DNS 服务地址(E)&#xff1a;8.8.8.8 这样就可以正常访问相关的页面了

【day10.01】使用select实现服务器并发

用select实现服务器并发&#xff1a; linuxlinux:~/study/1001$ cat server.c #include <myhead.h>#define ERR_MSG(msg) do{\printf("%d\n",__LINE__);\perror(msg);\ }while(0)#define PORT 8880#define IP "192.168.31.38"int main(int argc, c…