流程背景:

目前使用的方案中三方APP跳转微信小程序,有两种,一种是直接在微信后台管理中 生成固定的scheme,另一种是调用后端提供的接口,动态生成跳转地址,支持传参等;两种方式都不支持回跳到来源APP中,即有去无回;
同一微信开放平台帐号下 的移动应用,通过微信官方提供的API可进行拉取小程序的功能权限,并且在该场景下,微信小程序通过调用对应API可返回原移动应用,即有去有回

以上流程已经进行过成功测试试验

IOS案例:

  1. 开发前需要下载iOS开发工具包
  2. 代码接入
WXLaunchMiniProgramReq *launchMiniProgramReq = [WXLaunchMiniProgramReq object];
launchMiniProgramReq.userName = userName;  //拉起的小程序的username
launchMiniProgramReq.path = path;    拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
launchMiniProgramReq.miniProgramType = miniProgramType; //拉起小程序的类型
return  [WXApi sendReq:launchMiniProgramReq];

回调说明

-(void)onResp:(BaseResp *)resp 
{
     if ([resp isKindOfClass:[WXLaunchMiniProgramResp class]])
     {
          NSString *string = resp.extMsg;
          // 对应JsApi navigateBackApplication中的extraData字段数据
     }
}

iOS基本没多大问题,确认保证在同一公众平台账号下,基本不会遇到多大问题。

Android案例

  1. 开发前需要下载iOS开发工具包
  2. 代码接入
String appId = "wxd930ea5d5a258f4f"; // 填移动应用(App)的 AppId,非小程序的 AppID
IWXAPI api = WXAPIFactory.createWXAPI(context, appId);

WXLaunchMiniProgram.Req req = new WXLaunchMiniProgram.Req();
req.userName = "gh_d43f693ca31f"; // 填小程序原始id
req.path = path;                  拉起小程序页面的可带参路径,不填默认拉起小程序首页,对于小游戏,可以只传入 query 部分,来实现传参效果,如:传入 "?foo=bar"。
req.miniprogramType = WXLaunchMiniProgram.Req.MINIPTOGRAM_TYPE_RELEASE;// 可选打开 开发版,体验版和正式版
api.sendReq(req);

回调说明

WXEntryActivity中

public void onResp(BaseResp resp) {
    if (resp.getType() == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {
        WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) resp;
        String extraData =launchMiniProResp.extMsg; //对应小程序组件 <button open-type="launchApp"> 中的 app-parameter 属性
    }
}

坑较多,比较长遇到的就是app正常跳转到小程序,但是小程序点击按钮后无法返回app。

坑1:AndroidManifest.xml的配置

//在AndroidManifest.xml的WXEntryActivity中加入如下属性:
android:taskAffinity="your packagename"
android:launchMode="singleTask"

这里如果不加的话,小程序无法跳转回APP

坑2:WXEntryActivity实现IWXAPIEventHandler接口

public class WXEntryActivity extends Activity implements IWXAPIEventHandler

坑3:在onResp里面finish,不然WXEntryActivity是透明的,导致app无法操作

public void onResp(BaseResp resp) {
  if (resp.getType() == ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM) {
    WXLaunchMiniProgram.Resp launchMiniProResp = (WXLaunchMiniProgram.Resp) resp;
    String extraData = launchMiniProResp.extMsg; //对应小程序组件 <button open-type="launchApp"> 中的 app-parameter 属性
    LogUtils.i("小程序==" + extraData);
    finish();
  }
}

填坑5:在onCreate处理返回值

// IWXAPI 是第三方app和微信通信的openapi接口
private IWXAPI api;
@Override
protected void onCreate(Bundle bundle) {
  super.onCreate(bundle);
  // 通过WXAPIFactory工厂,获取IWXAPI的实例
  api = WXAPIFactory.createWXAPI(this, Constants.APP_ID, false);
  //注意:
  //第三方开发者如果使用透明界面来实现WXEntryActivity,需要判断handleIntent的返回值,如果返回值为false,则说明入参不合法未被SDK处理,应finish当前透明界面,避免外部通过传递非法参数的Intent导致停留在透明界面,引起用户的疑惑
  try {
  if (!api.handleIntent(getIntent(), this)) {
  finish();
  }
  } catch (Exception e) {
  e.printStackTrace();
  }
}

小程序跳回

  1. 支持场景值为1069
  • 从其他小程序返回小程序(场景值1038)时(基础库 2.2.4 及以上版本支持)
  • 小程序从聊天顶部场景(场景值1089)中的「最近使用」内打开时
  • 长按小程序右上角菜单唤出最近使用历史(场景值1090)打开时
  • 发现栏小程序主入口,「最近使用」列表(场景值1001)打开时(基础库2.17.3及以上版本支持)
  • 浮窗(场景值1131、1187)打开时(基础库2.17.3及以上版本支持)
  1. 使用button组件,open-type 的值设置为 launchApp。如果需要在打开 APP 时向 APP 传递参数,可以设置 app-parameter 为要传递的参数。通过 binderror 可以监听打开 APP 的错误事件。
//xml
<button open-type="launchApp" app-parameter="wechat" bindlaunchapp="launchAppSuccess" binderror="launchAppError">打开APP</button>


//js 
Page({
  launchAppSuccess(e) {
    console.log('success', e);
     wx.showModal({
       title: 'success',
       content: JSON.stringify(e)
     })
  },
  launchAppError (e) {
    console.log(e.detail.errMsg);
    wx.showModal({
      title: 'error',
      content: e.detail.errMsg,
    })
  },
})