PowerPoint加载项仅在Office Online上的第三次初始化后才可用

时间:2018-11-30 09:42:48

标签: powerpoint office-js office-addins officedev

上下文


在我的公司中,我负责开发仅适用于PowerPoint的Content App类型的加载项。 外接程序是使用ASP.NET MVC(4.5)和AngularJS(1.6.8)构建的,并且可在PowerPoint客户端上无缝运行(版本1811,内部版本11029.20079)。 / p>

测试过程
Windows 10 64位
Chrome,v70.0.3538.110(正式版本)(64位)
Adblocker已禁用

已使用清单
此清单通过了验证工具(https://www.npmjs.com/package/office-addin-validator)。

<OfficeApp xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:type="ContentApp">
  <Id>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</Id>
  <Version>1.0.0.0</Version>
  <ProviderName>My Company</ProviderName>
  <DefaultLocale>en-US</DefaultLocale>
  <DisplayName DefaultValue="Office Add-in name" />
  <Description DefaultValue="Office Add-in description." />
  <IconUrl DefaultValue="https://my-company.com/PluginLogo32.png" />
  <HighResolutionIconUrl DefaultValue="https://my-company.com/PluginLogo64.png" />
  <SupportUrl DefaultValue="https://my-company.com/support/" />
  <AppDomains>
    <AppDomain>my-company.com</AppDomain>
  </AppDomains>
  <Hosts>
    <Host Name="Presentation" />
  </Hosts>
  <Requirements>
    <Sets DefaultMinVersion="1.1">
      <Set Name="Settings" />
    </Sets>
    <Methods>
      <Method Name="Settings.get" />
      <Method Name="Settings.set" />
      <Method Name="Settings.remove" />
      <Method Name="Settings.saveAsync" />
    </Methods>
  </Requirements>
  <DefaultSettings>
    <SourceLocation DefaultValue="https://my-company.com/plugin" />
    <RequestedWidth>800</RequestedWidth>
    <RequestedHeight>600</RequestedHeight>
  </DefaultSettings>
  <Permissions>ReadWriteDocument</Permissions>
  <AllowSnapshot>true</AllowSnapshot>
</OfficeApp>

使用了Office初始化

<script src="https://appsforoffice.microsoft.com/lib/1/hosted/office.js" type="text/javascript"></script>
<script type="text/javascript">

    var init = function () {
        App.tags = @Html.Raw(WorkContext.ActivPortalUserEntity.GetUserTagsAsJson());
        App.languages = @Html.Raw(LocalizationManager.GetPortalJsonScript());
        App.AP_URL = '@WorkContext.Uri';
        App.V_KEY_FORM = '@AntiforgeryHelper.GetTokenName()';
        App.V_VALUE_FORM = '@AntiforgeryHelper.GetToken()';
        App.LabelURLSuffix = '';
        App.URLSuffix = '@Model.TemplateDocument.URLSuffix';
        App.IsDefaultUser = @Json.Encode(WorkContext.ActivPortalUserEntity.IsDefaultUser);
        App.DashboardParametersQueryString = '@Html.Raw(Model.RenderContext.Request.GetParametersAsQuerystring())';
        App.DashboardFilters = @Html.Raw(@JsonConvert.SerializeObject(Model.RenderContext.Request.GlobalCriteriaObjects));
        App.ZoomFilters = @Html.Raw(@JsonConvert.SerializeObject(Model.RenderContext.Request.GlobalCriteriaIndexes));
        App.WebPartFormatUseCorner = true;
        App.DeportedToggleView = true;
        App.ToggleViewMode = 'accordion';
        App.searchPlaceHolderText = "@Resource("L_appSearchPlaceHolder_Text", "Portal")";
        App.viewType = '';
        App.documentRepository = '@ApplicationConfigService.ActivPortalServerConfig.DocumentsRepository';
        App.WPAllowIconsHide = false;
        App.Language = '@WorkContext.UserLanguage';
        App.searchURL = [];
        App.EditMode = false;
        App.EditContentMode = false;
        App.CATALOG_PROXY = '@WorkContext.Uri' + 'Portal/CatalogProvider';
        App.RENDER_URL = '@WorkContext.Uri' + 'Portal/Render';
        App.CHOICE_PROXY = '@WorkContext.Uri' + 'Portal/Render/TemplateRequest';
        App.POST_TEMPLATE_PROXY = '@WorkContext.Uri' + 'Portal/Render/TemplateRequest';
        App.moduleScripts = @Html.Raw(JsonConvert.SerializeObject(Model.GetPageScripts()));
        App.moduleStylesSheets = @Html.Raw(@JsonConvert.SerializeObject(Model.GetPageStyles()));
        App.angularClientContext = @Html.Raw(@Html.GetJsonClientContext());

        App.scriptDebug = (typeof App.scriptDebug == undefined) ? false : App.scriptDebug;
        App.ScriptsManager = new Activportal.UI.Resources({ scriptDebug: App.scriptDebug });
        App.StylesManager = new Activportal.UI.Resources();

        //Localization
        MinimizeTip_Text = "@Resource("L_Minimize_Text", "Portal")";
        ExpandTip_Text = "@Resource("L_Maximize_Text", "Portal")";
        ErrorUpdatingPart_Text = "@Resource("L_InvalidURL_Text", "Portal")";
        ConfirmRemoveGlobalFilter_Text = "@Resource("L_ConfirmRemoveGlobalFilter_Text", "Portal")";
        WaitMessage_Text = "@Resource("L_WaitMessage_Text", "Portal")";
        SessionEnd_Text = "@Resource("L_SessionEndMessage_Text", "Portal")";

        window.addEvent('domready', function () {
            App.isDashboardLoaded();
            App.Start();
        });
    };

    try {
        if (Office) {
            Office.initialize = init;
        }
        else {
            console.log("Office.js is missing.");
            if (!window.external.GetContext) {
                init();
            }
        }
    } catch (e) {
        console.log(e);
    }
</script>

问题


只需重复一遍,外接程序可在PowerPoint 2016客户端上无缝运行(有关版本,请参见上文)。 但是,在 PowerPoint Online 中,我遇到了一个问题:加载项的初始化

  1. 在插入加载项或重新加载登录页面时,显示为不透明,如下所示:Add-in initialization

  2. 然后在2秒钟后出现此消息:“对不起,由于遇到问题,我们无法启动外接程序。请稍后再试或与系统管理员联系。” Add-in initialization error message
    我从控制台收到的唯一消息是:enter image description here

  3. 在这一点上,我数了1次初始化。当我单击“DÉMARRER”时,会发生相同的事情(第二次初始化)。然后,当我再次单击时(第三次初始化)。外接程序终于像在PowerPoint客户端上一样工作。 这是登录页面工作时的外观。 https://imgur.com/F9QNvvg

因此,在Office Online上,它只是第三个初始化,它的外接程序有效。 我注意到所有主流浏览器在其最新版本中的行为大致相同。

问题


我缺少什么吗?
我愿意接受任何建议,但在此特定问题上没有找到任何解决方案。

1 个答案:

答案 0 :(得分:1)

我为解决此问题所做的事情
好吧,我的错误是不了解Office.js的工作原理。

在我的登录页面中
 -我添加了脚本Office.js。
 -我初始化了脚本。

if (Office) {
   if (Office.context === undefined) {
      Office.onReady(function () { });
   }
}

在我的主页中
 -我更改了初始化脚本的方式。

if (Office) {
   if (Office.context === undefined) {
      Office.onReady(function () { });
   }
}

结论
似乎Office.js必须出现在应用程序的第一页中。在使用Office API的每个页面中。

此外,最好使用Office.onReady()而不是Office.initialize()。

注意事项:

  • 我必须与Microsoft联系以找到此解决方案。
    也许文档不是那么明显?
  • 我在控制台中仍然有一些错误,但是我可以毫无问题地使用加载项和API。