问题场景:今天遇到这样一个问题,需要从后端接口获取到的值进行复制,且不能提现调用获取值,因为是一个数据列表,每个列表元素需要当场点击调用接口获取值进行复制,本来以为很简单的一个需求,当做好之后发布到线上发现ios机型无效
api:uni.setClipboardData
原因:这是iOS的安全限制,要求复制操作必须是由用户直接触发的同步操作。如果在异步回调中调用复制API,iOS会认为这不是用户直接触发的操作,从而拒绝执行。
有一个解决方法,一个降级方案
解决方法:
使用 async/await 保证在同一个事件循环中完成复制:
async function copyContent() {
uni.showLoading({
title: '加载中...'
});
try {
const content = await new Promise((resolve, reject) => {
request({
url: '/api/xxx',
success: (res) => resolve(res.data),
fail: (err) => reject(err)
});
});
uni.hideLoading();
uni.setClipboardData({
data: content,
success: function() {
uni.showToast({
title: that.i18n.page.text24,
icon: 'none'
});
}
});
} catch(err) {
uni.hideLoading();
console.error(err);
}
}
降级方案:点击按钮调用接口获取到值,弹出弹框,在弹框点击按钮调api复制