我创建了一个 SCORM 包(没有创作工具),其中 ismmanifest.xml 指向外部服务器上的内容。
但是,使用的LMS(Cornerstone)不支持SCORM中的外部内容!
有没有一种简单的方法可以将 SCORM 包转换为 xAPI、AICC、cmi5 等可以在 LMS 之外的外部服务器上运行内容的内容?
在第一次尝试中,我想使用 xAPI,但失败了,因为它需要用户身份验证,但我既无法访问 LMS,也无法访问应运行内容的外部服务器。我只创建了内容和包。
感谢您的帮助
您无法通过 imsmanifest 文件指向外部内容,因为外部 HTML 文件将位于不同的域中,并且由于跨域安全限制而无法通过 JavaScript 与 LMS 通信。
我在类似情况下所做的就是创建一个中继系统,在其中加载课程 ZIP 中的单个 HTML 文件,并通过 iframe 将外部内容加载到该 HTML 文件中。 index.html 文件处理与 LMS 的所有 SCORM/JS 交互,因为它与 LMS 位于同一域中。诀窍是使用 postMessage (或类似的)来让子页面指示 index.html 文件代表它们触发 JS 命令。
假设您能够修改课程文件和 SCORM ZIP,以下是其工作原理的总体概述:
创建一个位于 SCORM 包中的 index.html 文件。让 imsmanifest 指向此文件作为课程的启动文件。
在index.html 文件中,创建一个100% 填充视口的iframe。这使得最终用户感觉 iframe 不可见。
根据课程逻辑的需要,使用 JS 将外部文件动态加载到 iframe 中。
将 SCORM 支持代码(例如 SCORM 包装器)添加到 index.html 文件中。它将为您处理 SCORM 连接和所有命令(init、get、set、terminate 等)。外部文件不会使用任何 SCORM 代码,也不会与 LMS 交互——外部页面只会通过 postMessage 与 index.html 文件交互。
当课程页面需要进行 SCORM 调用时,让它通过 postMessage 将命令转发到您的 index.html 文件,例如
const message = JSON.stringify({ bookmark: 2 });
//Replace lms.com with the domain of your LMS for security purposes
window.parent.postMessage(message, 'https://lms.com');
在您的index.html 文件中,您将侦听消息并进行相应的处理。 (示例代码,未经测试——需要错误处理)
window.addEventListener('message', function(event) {
//Replace example.com with the domain of your external files for security purposes
if (event.origin === 'https://example.com') {
const data = JSON.parse(event.data);
switch(Object.keys(data)[0]){
case "bookmark":
//In this example I'm using my pipwerks SCORM wrapper
pipwerks.SCORM.set("cmi.core.lesson_location", data[0]);
break;
case "exit":
pipwerks.SCORM.exit();
break;
// etc.
}
}
});
我已在多个 LMS 平台上成功使用这种方法多年。这种方法有很多额外的好处,包括: