JSAPI

Since 8.0

startApp

用于打开钱包内的其他appId,效果等同scheme方式,但结构更加清晰,很多参数也无需额外encode,因此支付宝客户端内推荐使用该接口。

使用方法

AlipayJSBridge.call('startApp', {
  appId: '20000042',
  param: {
    publicId: 'xxxxxx'
  },
  closeCurrentApp: false
}, function(result) {
  // noop
});

// 注意,如果要打开多个app实例:
// 请使用:appClearTop和startMultApp都放在param里
AlipayJSBridge.call('startApp', {
  appId: '20000067',
  param: {
    url: location.href,
    appClearTop: false,
    startMultApp: 'YES' // 9.9.3引入新参数进行多开,注意这个值是YES,而不是bool类型
  }
}, function(result) {
  // noop
});

代码演示

打开标题栏透明的应用

<h1>点击按钮查看效果</h1>
<a href="javascript:void(0)" class="btn dream">打开心愿储蓄</a>
<script>
function ready(callback) {
  // 如果jsbridge已经注入则直接调用
  if (window.AlipayJSBridge) {
    callback && callback();
  } else {
    // 如果没有注入则监听注入的事件
    document.addEventListener('AlipayJSBridgeReady', callback, false);
  }
}
ready(function(){
  document.querySelector('.dream').addEventListener('click', function() {
    AlipayJSBridge.call('startApp', {
      appId: '20000981',
      param: {
        url: '/www/dream-create.html',
        // 启动参数传入
        canPullDown: true,
        transparentTitle: 'auto'
      }
    }, function(result) {
      // noop
    });
  });
});
</script>

打开新应用并关闭当前应用

<h1>点击按钮打开新应用,当前应用会被关闭</h1>
<a href="javascript:void(0)" class="btn forest">打开蚂蚁森林</a>
<script>
function ready(callback) {
  // 如果jsbridge已经注入则直接调用
  if (window.AlipayJSBridge) {
    callback && callback();
  } else {
    // 如果没有注入则监听注入的事件
    document.addEventListener('AlipayJSBridgeReady', callback, false);
  }
}
ready(function() {
  document.querySelector('.forest').addEventListener('click', function() {
    AlipayJSBridge.call('startApp', {
        appId: '60000002',
        // 不传入url,就会使用app的默认配置的url
        param: {
          transparentTitle: 'auto'
        },
        closeCurrentApp: true
      }, function(result) {
        // noop
      });
  });
});
</script>

默认只开一个appId实例

<h1>尝试再打开当前页面,先退出当前应用,然后再次打开</h1>
<a href="javascript:void(0)" class="btn self">打开当前页面</a>
<script>
function ready(callback) {
  // 如果jsbridge已经注入则直接调用
  if (window.AlipayJSBridge) {
    callback && callback();
  } else {
    // 如果没有注入则监听注入的事件
    document.addEventListener('AlipayJSBridgeReady', callback, false);
  }
}
ready(function(){
  document.querySelector('.self').addEventListener('click', function() {
    AlipayJSBridge.call('startApp', {
      // 当前页面打开的时候,是通过通用应用20000067打开,
      // 因此在此startApp的时候,就会把其他的20000067关闭
      // 所以这个时候其实还是只有一个当前页面打开
      appId: '20000067',
      param: {
        url: location.href,
      },
      closeCurrentApp: false // 虽然是指定为false,但是还是会关闭当前页面
    }, function(result) {
      // noop
    });
  });
});
</script>

同一个appId多开

<h1>打开多个相同appId的应用</h1>
<a href="javascript:void(0)" class="btn multi">再开启一个应用</a>
<script>
function ready(callback) {
  // 如果jsbridge已经注入则直接调用
  if (window.AlipayJSBridge) {
    callback && callback();
  } else {
    // 如果没有注入则监听注入的事件
    document.addEventListener('AlipayJSBridgeReady', callback, false);
  }
}
ready(function() {
  document.querySelector('.multi').addEventListener('click', function() {
    AlipayJSBridge.call('startApp', {
      appId: '20000067',
      param: {
        url: location.href,
        appClearTop: false,
        startMultApp: 'YES' // 9.9.3引入新参数进行多开,注意这个值是YES,而不是bool类型
      }
    }, function(result) {
      // noop
    });
  });
});
</script>

API

AlipayJSBridge.call('startApp', {
  appId, param: {}, closeCurrentApp
}, fn)

入参

名称类型描述必选默认值版本
appIdstring钱包内应用IDY
paramdictionary启动应用的参数, 由具体业务应用定义N8.0时value仅支持字符
从8.1开始value增加对bool, int, double的支持
closeCurrentAppbool是否先退出当前app再启动新的app. 适用于页面用作中转页的情况N8.1
fnfunction调用失败后的回调函数N

错误

error描述
10指定appId无效;
11启动app失败;

使用注意

  • startApp是用来打开app的,因此其定位是app级别,这个和pushWindow不一样。
  • startApp打开一个app,默认情况下,假如当前这个app已经被打开了,那么会做一个类似于重启的操作。也就是说不会出现同时运行两个相同appid的实例。
  • 假如一个appId要运行多个实例,那么请在启动的scheme中添加appClearTop=false&startMultApp=YES选项。(请直接添加到scheme中,不要添加到webview_options,appClearTop是钱包框架解析,只解析scheme,不解析webview_options),注意:appClearTop=false 和startMultApp=YES 要写在 startApp的 param参数里。