diff --git a/public/survey.html b/public/survey.html index 95528fc..87a76bc 100644 --- a/public/survey.html +++ b/public/survey.html @@ -2370,28 +2370,37 @@ generateBtn.querySelector('.button-text').textContent = '正在生成链接...'; generateBtn.disabled = true; - // 调用后端API创建会话(和开始答题一样的逻辑) - const response = await fetch('/api/create-session', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - name: studentName, - school: studentSchool, - grade: studentGrade, - phone: studentPhone, - selectedSubject: document.getElementById('subjectFilterSelect').value || '', - selectedSemester: document.getElementById('gradeFilterSelect').value || '', - selectedExamType: '', - selectedUnit: document.getElementById('unitFilterSelect').value || '', - selectedCategory: '', - selectedQuestionType: '', - selectedTag: this.selectedTag, - selectedTagsList: [], - questionsConfig: this.currentRules, - scoreRange: scoreRange - }) + // iOS兼容性:使用setTimeout确保请求是用户直接触发的 + const response = await new Promise((resolve, reject) => { + setTimeout(async () => { + try { + const fetchResponse = await fetch('/api/create-session', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + name: studentName, + school: studentSchool, + grade: studentGrade, + phone: studentPhone, + selectedSubject: document.getElementById('subjectFilterSelect').value || '', + selectedSemester: document.getElementById('gradeFilterSelect').value || '', + selectedExamType: '', + selectedUnit: document.getElementById('unitFilterSelect').value || '', + selectedCategory: '', + selectedQuestionType: '', + selectedTag: this.selectedTag, + selectedTagsList: [], + questionsConfig: this.currentRules, + scoreRange: scoreRange + }) + }); + resolve(fetchResponse); + } catch (error) { + reject(error); + } + }, 0); }); if (!response.ok) { @@ -2437,11 +2446,19 @@ } catch (error) { console.error('生成测评链接失败:', error); - this.showErrorDialog('生成测评链接失败', - `创建测评链接时发生错误:

+ const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent); + const errorMessage = error.message.includes('not allowed') && isIOS + ? `iOS设备权限限制:请确保:

+ • 在Safari设置中允许网页访问网络
+ • 尝试在Safari中"重新加载页面"
+ • 检查是否启用了"限制网页跟踪"
+ • 如仍失败,请尝试使用其他浏览器(如Chrome)

+ 技术细节:${error.message}` + : `创建测评链接时发生错误:

错误信息:${error.message}

- 请检查网络连接或联系技术支持。` - ); + 请检查网络连接或联系技术支持。`; + + this.showErrorDialog('生成测评链接失败', errorMessage); } finally { // 恢复按钮状态 const generateBtn = document.getElementById('generateLinkBtn'); @@ -2506,28 +2523,37 @@ startBtn.querySelector('.button-text').textContent = '正在创建答题会话...'; startBtn.disabled = true; - // 调用后端API创建会话 - const response = await fetch('/api/create-session', { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ - name: studentName, - school: studentSchool, - grade: studentGrade, - phone: studentPhone, - selectedSubject: document.getElementById('subjectFilterSelect').value || '', - selectedSemester: document.getElementById('gradeFilterSelect').value || '', - selectedExamType: '', - selectedUnit: document.getElementById('unitFilterSelect').value || '', - selectedCategory: '', - selectedQuestionType: '', - selectedTag: this.selectedTag, - selectedTagsList: [], - questionsConfig: this.currentRules, - scoreRange: scoreRange - }) + // iOS兼容性:使用setTimeout确保请求是用户直接触发的 + const response = await new Promise((resolve, reject) => { + setTimeout(async () => { + try { + const fetchResponse = await fetch('/api/create-session', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + name: studentName, + school: studentSchool, + grade: studentGrade, + phone: studentPhone, + selectedSubject: document.getElementById('subjectFilterSelect').value || '', + selectedSemester: document.getElementById('gradeFilterSelect').value || '', + selectedExamType: '', + selectedUnit: document.getElementById('unitFilterSelect').value || '', + selectedCategory: '', + selectedQuestionType: '', + selectedTag: this.selectedTag, + selectedTagsList: [], + questionsConfig: this.currentRules, + scoreRange: scoreRange + }) + }); + resolve(fetchResponse); + } catch (error) { + reject(error); + } + }, 0); }); if (!response.ok) { @@ -2549,11 +2575,19 @@ } catch (error) { console.error('开始答题失败:', error); - this.showErrorDialog('开始答题失败', - `创建答题会话时发生错误:

+ const isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent); + const errorMessage = error.message.includes('not allowed') && isIOS + ? `iOS设备权限限制:请确保:

+ • 在Safari设置中允许网页访问网络
+ • 尝试在Safari中"重新加载页面"
+ • 检查是否启用了"限制网页跟踪"
+ • 如仍失败,请尝试使用其他浏览器(如Chrome)

+ 技术细节:${error.message}` + : `创建答题会话时发生错误:

错误信息:${error.message}

- 请检查网络连接或联系技术支持。` - ); + 请检查网络连接或联系技术支持。`; + + this.showErrorDialog('开始答题失败', errorMessage); // 恢复按钮状态 const startBtn = document.getElementById('startSurvey');