There aren’t too much information available about the hybrid app launcher currently, so the purpose of this blog post is to fill in some missing pieces.
We recently enabled hybrid app launcher in a SharePoint 2013 farm, and we weren’t really sure how it would look or work.
How did it look like? Did it reflect the Office 365 version?
No! It didn’t exactly look like the current version in our Office 365 tenant, and it didn’t even have all the same apps (or tiles) in it.
This is how the Office 365 app launcher looks like in my client’s tenant. Yes, I’m a First Release user, and these are the apps I’ve pinned to Home.

Now, this is how the Hybrid App Launcher looks like in a SharePoint 2013 site with default masterpage.

Unfortunately, it looks nothing like the one in Office 365. The whole user experience is different, including colors, layout and content. The general impression is that the design is outdated.
The biggest disappointment however, is that I don’t get all the apps that I’m licensed to and can see in Office 365.
Off course we’re using custom master pages in our current SharePoint 2013 farm, and our custom styling doesn’t make it better.

In order to configure the hybrid extensible app launcher in SharePoint Server 2013, you need to have configured hybrid sites and the July 2016 PU for SharePoint Server 2013 (or newer) must have been installed.
The hybrid app launcher is installed using PowerShell
Install-SPFeature SuiteNav
Then the (hidden) feature must be enabled per site collection using
Enable-SPFeature suitenav -url <SiteCollectionURL>
It would have been great if the feature was web application scoped to show the app launcher for new sites. Now we need to schedule a custom script to run instead, or maybe implement feature stapling.
When we first enabled the suitenav feature for our site, we couldn’t see the app launcher. We soon found out that our custom masterpage was missing the following delegate control
<SharePoint:DelegateControl id="ID_SuiteBarDelegate" ControlId="SuiteBarDelegate" runat="server" />
The delegate control performs the following server side code:
- Registers CSS (_layouts/15/SuiteNav.css)
- Registers a script link (_layouts/15/SuiteNav.js)
- Registers a startup script (RenderSuiteNav) which is passed the parameter SuiteNavRestMethod with value Microsoft.SharePoint.Portal.SuiteNavData.GetSuiteNavData.
The hybrid app launcher renders asynchronously by the SuiteNav.js and the data is fed from the _api/Microsoft.SharePoint.Portal.SuiteNavData.GetSuiteNavData rest method.
I didn’t see any invocations to this rest method using my browser developer tools, so I assume it is invoked server side. The api is available both in SharePoint Online and in SharePoint Server, but it only returns content when invoked on the server. Here’s what it returned for my account:
{
"DoNotCache": false,
"NavBarData": {
"AboutMeLink": {
"Id": "ShellAboutMe",
"TargetWindow": null,
"Text": "About me",
"Title": "Go to the My profile page",
"Url": "https:\/\/company-my.sharepoint.com\/person.aspx"
},
"ClientData": "{\"HasEXOLicense\":true,\"IsRTL\":false,\"MyAppsUrl\":\"https:\\\/\\\/portal.office.com\\\/myapps\"}",
"CommunityLink": {
"Id": "ShellCommunity",
"TargetWindow": "_blank",
"Text": "Community",
"Title": "Community",
"Url": "https:\/\/answers.microsoft.com\/en-US\/msoffice"
},
"CorrelationID": "8ea9cb7a-8567-4505-b120-8be421a01fc0",
"CurrentMainLinkElementID": "ShellSites",
"CurrentWorkloadHelpSubLinks": null,
"CurrentWorkloadSettingsLink": null,
"CurrentWorkloadSettingsSubLinks": null,
"CurrentWorkloadUserSubLinks": null,
"FeedbackLink": {
"Id": "ShellFeedback",
"TargetWindow": "_blank",
"Text": "Feedback",
"Title": null,
"Url": "https:\/\/portal.office.com\/SendSmile?wid=2"
},
"FlipHelpIcon": false,
"HasTenantBranding": true,
"HelpLink": {
"Id": "HelpLink",
"TargetWindow": "_blank",
"Text": "Help",
"Title": null,
"Url": "&services=RMS_S_PREMIUM%2cINTUNE_A%2cRMS_S_ENTERPRISE%2cAAD_PREMIUM%2cMFA_PREMIUM%2cDeskless%2cFLOW_O365_P2%2cPOWERAPPS_O365_P2%2cTEAMS1%2cPROJECTWORKMANAGEMENT%2cSWAY%2cINTUNE_O365%2cYAMMER_ENTERPRISE%2cOFFICESUBSCRIPTION%2cMCOSTANDARD%2cSHAREPOINTWAC%2cSHAREPOINTENTERPRISE%2cEXCHANGE_S_ENTERPRISE%2cEXCHANGE_S_FOUNDATION%2cBI_AZURE_P0%2cRMS_S_ADHOC&p2=O365"
},
"IsAuthenticated": true,
"LegalLink": {
"Id": "ShellLegal",
"TargetWindow": "_blank",
"Text": "Legal",
"Title": "Legal",
"Url": "https:\/\/www.microsoft.com\/online\/legal\/v2\/?docid=13&langid=en-US"
},
"LogoIconID": "o365logo",
"LogoNavigationUrl": "https:\/\/www.office.com\/1?auth=2&home=1&from=ShellLogo",
"O365SettingsLink": {
"Id": "ShellO365Settings",
"TargetWindow": null,
"Text": "Office 365 settings",
"Title": null,
"Url": "https:\/\/portal.office.com\/settings\/"
},
"PinnedApps": [
{
"AriaLabel": null,
"BackgroundColor": "#0072c6",
"BrandBarText": null,
"CollectorId": null,
"FontIconCss": "wf-o365-newsfeed",
"IconFullUrl": null,
"Id": "Newsfeed",
"IsNewGroup": false,
"LaunchFullUrl": "https:\/\/sharepoint-my.company.com:443\/default.aspx",
"Size": 2,
"TargetWindow": null,
"Title": "Newsfeed"
},
{
"AriaLabel": null,
"BackgroundColor": "#0072c6",
"BrandBarText": null,
"CollectorId": null,
"FontIconCss": "wf-o365-cloud",
"IconFullUrl": null,
"Id": "Documents",
"IsNewGroup": false,
"LaunchFullUrl": "https:\/\/company-my.sharepoint.com\/_layouts\/15\/MySite.aspx?MySiteRedirect=AllDocuments&Source=SP2015",
"Size": 2,
"TargetWindow": null,
"Title": "OneDrive"
},
{
"AriaLabel": null,
"BackgroundColor": "#0072c6",
"BrandBarText": null,
"CollectorId": null,
"FontIconCss": "wf-o365-sharepointlogo",
"IconFullUrl": null,
"Id": "Sites",
"IsNewGroup": false,
"LaunchFullUrl": "https:\/\/company-my.sharepoint.com\/_layouts\/15\/MySite.aspx?MySiteRedirect=AllSites&Source=SP2015",
"Size": 2,
"TargetWindow": null,
"Title": "Sites"
},
{
"AriaLabel": "Go to Delve",
"BackgroundColor": "#0072C6",
"BrandBarText": null,
"CollectorId": "FirstParty",
"FontIconCss": "wf-o365-pulselogo",
"IconFullUrl": null,
"Id": "OfficeGraph",
"IsNewGroup": false,
"LaunchFullUrl": "https:\/\/company-my.sharepoint.com\/_layouts\/15\/me.aspx?Origin=HybridShell16",
"Size": 2,
"TargetWindow": null,
"Title": "Delve"
},
{
"AriaLabel": "Go to Video for Office 365 to share videos",
"BackgroundColor": "#0072C6",
"BrandBarText": null,
"CollectorId": "FirstParty",
"FontIconCss": "wf-o365-videologo",
"IconFullUrl": null,
"Id": "Video",
"IsNewGroup": false,
"LaunchFullUrl": "https:\/\/company.sharepoint.com\/portals\/hub\/_layouts\/15\/videohome.aspx?from=3",
"Size": 2,
"TargetWindow": null,
"Title": "Video"
}
],
"PrivacyLink": {
"Id": "ShellPrivacy",
"TargetWindow": "_blank",
"Text": "Privacy & cookies",
"Title": "Privacy & cookies",
"Url": "https:\/\/www.microsoft.com\/online\/legal\/v2\/?docid=18&langid=en-US"
},
"SessionID": "cd6527d8-e055-4d4c-8ffe-90db7df99b8e",
"SignOutLink": {
"Id": "ShellSignout",
"TargetWindow": null,
"Text": "Sign out",
"Title": "Sign out and return to the Sign-in page",
"Url": "https:\/\/login.microsoftonline.com\/logout.srf?ct=1489754717&rver=64.4.6456.0&lc=1033&id=501392"
},
"TenantBackgroundImageUrl": null,
"TenantLogoNavigationUrl": null,
"TenantLogoUrl": null,
"TruncatedUserDisplayName": null,
"UserDisplayName": "Petter Skodvin-Hvammen"
},
"SPSuiteVersion": 2
}