# 用其他应用打开

- 如开发者想实现在「其他应用打开」的列表中出现自家开发的 App，可参考下方操作实现
- 注意：开发者工具版本需为最新的 nightly，即版本 >= 1.06.2407252
- 以及 Android SDK >= 1.3.26；iOS SDK >= 1.3.36

## 操作步骤

1、打开微信开发者工具，前往 `project.miniapp.json` 且切换为 json 模式

2、Android 应用：在 `mini-android` 中新增下面的配置

```json
"mini-android": {
    "sdkVersion": "1.3.20",
    "openMimeTypes":[
      "application/pdf",//要打开的文件类型
      "image/*",//要打开的文件类型
      "可按需添加更多"
    ],
  }
```

iOS 应用：然后在 `mini-ios` 中新增下面的配置

```json
"openMimeTypes": [
      {
        "CFBundleTypeName": "AnyName",
        "LSHandlerRank": "Default",
        "LSItemContentTypes": [
          "public.image"
        ],
        "CFBundleTypeRole": "Viewer"
      }
    ],
```

字段说明：

- CFBundleTypeName 必填，openMimeTypes 是数组类型，给这个文件支持的数组每一项起一个别名
- CFBundleTypeRole 必填，身份，用来标识自己 app 可对这些文件处理的身份，Editor、Viewer、Shell、None
- LSHandlerRank 必填，用来决定 app 在文件分享可选的 app 列表中的顺序，声明应用程序优先级 Owner、Default、Alternate、None
- LSItemContentTypes 必填，支持的文件类型 UTI（苹果自己定义的文件类型）
- 更多文档请查阅苹果官方：https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-SW1

3、使用 `wx.miniapp.registOpenURL` 监听到通过文件打开 app 的事件

```js
  wx.miniapp.registOpenURL((param) => {
    console.log('regsitOpenUrl', param)
    // 通过 isFile 来标识是否为文件，此时的 param.data.url 为文件在手机文件系统中的绝对路径
    if (param.data.isFile) {
        // do something
    }
})
```

4、使用 `wx.miniapp.copyNativeFileToWx` 将系统中的文件复制进 wx 文件沙箱中；传入参数 nativeFilePath 即文件在手机文件系统中的绝对路径，成功后会返回 tempFilePath

```js
wx.miniapp.copyNativeFileToWx({
        nativeFilePath: param.data.url,
        success(res) {
          console.log('copyNativeFileToWx success', res)
        },
        fail(e) {
          console.log('copyNativeFileToWx fail', e)
        }
      })
```

结合上述步骤，完整示例如下：

```js
wx.miniapp.registOpenURL((param) => {
    console.log('regsitOpenUrl', param)
    if (param.data.isFile) {
      wx.miniapp.copyNativeFileToWx({
        nativeFilePath: param.data.url,
        success(res) {
          console.log('copyNativeFileToWx success', res)
        },
        fail(e) {
          console.log('copyNativeFileToWx fail', e)
        }
      })
    }
})
```
