В моем плагине я реализовал функцию входа в API-интерфейс Outlook.
Он загружает форму учетных данных (не в моем контроле) с обратным URL. Ответ на вход в систему корректно поступает на мой сервер узлов, и я вижу, что пользователь аутентифицирован. Там на сервере готовится файл ejs, который отправляется клиенту. Вернувшись на клиент, я хочу выполнить messageParent, чтобы я мог закрыть диалог. Это работает в браузерах (включая Safari), Android, на рабочем столе и т. Д., Работает в Outlook для MAC, но не работает на iOS. Пример кода следующий:
в nodejs:
app.post("/auth/:token", (req, res) => {
console.log('auth return url logic', req.params.token, JSON.stringify(req.body));
let send_response = function(res, user) {
try {
return res.render(
'send_to_parent.ejs',
{user : user},
function (e, r) {
try {
res.end(r);
}
catch(e) {}
}
);
}
catch (err) {
console.log(1312312321, err);
}
};
send_response(res, {});
});
в send_to_parent.ejs
<!DOCTYPE html>
<html>
<head>
<title>#Sign in</title>
<script type="text/javascript" src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.debug.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript">
console.log('in ejs');
function messageParent() {
console.log('message parent');
Office.context.ui.messageParent(true);
}
function openClick() {
window.setTimeout(messageParent, 100);
}
Office.initialize = function (reason) {
console.log('office initialize');
$(document)
.ready(function () {
console.log('jquery ready');
openClick();
});
};
</script>
</head>
Есть идеи, что не так или как диагностировать?
===== ===== EDIT
Ну, для отладки я сделал несколько изменений и замен кода. Теперь мой код в файле ejs выглядит так:
<head>
<title>#Sign in</title>
<script type="text/javascript" src="https://appsforoffice.microsoft.com/lib/1.1/hosted/office.debug.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<h1 style="text-align: center">Authorization Successful</h1>
<div id="log">test</div>
<script type="text/javascript">
document.getElementById("log").innerText += "before initialize";
Office.initialize = function () {
document.getElementById("log").innerText += "initialized";
$(document)
.ready(function () {
document.getElementById("log").innerText += "jquery";
$("#closeButton").click(function () {
document.getElementById("log").innerText += "close clicked";
Office.context.ui.messageParent(true);
});
Office.context.ui.messageParent(true);
});
};
</script>
</body>
После успешного входа в систему мой журнал div только обновляется с «до инициализации», что означает, что Office.initialize никогда не происходит. Я также сначала попытался вызвать jquery.ready, и это доказало, что jquery работает нормально. По какой-то причине Office не хочет инициализироваться. Почему это?
==== ВТОРОЕ РЕДАКТИРОВАНИЕ ====
Углубившись в проблему, я сделал несколько изменений.
function log(text) {
document.getElementById("log").innerText += text;
}
function messageParent() {
log('message parent');
try {
if ( !Office ) {
log('no_office');
}
else if (!Office.context ) {
log('no_context')
}
else if( !Office.context.ui) {
log('no_ui');
}
else if (!Office.context.ui.messageParent) {
log('no_message');
}
Office.context.ui.messageParent(true);
}
catch(e) {
log("error");
log(e);
}
}
log("here");
Office.onReady ( function (reason) {
log('office initialize');
$(document)
.ready(function () {
log('jquery ready');
// messageParent();
$("#closeButton").click(function () {
log(" close_clicked_out_of_office ");
debugger
messageParent();
});
});
});
Теперь, наконец, у меня есть Outlook. У меня также есть Outlook.context, но нет интерфейса. Поэтому я не могу выполнить messageParent.