# M3唤起三方APP或被唤起开发方案
# 需求
关于APP相互唤起的场景分两种,不同客户有不同的需求 第一种:M3 APP唤起第三方APP,如唤起xx银行APP 第二种:第三方APP唤起M3,如客户的统一办公APP点击某个按钮唤起M3
以上不同场景如果出现无法唤起问题,需要针对问题做开发调试、甚至添加代码定制开发。
# 开发方案
# 第一种:M3唤起三方APP
# Android修改点
Android客户端,只需要找到M3源码文件:org.apache.cordova.CordovaWebViewImpl#interceptPay针对如下图所示位置进行定制开发适配即可:
定制开发工程师,可以在此处打断点调试,确认三方APP的URL请求协议是什么,做下相应适配:
# IOS修改点
Xcode打开IOS M3源码:
- 左侧文件列表找到M3-Info.plist,在文件中找到key:Queried URL Schemes,展开查看是否包含第三方本地程序的url Schemes,如没有,则添加三方url Schemes即可:
- 左侧文件列表找到config.xml,在文件中找到keyallow-navigation下是否包含第三方url scheme,没有则参考格式添加即可:
<allow-navigation href="weixin:*" />
3)左侧文件列表搜索CMPBannerWebViewController+InterceptRequest.m,找到方法- (BOOL)customShouldOverrideLoadWithRequest:(NSURLRequest*)request navigationType:(WKNavigationType)navigationType
如果三方APP的url scheme比较特殊,不在代码适配范围内导致return YES了,则需要定制开发:添加判断如果是跳转的特定url scheme,则返回NO。
- (BOOL)customShouldOverrideLoadWithRequest:(NSURLRequest*)request navigationType:(WKNavigationType)navigationType
{
//原逻辑。。。
//添加代码
NSURL *url = request.URL;
if([url.scheme isEqualToString:@"目标scheme"]) {
BOOL bSucc = [[UIApplication sharedApplication] openURL:url];
if (!bSucc) {
// 可提示未安装目标应用
}
return NO;
}
//此处前面添加上述代码
return YES;
}
- 如果是最新版本(2024年1月发布)的IOS M3源码,则这一步不需要,如果是2023年获更早时期的代码,则需要做本步:
左侧文件列表搜索CMPCommonWebViewController.m,找到方法- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 方法内查找是否有如下代码,没有则在最后的返回前面添加如下代码
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
//原逻辑。。。
//添加代码
if (![url.scheme.lowercaseString hasPrefix:@"http"]){//其他scheme
if ([[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:nil];
decisionHandler(WKNavigationActionPolicyCancel);
return;
}
}
//此处前面添加上述代码
decisionHandler(WKNavigationActionPolicyAllow)
}
# 第二种:三方APP唤起M3
# Android修改点
# M3 URL Scheme信息
三方应用打开M3定义的打开app url为seeyon://m3, 调用者可以根据自己的业务逻辑完成登录认证,M3定义有标准穿透参数,如果三方平台按照M3定义的标准参数唤起,M3客户端将会对参数处理,按照下文(参数说明)进行一些特殊范式的登录(如:用户名/密码方式),如果按照其余的格式传递,M3将不会对参数处理,会直接封装后发送给后台登录认证接口。
Android的url scheme:按照url方式跳转url固定为 seeyon://m3, 带参数的跳转方式:seeyon://m3?loginParams=XXXXXXX
loginParams参数:调用登录方法所需要的参数为json格式(注意loginParams里面的值必须经过URLEncoder的方式转码),例如:
{
"name": "test1",
"password": "tpassword",
"ticket": "xxxxticket",
"ext":"扩张参数"
}
如果传递了name和password,M3将使用name为登录名称,password为密码,进行标准功能的登录。 如果传递了ticket,M3将按照A8标准的三方认证类SSOTicketLoginAuthentication.java类进行单点登录。 如果不传,M3客户端将会把整过loginParams以参数的形式传递给M3的登录接口,需要开发者按照A8登录集成功能进行集成(见示例3,服务器单点登录参考示例)。
自定义格式场景:如果调用者需要自定义参数,url scheme可以带自定义参数的跳转方式:seeyon://m3?key1=XXXXXXX&key2=XXXX&key3=XXXX, M3会将把所有的参数封装为一个json对象,以key为loginParams传递给后台登录接口。
# 三方唤起M3示例
本地程序调用方式:
方式一:
String params=”{
"name": "test1",
"password": "tpassword",
"ticket": "xxxxticket",
"ext": "扩张参数"
}”;
params =URLEncoder.encode(params,"utf-8");
String url = "seeyon://m3?loginParams="+params;
Intent in = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(in);
方式二:
String params=”{
"name": "test1",
"password": "tpassword",
"ticket": "xxxxticket",
"ext": "扩张参数"
}”;
params =URLEncoder.encode(params,"utf-8");
Intent in=new Intent("com.seeyon.cmp");
in.putExtra("loginParams", params");
startActivity(in);
Web页面调用方式:
String params=”{
"name": "test1",
"password": "tpassword",
"ticket": "xxxxticket",
"ext": "扩张参数"
}”;
params =URLEncoder.encode(params,"utf-8");
<a href="seeyon://m3?loginParams="+params>打开M3</a>
如果依然无法唤起,确保M3 APP是最新版本。随后再基于最新版本M3源码中进行代码检查,找到AndroidManifest文件,确保参数 android:scheme="seeyon" 无误:
# IOS修改点
第三方APP客户端唤起M3,则需要在三方源码中添加唤起代码,代码格式如下:
NSString *urlStr = @"seeyonM3Phone://m3?loginParams={ \"name\": \"zlcs1\", \"password\": \"123456\", \"ticket\": \"ticket\", \"serverUrl\": \" http://192.168.10.236:8085\", \"ext\":\"extent\" }";
NSURL *url = [NSURL URLWithString:[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
如果是三方Web页面唤起M3,则可以参考如下源码:
var params = "{" +
"\"name\": \"test1\"," +
"\"password\": \"tpassword\"," +
"\"serverUrl\": \"http://192.168.10.236:8085\"," +
"\"ticket\": \"xxxxticket\"," +
"\"ext\": \"扩张参数\"" +
"}";
params =URLEncoder.encode(params,"utf-8");
<a href="seeyonM3Phone//m3?loginParams={params}">打开M3</a>
如果依然无法唤起,确保M3 APP是最新版本。随后再基于最新版本M3源码中进行部分修改:M3源码使用XCode打开,在左侧文件列表搜索M3-Info.plist,找到key:URL types,逐级展开查看是否包含URL Schemes为seeyonM3Phone的项,如没有,仿照添加。