如何將使用者從 Web 的未封裝應用程式轉換至 Store 版的已封裝應用程式
如果您將應用程式以 Web 下載 (EXE /MSI) 發佈,並在 Store 以封裝應用程式的形式發佈,您可能會想要防止使用者同時安裝這兩個版本,或將使用者從未封裝的 Web 版本移轉至 Store 版版本。 本指南將提供如何順暢地將使用者從未封裝版本轉換為已封裝版本的相關指示。
以下將說明兩個案例:
- 使用者已安裝 Web 型未封裝版本,而且您想要將它取代為 Store 版的已封裝版本。
- 使用者已安裝這兩個版本,而且您想要優先使用 Store 版的已封裝版本,並卸載 Web 型的未封裝版本。
案例 1:將 Web 的未封裝應用程式自動更新至 Store 版的已封裝應用程式
如果您的目標是將使用者從 Web 的未封裝應用程式自動移轉至已封裝的 Store 版本,建議您遵循下列步驟:
- 讓您的 Store 版封裝應用程式能夠使用現有的工作列和 [開始] 功能表釘選,確保使用者在 Store 版的已封裝應用程式取代 Web 的未封裝應用程式時,保留其捷徑。
- 請參閱章節:移轉現有的釘選工作列和開始功能表捷徑
- 從未封裝的 Web 版本以無訊息方式下載並安裝 Store 版本。
- 向使用者指出,應用程式將重新啟動以套用更新
- 下載並安裝之後,請啟動 Store 版的已封裝版本,並關閉 Web 的未封裝版本。
- 在 Store 版已封裝應用程式中,將資料遷移至新的應用程式資料夾。
- 請參閱章節:移轉資料
- 最後,以程式設計方式解除安裝未封裝的 Web 版本。
案例 2:如果使用者已安裝這兩個版本,請解除安裝 Web 型的未封裝應用程式。
您可以讓使用者並行使用應用程式的這兩個版本,但您將必須管理應用程式之間的衝突,且將負責在 2 個版本之間同步處理資料。
如果您希望使用者只使用 1 個版本並將 Store 版本排為優先,以下是一些建議:
- 讓您的 Store 版封裝應用程式能夠使用現有的工作列和 [開始] 功能表釘選,確保使用者在 Store 版的已封裝應用程式取代 Web 的未封裝應用程式時,保留其捷徑。
- 請參閱章節:移轉現有的釘選工作列和開始功能表捷徑
- Store 版應用程式應該偵測未封裝的版本是否存在,並在啟動時將其解除安裝
- 當使用者啟動未封裝的應用程式時,應該會自動啟動已封裝的版本
- 如果您想要的話,還可能會移轉資料
- 請參閱章節:移轉資料
- 最後,以程式設計方式解除安裝未封裝的 Web 版本。
技術建議
如何從 Web 的未封裝應用程式安裝 Store 版的已封裝應用程式?
若要起始下載和安裝,您必須知道應用程式的 Store 識別碼。 此 12 個字元的識別碼可以從合作夥伴中心取得,特別是 [產品識別] 區段底下,即使您的應用程式尚未提交也一樣。
接著,您可以使用下列程式碼,以無訊息方式下載並安裝 Store 版應用程式。 此程式碼會:
- 如果權利存在,請將權利指派給目前的 Store 版使用者;否則,權利將會與裝置相關聯。
- 起始產品的下載和安裝,而不產生任何通知快顯通知。
- 您可以使用事件 API 來監視下載和安裝進度。
private async Task<bool> DownloadStoreVersionAsync()
{
var productId = "<Product Id from Partner Center>";
var applicationName = "<name of your application>";
var appInstallManager = new AppInstallManager();
var entitlement = await appInstallManager.GetFreeUserEntitlementAsync(productId, string.Empty, string.Empty);
if (entitlement.Status is GetEntitlementStatus.NoStoreAccount)
{
entitlement = await appInstallManager.GetFreeDeviceEntitlementAsync(productId, string.Empty, string.Empty);
}
if (entitlement.Status is not GetEntitlementStatus.Succeeded)
{
return false;
}
var options = new AppInstallOptions()
{
LaunchAfterInstall = true,
CompletedInstallToastNotificationMode = AppInstallationToastNotificationMode.NoToast
};
var items = await appInstallManager.StartProductInstallAsync(productId, string.Empty, applicationName, string.Empty, options);
var firstItem = items.FirstOrDefault();
if(firstItem is null)
{
return false;
}
firstItem.StatusChanged += StoreInstallation_StatusChanged;
firstItem.Completed += StoreInstallation_Completed;
return true;
}
private void StoreInstallation_Completed(AppInstallItem sender, object args)
{
// Launch the new Store version when ready and close this application
// The Store version will then be responsible of migrating the data and uninstall the unpackaged version
}
private void StoreInstallation_StatusChanged(AppInstallItem sender, object args)
{
var status = sender.GetCurrentStatus();
switch(status.InstallState)
{
case AppInstallState.Installing:
{
// Show installing status
}
break;
case AppInstallState.Downloading:
{
// Show download progress using status.PercentComplete
}
break;
...
}
如何從 Web 的未封裝應用程式啟動 Store 版應用程式?
若要啟動 Store 版應用程式,必須知道其 AMUID,其中包含套件系列名稱 (可在合作夥伴中心的 [產品識別] 區段中找到) 和應用程式識別碼 (來自您的 appxmanifest),並以半型驚歎號 (!) 分隔。
Process.Start(
"explorer.exe",
"shell:AppsFolder\\Microsoft.WindowsCalculator_8wekyb3d8bbwe!App"
);
如何偵測是否已安裝 Store 版已封裝版本並加以啟動
您可以使用 GetPackagesByPackageFamily win32 API,並傳入已封裝應用程式的套件系列名稱,來判斷是否已安裝應用程式的已封裝版本。 如果計數值高於零,表示已安裝該應用程式。
如何從已封裝的應用程式解除安裝 Web 的未封裝應用程式
若要擷取解除安裝工具的絕對路徑,您可以存取登錄。
解除安裝程式的資訊的登錄位置:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\<your product code GUID\>
擷取 UninstallString
值中的完整命令並加以執行。
建議您以無訊息方式執行解除安裝,或通知使用者您要移轉資料並解除安裝其他應用程式。
如何移轉資料
未封裝的應用程式可能會將其本機資料儲存在:
%localAppData%/<YourPublisherName\>/<YourAppName\>
已封裝的應用程式有其保留空間可供資料儲存使用,當應用程式解除安裝時,會自動刪除。 強烈建議您在第一次啟動時,將資料移轉至這個空間 (但並非必要)。 您可以呼叫 Windows.Storage.ApplicationData.Current.LocalFolder.Path 來擷取此資料夾的絕對路徑。
如何移轉下載數和應用程式內購買
在應用程式內購買
為了保證最佳的使用者體驗,使用者必須能夠順暢地存取他們在應用程式未封裝版本中購買的內容。 基於這個目標,自 2021 年 6 月以來,Microsoft Store 還允許使用 Microsoft 或第三方商務平台,提高發行者的彈性。
我們強烈建議發行者除了繼續驗證未封裝版本應用程式內購買的權利,也與 Microsoft Commerce 平台進行整合,讓使用者只需按幾下 Windows,即可輕鬆購買您的內容。
允許未封裝應用程式的付費使用者移轉至已封裝的版本
如果使用者已在您的網站購買您的產品,他們就不應該再次付費來從 Store 下載已封裝的版本。 為了確保順暢的轉換,我們建議使用下列方法:
- 提供產品的免費/示範版本,讓使用者透過應用程式內購買來解鎖完整版本。 對於已經在您網站上付費的使用者,請讓他們登入以驗證其授權,或在應用程式的使用者介面中輸入其授權金鑰,以存取完整版本。
- 將您的應用程式設定為付費提供,但透過您自己的頻道將優惠券代碼發佈給現有的使用者。 這些代碼會允許他們下載 Store 版本,不需額外費用。 如需詳細資訊,請參閱產生促銷碼。
如何移轉現有的釘選工作列和開始功能表捷徑
您的使用者可能會將您的傳統型應用程式釘選至工作列或 [開始] 功能表。 您可以將這些捷徑導向至新的已封裝應用程式,方法是在應用程式資訊清單中包含 "windows.desktopAppMigration" 延伸模組。
範例
xmlns:rescap3="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities/3"
...
<Extensions>
<rescap3:Extension Category="windows.desktopAppMigration">
<rescap3:DesktopAppMigration>
<rescap3:DesktopApp AumId="[your_app_aumid]" />
<rescap3:DesktopApp ShortcutPath="%USERPROFILE%\Desktop\[my_app].lnk" />
<rescap3:DesktopApp ShortcutPath="%APPDATA%\Microsoft\Windows\Start Menu\Programs\[my_app].lnk" />
<rescap3:DesktopApp ShortcutPath="%PROGRAMDATA%\Microsoft\Windows\Start Menu\Programs\[my_app_folder]\[my_app].lnk"/>
</rescap3:DesktopAppMigration>
</rescap3:Extension>
</Extensions>
安裝應用程式之後,工作列或 [開始] 功能表中的釘選,以及圖標 (如果是 Windows 10) 會自動啟動 Store 版應用程式。
如何移轉副檔名和通訊協定關聯
如果您的應用程式支援副檔名或通訊協定關聯,且使用者已選取您的應用程式作為特定副檔名和通訊協定的預設應用程式,您可以選擇將這些關聯移轉至 Store 版的已封裝應用程式。 使用下列程式碼片段更新應用程式資訊清單,即可達成此移轉。
xmlns:rescap3="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities/3"
...
<Extensions>
<uap:Extension Category="windows.fileTypeAssociation">
<uap3:FileTypeAssociation Name=".foo">
<rescap3:MigrationProgIds>
<rescap3:MigrationProgId>Foo.Bar.1</rescap3:MigrationProgId>
</rescap3:MigrationProgIds>
…
</uap3:FileTypeAssociation>
</uap:Extension>
</Extensions>
只要列出您要移轉的程式設計識別碼,系統就會在安裝後自動將他們移轉至您的應用程式。