uni-app开发iOS应用调用uni.request api ios26版本持续请求超时
uni-app开发iOS应用调用uni.request api ios26版本持续请求超时
操作步骤:
- 调用uni.request api,请求头中添加Authorization与不添加Authorization反复测试
预期结果:
- 请求头中添加Authorization也应当正常返回结果
实际结果:
- 请求头中添加Authorization后,接口一直loading
bug描述:
uniapp开发iOS应用,iOS26版本,使用uni.request api进行接口请求, 若请求头中存在Authorization,则请求会一直loading,若不存在则请求正常。26版本以下没有问题。 所有接口请求都为https
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| PC开发环境 | Windows | |
| PC开发环境版本号 | window11 | |
| HBuilderX | Alpha | |
| HBuilderX版本号 | 4.76 | |
| 手机系统 | iOS | |
| 手机系统版本号 | iOS 26 | |
| 手机厂商 | 苹果 | |
| 手机机型 | iphone17promax | |
| 页面类型 | vue | |
| vue版本 | vue3 | |
| 打包方式 | 云端 | |
| 项目创建方式 | HBuilderX |
更多关于uni-app开发iOS应用调用uni.request api ios26版本持续请求超时的实战教程也可以访问 https://www.itying.com/category-93-b0.html
提供实际工程说明具体问题
更多关于uni-app开发iOS应用调用uni.request api ios26版本持续请求超时的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这个问题目前只在ios26版本手机上复现过,iphone17系列手机复现较多,我是自己封装了一个request请求文件,如登录等不需要Authorization的接口可以正常调用,登录成功之后,接口请求头会添加Authorization,这种情况下uni.request发起的请求,无论是success、fail还是complete都无法进入,自己封装的request文件放在下边的回答里了
const request = async (options) => {
console.log(options.url);
// 处理请求头
let headers = {
…options.header,
“tenant-id”: 1
};
// console.log(headers);
headers = await handleHeader(headers, options.noAuth);
console.log(headers.Authorization)
let ownOptions = {
…options,
ifReject: options.ifReject || false,
header: headers
}
if (ownOptions.showLoad) {}
return new Promise((resolve, reject) => {
uni.request({
...ownOptions,
success: (res) => {
const errMsg = '网络繁忙,请稍后重试';
if (res.statusCode !== 200) {
const data = res.data
if (res.statusCode == '400') {
uni.showModal({
title: '提示',
content: errMsg,
success(res) {}
})
}
if (res.statusCode == '500') {
uni.showModal({
title: '提示',
content: '网络繁忙,请稍后重试',
success(res) {}
})
}
if (res.statusCode == '401') {
if (!isRefreshing) {
isRefreshing = true
getRefreshToken().then(newToken => {
// console.log('token----------', newToken)
isRefreshing = false
requests.forEach(callback => callback(newToken))
requests = []
ownOptions.header.Authorization =
`Bearer ${newToken}`;
uni.request({
...ownOptions,
success: (res) => {
if (res.statusCode == 200) {
resolve(res.data)
} else {
reject(res)
}
}
})
}).catch((err) => {
console.error(err)
uni.showModal({
title: '提示',
content: '登录超时,请重新登录',
success(res) {
reject('token刷新失败')
isRefreshing = false
uni.removeStorageSync('token')
uni.removeStorageSync(
'refreshToken')
uni.setStorageSync('ifLogin', false)
uni.removeStorageSync('userInfo')
uni.reLaunch({
url: '/pages/login/index'
})
}
});
})
} else {
requests.push((newToken) => {
ownOptions.header.Authorization =
`Bearer ${newToken}`;
uni.request({
...ownOptions,
success(res) {
if (res.statusCode == 200) {
resolve(res.data)
} else {
reject(res)
}
}
})
})
}
}
reject(res)
} else {
const result = res.data
const code = result.code
if (code == 401) {
if (!isRefreshing) {
isRefreshing = true
getRefreshToken().then(newToken => {
isRefreshing = false
requests.forEach(callback => callback(newToken))
requests = []
ownOptions.header.Authorization =
`Bearer ${newToken}`;
uni.request({
...ownOptions,
success: (res) => {
if (res.statusCode == 200) {
resolve(res.data)
} else {
reject(res)
}
}
})
}).catch((err) => {
console.error(err)
uni.showModal({
title: '提示',
content: '登录超时,请重新登录',
success(res) {
reject('token刷新失败')
isRefreshing = false
uni.removeStorageSync('token')
uni.removeStorageSync(
'refreshToken')
uni.setStorageSync('ifLogin', false)
uni.removeStorageSync('userInfo')
uni.reLaunch({
url: '/pages/login/index'
})
}
});
})
} else {
requests.push((newToken) => {
ownOptions.header.Authorization =
`Bearer ${newToken}`;
uni.request({
...ownOptions,
success(res) {
if (res.statusCode == 200) {
resolve(res.data)
} else {
reject(res)
}
}
})
})
}
} else {
resolve(res.data);
}
}
},
fail: (error) => {
console.error('报错进来了 ');
console.error(error)
uni.showToast({
title: '网络异常,请稍后重试',
icon: 'none'
})
if (options.ifReject) {
reject(error)
}
},
complete: (res) => {
}
})
})
}
export default request;
提供一个可以直接运行的示例工程吧便于排查
回复 DCloud_iOS_XHY: 已在下方评论添加示例工程,辛苦帮忙排查下吧
示例工程

