# M3唤起三方APP或被唤起开发方案

# 需求

关于APP相互唤起的场景分两种,不同客户有不同的需求 第一种:M3 APP唤起第三方APP,如唤起xx银行APP 第二种:第三方APP唤起M3,如客户的统一办公APP点击某个按钮唤起M3

以上不同场景如果出现无法唤起问题,需要针对问题做开发调试、甚至添加代码定制开发。

# 开发方案

# 第一种:M3唤起三方APP

# Android修改点

Android客户端,只需要找到M3源码文件:org.apache.cordova.CordovaWebViewImpl#interceptPay针对如下图所示位置进行定制开发适配即可:

定制开发工程师,可以在此处打断点调试,确认三方APP的URL请求协议是什么,做下相应适配:

1710133974038.png

# IOS修改点

Xcode打开IOS M3源码:

  1. 左侧文件列表找到M3-Info.plist,在文件中找到key:Queried URL Schemes,展开查看是否包含第三方本地程序的url Schemes,如没有,则添加三方url Schemes即可:

1710139580863.png

  1. 左侧文件列表找到config.xml,在文件中找到keyallow-navigation下是否包含第三方url scheme,没有则参考格式添加即可:
<allow-navigation href="weixin:*" />

1710139603444.png

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;
  }

1710139651944.png

  1. 如果是最新版本(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)
  }

1710139627645.png

# 第二种:三方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" 无误:

1710140386954.png

# 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的项,如没有,仿照添加。

1710139513197.png

创建人:het
修改人:lichaoj