We have a number of apps that are designed to only be launched from a model app (none of them are embeded on a model app form). All run inside the model app or the open a new browser tab. Since canvas apps, when launched via player, have no context to the host dataverse/CDS environment they are installed into they are unusable (broken?) apps by default. By launching them from a model app you can provide the needed Dataverse info context to the canvas app.
Since there is no way to stop someone from launching the app via the player, you might consider this:
1. Add a screen to your app that says it can't be launched from the player. Without navigation, they can't get to any other part of the app.
2. When launched by the player, the URL will have a param called "source" and it is set to "portal".
In your App OnStart code, get the param and check it for portal. If found, force the screen navigation to your bad launch page.
Here is a code example from our D365 event registration canvas app with a screenshot:
/// In start up of app, check URL for param of where it was launched from
Set(_evxThisAppSource, Lower(Param("source")));
//// SET STARTING SCREEN
Set(_evxGoToStartScreen, If(!IsBlank(_evxThisAppSource), _evxThisAppSource, _evxThisAppStartScreen) );
Switch( _evxGoToStartScreen ,
"businessappdiscovery", Navigate('Failed Launch Screen', ScreenTransition.None),
"portal", Navigate('Failed Launch Screen', ScreenTransition.None),
Navigate('Registration Screen',ScreenTransition.None)
);
Hopefully this will give you some ideas.
Fun Fun!
-Art