流程背景:
目前使用的方案中三方APP跳转微信小程序,有两种,一种是直接在微信后台管理中 生成固定的scheme,另一种是调用后端提供的接口,动态生成跳转地址,支持传参等;两种方式都不支持回跳到来源APP中,即有去无回;
同一微信开放平台帐号下 的移动应用,通过微信官方提供的API可进行拉取小程序的功能权限,并且在该场景下,微信小程序通过调用对应API可返回原移动应用,即有去有回
以上流程已经进行过成功测试试验
IOS案例:
- 开发前需要下载iOS开发工具包
- 代码接入
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案例
- 开发前需要下载iOS开发工具包
- 代码接入
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();
}
}
小程序跳回
- 支持场景值为1069
- 从其他小程序返回小程序(场景值1038)时(基础库 2.2.4 及以上版本支持)
- 小程序从聊天顶部场景(场景值1089)中的「最近使用」内打开时
- 长按小程序右上角菜单唤出最近使用历史(场景值1090)打开时
- 发现栏小程序主入口,「最近使用」列表(场景值1001)打开时(基础库2.17.3及以上版本支持)
- 浮窗(场景值1131、1187)打开时(基础库2.17.3及以上版本支持)
- 使用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,
})
},
})