# 打开 App

此功能需要用户主动触发才能打开 APP,所以不由 API 来调用,需要用 open-type 的值设置为 launchApp<button> 组件的点击来触发。

当小程序从 APP 分享消息卡片的场景打开(场景值 1036)或 移动应用打开(场景值 1069),小程序会获得打开 APP 的能力,此时用户点击按钮可以打开分享该小程序卡片/拉起该小程序的 APP。即小程序不能打开任意 APP,只能 跳回 APP。

在一个小程序的生命周期内,只有在特定条件下,才具有打开 APP 的能力。

当小程序从 1069 和 1036 场景打开时,可以打开 APP。 当小程序从非 1036 和 1069 的场景值打开时,会在小程序框架内部会管理的一个状态,为 true 则可以打开 APP,为 false 则不可以打开 APP。这个状态的维护遵循以下规则:

  • 当小程序从 App 分享消息卡片(场景值1036) 或 移动应用打开(场景值 1069) 打开时,该状态置为 true。
  • 当小程序从以下场景打开时,保持上一次打开小程序时打开 App 能力的状态:
    1. 从其他小程序返回小程序(场景值1038)时
    2. 从QQ主界面-下拉列表(场景值1091)时
  • 当小程序从非以上场景打开时,不具有打开 APP 的能力,该状态置为 false。

# 使用方法

# 小程序端

需要将 <button> 组件 open-type 的值设置为 launchApp。如果需要在打开 APP 时向 APP 传递参数,可以设置 app-parameter 为要传递的参数。通过 binderror 可以监听打开 APP 的错误事件。

开发者需要在button组件中填充下列参数,才能正常使用:

  1. app-packagename:应用的包名 (安卓)
  2. app-bundleid:应用的bundleid (iOS)
  3. app-connect-id:QQ互联中的AppID

# 小程序代码示例

<button open-type="launchApp" app-packagename="com.tencent.qq" app-bundleid="com.tencent.qq" app-connect-id="101010101" binderror="launchAppError">
  打开APP
</button>
1
2
3
Page({
  launchAppError(e) {
    console.log(e.detail.errMsg)
  }
})
1
2
3
4
5

# error 事件参数说明

说明
invalid scene 调用场景不正确,即此时的小程序不具备打开 APP 的能力。

# app 端

APP 需要接入 互联sdk。 文档请参考 (https://wiki.connect.qq.com)

# iOS端

app-parameter获取方法如下:

在UIApplicationDelegate的实现中添加如下代码

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
    // 判断url.host
    if ([url.host isEqualToString:@"maLaunchApp"]) {
        // 获取appParameter
        NSURLComponents *components = [[NSURLComponents alloc] initWithString:url.absoluteString];
        [components.queryItems enumerateObjectsUsingBlock:^(NSURLQueryItem * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if ([obj.name isEqualToString:@"appParameter"]) {
                // 传递到客户端的appParameter经过url encode
                NSString *encodedValue = obj.value;
                // TODO: 将encodedValue 通过标准url decode还原
            }
        }];
        
    }
    
    return YES;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# Android端

app-parameter获取方法如下:

如果app-parameter的参数含有”path“,则通过Intent.ACTION_VIEW + path内容(Uri)的方式启动app。path为app端可识别的内容即可打开对应的页面。

  <button open-type="launchApp" 
    app-packagename="com.tencent.qq" 
    app-bundleid="com.tencent.qq" 
    app-connect-id="101010101"
    app-parameter="{'path':'Uri'}"(此处app-parameter参数要求为JSON格式)
    binderror="launchAppError">
  打开APP
</button>
1
2
3
4
5
6
7
8

如果app-parameter的参数不含有”path“,则通过Intent.ACTION_MAIN的方式启动app。参数在主activity的getIntent()中获取,key为“appParameter”,value透传app-parameter内容。

  <button open-type="launchApp" 
    app-packagename="com.tencent.qq" 
    app-bundleid="com.tencent.qq" 
    app-connect-id="101010101"
    app-parameter="test:123"
    binderror="launchAppError">
  打开APP
</button>
```html

1
2
3
4
5
6
7
8
9
10