开发

扩展 canIUse

canIUse API 用来判断智能小程序的 API ,回调,参数,组件等是否在当前版本和当前系统下可用,具体可参见 canIUse 的官方文档

原理

智能小程序运行时会将 swan-extension 模块中 getCanIUseMap 方法返回的宿主的 canIUseMap 合并到最终的 map 当中去,当小程序开发者调用 canIUse API 判断某个 API 、回调、参数、组件等是否可用时,将使用此 map 进行判断。

扩展方法

在 swan-extension 模块的 getCanIUseMap 的返回值中返回宿主定义的 canIUseMap,具体如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
define('swan-extension', ['swan', 'boxjs'], function (require, module, exports, define, swan, boxjs) {
...

const canIUseMap = {
// 接下来会介绍如何撰写此处的内容
};

module.exports = {
name: 'hostA',

...

getCanIUseMap: () => canIUseMap;
};
});

canIUseMap 组成说明

canIUseMap 分为 common、ios 和 android 三部分,用于支持不同系统下的判断。其中:common 是 iOS 和 Android 均支持的 API 和组件;ios 是仅 iOS 支持的 API 和组件;android 是仅 Android 支持的 API 和组件。

canIUseMap 的格式举例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const canIUseMap = {
common: {
// API
request: {
object: {
url: {},
data: {},
header: {},
method: {
OPTIONS: {},
GET: {},
HEAD: {},
POST: {},
PUT: {},
DELETE: {},
TRACE: {}
},
dataType: {
string: {},
json: {}
},
responseType: {
text: {},
arraybuffer: {}
}
},
success: {
data: {},
statusCode: {},
header: {}
}
},

// 组件
view: {
'hover-class': {},
'hover-stop-propagation': {},
'hover-start-time': {},
'hover-stay-time': {}
}
},
ios: {
VideoContext: {
showStatusBar: {},
hideStatusBar: {}
}
},
android: {
request: {
object: {
method: {
CONNECT: {}
}
}
}
}
};

canIUseMap 数据结构说明

API/类

  • 若 API 无入参,以 getFileSystemManager 为例:
    1
    getFileSystemManager: {}
  • 若 API 有入参且不是 Object 类型,以 setStorageSync 为例:
    1
    2
    3
    4
    setStorageSync: {
    key: {},
    data: {}
    }
  • 若 API 的入参为 Object 类型且此 Object 的名字为 object,以 setStorage 为例:

    注:success、fail 和 complete 也是入参,这三个入参不支持校验,因此,即使存在这三个入参也无需写入 object 中。

    1
    2
    3
    4
    5
    6
    setStorage: {
    object: {
    key: {},
    data: {}
    }
    }
  • 若 API 的 success 回调中有返回参数,以 getStorage 为例:
    1
    2
    3
    4
    5
    6
    7
    8
    getStorage: {
    object: {
    key: {}
    },
    success: {
    data: {}
    }
    }
  • 若 API 的 success 回调中无返回参数,则不支持判断,以 setStorage 为例,虽有 success 回调但没有返回参数:
    1
    2
    3
    4
    5
    6
    setStorage: {
    object: {
    key: {},
    data: {}
    }
    }
  • 若 API 存在 fail 和 complete 回调,不支持判断,以 setStorage 为例,存在 fai 和 complete 回调但不支持判断:
    1
    2
    3
    4
    5
    6
    setStorage: {
    object: {
    key: {},
    data: {}
    }
    }
  • 若 API 有除了 success、fail 和 complete 之外的回调,此回调的名字为 callback,且存在回调参数,以 onLocationChange 为例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    onLocationChange: {
    callback: {
    isFullAccuracy: {},
    latitude: {},
    longitude: {},
    speed: {},
    accuracy: {},
    altitude: {},
    horizontalAccuracy: {},
    street: {},
    cityCode: {},
    city: {},
    country: {},
    countryCode: {},
    province: {},
    streetNumber: {},
    district: {}
    }
    }
  • 若 API 有除了 success、fail 和 complete之外的回调,此回调的名字为 callback,且不存在回调参数,以 offLocationChange 为例:
    1
    2
    3
    offLocationChange: {
    callback: {}
    }
  • 若同步 API 有返回参数,以 isLoginSync 为例,这个同步 API 有返回参数 isLogin,那么需要写'return'来表示这是返回参数:
    1
    2
    3
    4
    5
    isLoginSync: {
    'return': {
    isLogin: {}
    }
    }

组件

基本结构以 view 组件为例:

1
2
3
4
5
6
view: {
'hover-class': {},
'hover-stop-propagation': {},
'hover-start-time': {},
'hover-stay-time': {}
}