Mengintegrasikan aplikasi yang tidak dikemas dengan Windows Share
Artikel ini menjelaskan cara mengintegrasikan aplikasi yang tidak dikemas dengan fitur Windows Share . Fitur Bagikan memungkinkan pengguna berbagi konten dari satu aplikasi Windows ke aplikasi Windows lainnya. Aplikasi yang tidak dikemas harus disediakan dengan identitas paket sehingga dapat mendaftar sebagai Target Berbagi. Setelah terdaftar, aplikasi dapat menerima dan memproses file bersama.
Cara onboarding aplikasi yang tidak dipaketkan sebagai Target Berbagi:
- Berikan identitas paket kepada aplikasi
- Menerapkan kontrak Berbagi
Menyediakan aplikasi yang tidak dikemas dengan identitas paket
Aplikasi bisa mendapatkan identitas paket dengan dua cara:
- Buat paket penginstalan MSIX baru (metode pilihan) ATAU
- Buat aplikasi yang dibungkus dengan lokasi eksternal kompatibel dengan alat penginstal saat ini. Ini hanya direkomendasikan untuk aplikasi yang memiliki alat penginstal yang ada dan yang tidak dapat beralih ke penginstalan MSIX.
Membuat paket penginstalan MSIX baru
Disarankan untuk mengemas aplikasi dengan MSIX menggunakan templat Proyek Kemasan Aplikasi Windows di Visual Studio. Ini akan mencakup semua biner dalam paket MSIX dan memberikan pengalaman penginstalan yang bersih dan tepercaya.
Hal-hal yang perlu diperhatikan sebelum mengemas aplikasi desktop: Bersiaplah untuk mengemas aplikasi desktop (MSIX).
Ikuti langkah-langkah dalam Menyiapkan aplikasi desktop Anda untuk kemasan MSIX di Visual Studio untuk menghasilkan paket untuk proyek aplikasi yang sudah ada.
Catatan
Saat membuat proyek pengemasan, pilih Windows 10, versi 2004 (10.0; Build 19041) atau yang lebih baru sebagai versi Minimum.
Setelah selesai, Anda akan membuat paket dengan mengikuti Paket desktop atau aplikasi UWP di Visual Studio.
Membuat pengemasan dengan lokasi eksternal kompatibel dengan alat penginstal saat ini
Cara kedua untuk memberikan identitas paket aplikasi Anda adalah dengan menambahkan paket dengan lokasi eksternal ke aplikasi Anda dan mendaftarkannya dengan alat penginstal yang ada. Paket dengan lokasi eksternal adalah paket MSIX kosong yang berisi .appxmanifest yang memiliki identitas, pendaftaran target berbagi, dan aset visual. Biner aplikasi masih dikelola oleh alat penginstal aplikasi yang ada. Saat mendaftarkan paket, Anda perlu menyediakan lokasi penginstalan aplikasi di API. Penting untuk menyimpan identitas dalam manifes paket MSIX dan manifes aplikasi Win32 sinkron dengan sertifikat yang digunakan untuk menandatangani aplikasi.
Langkah-langkah untuk memberikan identitas paket ke aplikasi yang tidak dikemas
Dokumentasi tentang cara membuat paket dengan lokasi eksternal tersedia di sini, termasuk informasi tentang templat yang akan digunakan: Memberikan identitas paket dengan pengemasan dengan lokasi eksternal.
Aplikasi sampel lengkap tersedia di GitHub: SparsePackages (Dikemas dengan Lokasi Eksternal).
Mendaftar sebagai Target Berbagi
Setelah aplikasi memiliki identitas paket, langkah selanjutnya adalah menerapkan kontrak Berbagi. Kontrak Berbagi memungkinkan aplikasi Anda menerima data dari aplikasi lain.
Anda dapat mengikuti langkah-langkah yang sama di bagian Daftar sebagai Target Berbagi dari dokumentasi untuk aplikasi kemasan untuk diintegrasikan dengan Share Sheet.
Panduan sampel aplikasi PhotoStore
Dalam panduan ini tentang identitas paket, pendaftaran & aktivasi berbagi untuk Aplikasi Win32 yang tidak dikemas, Anda akan mempelajari cara memberikan identitas paket ke aplikasi Win32 yang tidak dikemas dengan membuat paket dengan lokasi eksternal. Setelah aplikasi memiliki identitas paket, aplikasi dapat mendaftar dan menangani aktivasi sebagai Target Berbagi. Anda akan mengambil langkah-langkah berikut menggunakan sampel PhotoStoreDemo:
- Hasilkan
AppxManifest.xml
file - Buat paket
- Menandatangani paket
- Daftarkan paket
- Menangani aktivasi aplikasi
Mulailah dengan membuat AppxManifest.xml
file, yang mencakup properti yang diperlukan seperti <AllowExternalContent>
, identitas, dan kemampuan & berbagi ekstensi target. Pastikan Publisher
nilai , PackageName
& ApplicationId
dalam AppxManifest.xml
file cocok dengan nilai dalam PhotoStoreDemo.exe.manifest
file. Nilai Publisher
juga harus cocok dengan nilai dalam sertifikat yang digunakan untuk menandatangani paket. Tambahkan aset visual sebagaimana diperlukan dan dirujuk di AppxManifest.xml
. Di Visual Studio, Anda dapat menggunakan simpul Visual Assets saat mengedit package.manifest
di proyek Kemasan Aplikasi untuk menghasilkan aset visual yang diperlukan.
Ini adalah cuplikan sampel AppxManifest.xml
dengan konten eksternal yang diizinkan:
<Identity Name="PhotoStoreDemo" ProcessorArchitecture="neutral" Publisher="CN=YourPubNameHere" Version="1.0.0.0" />
<Properties>
<DisplayName>PhotoStoreDemo</DisplayName>
<PublisherDisplayName>Sparse Package</PublisherDisplayName>
<Logo>Assets\storelogo.png</Logo>
<uap10:AllowExternalContent>true</uap10:AllowExternalContent>
</Properties>
<Resources>
<Resource Language="en-us" />
</Resources>
<Dependencies>
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.19041.0" MaxVersionTested="10.0.19041.0" />
</Dependencies>
<Capabilities>
<rescap:Capability Name="runFullTrust" />
<rescap:Capability Name="unvirtualizedResources"/>
</Capabilities>
<Applications>
<Application Id="PhotoStoreDemo" Executable="PhotoStoreDemo.exe" uap10:TrustLevel="mediumIL" uap10:RuntimeBehavior="win32App">
<uap:VisualElements AppListEntry="none" DisplayName="PhotoStoreDemo" Description="PhotoStoreDemo" BackgroundColor="transparent" Square150x150Logo="Assets\Square150x150Logo.png" Square44x44Logo="Assets\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="Assets\Wide310x150Logo.png" Square310x310Logo="Assets\LargeTile.png" Square71x71Logo="Assets\SmallTile.png"></uap:DefaultTile>
<uap:SplashScreen Image="Assets\SplashScreen.png" />
</uap:VisualElements>
<Extensions>
<uap:Extension Category="windows.shareTarget">
<uap:ShareTarget Description="Send to PhotoStoreDemo">
<uap:SupportedFileTypes>
<uap:FileType>.jpg</uap:FileType>
<uap:FileType>.png</uap:FileType>
<uap:FileType>.gif</uap:FileType>
</uap:SupportedFileTypes>
<uap:DataFormat>StorageItems</uap:DataFormat>
<uap:DataFormat>Bitmap</uap:DataFormat>
</uap:ShareTarget>
</uap:Extension>
...
Ini adalah contoh file Application.exe.manifest:
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="PhotoStoreDemo.app"/>
<msix xmlns="urn:schemas-microsoft-com:msix.v1"
publisher="CN=YourPubNameHere"
packageName="PhotoStoreDemo"
applicationId="PhotoStoreDemo"
/>
</assembly>
Selanjutnya, untuk membuat paket dengan lokasi eksternal, gunakan MakeAppx.exe
alat dengan /nv
perintah untuk membuat paket yang berisi AppxManifest.xml
file.
Contoh:
MakeAppx.exe pack /d <Path to directory with AppxManifest.xml> /p <Output Path>\mypackage.msix /nv
Catatan
Paket dengan lokasi eksternal berisi manifes paket, tetapi tidak ada biner dan konten aplikasi lainnya. Manifes paket dengan lokasi eksternal dapat mereferensikan file di luar paket di lokasi eksternal yang telah ditentukan.
Tanda tangani paket Anda dengan sertifikat tepercaya menggunakan SignTool.exe
.
Contoh:
SignTool.exe sign /fd SHA256 /a /f <path to cert> /p <cert key> <Path to Package>
Sertifikasi yang digunakan untuk menandatangani paket harus diinstal di lokasi tepercaya pada komputer.
Pada eksekusi pertama aplikasi, daftarkan paket dengan Windows. Ketika aplikasi memiliki alat penginstalnya sendiri, aplikasi juga harus berisi MSIX yang ditandatangani sebagai payload dan harus menempatkannya ke lokasi tertentu (misalnya, lokasi penginstalan aplikasi). Lokasi ini harus diketahui oleh aplikasi saat runtime karena aplikasi akan memerlukan jalur absolut MSIX untuk mendaftarkannya. Tempatkan aset dan resources.pri
di lokasi penginstalan aplikasi juga.
Kode berikut adalah contoh eksekusi metode Utama aplikasi yang tidak dikemas:
[STAThread]
public static void Main(string[] cmdArgs)
{
//if app isn't running with identity, register its package with external identity
if (!ExecutionMode.IsRunningWithIdentity())
{
//TODO - update the value of externalLocation to match the output location of your VS Build binaries and the value of
//externalPkgPath to match the path to your signed package with external identity (.msix).
//Note that these values cannot be relative paths and must be complete paths
string externalLocation = Environment.CurrentDirectory;
string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";
//Attempt registration
bool bPackageRegistered = false;
//bPackageRegistered = registerPackageWithExternalLocation(externalLocation, externalPkgPath);
if (bPackageRegistered)
{
//Registration succeeded, restart the app to run with identity
System.Diagnostics.Process.Start(Application.ResourceAssembly.Location, arguments: cmdArgs?.ToString());
}
else //Registration failed, run without identity
{
Debug.WriteLine("Package Registration failed, running WITHOUT Identity");
SingleInstanceManager wrapper = new SingleInstanceManager();
wrapper.Run(cmdArgs);
}
}
...
Contoh ini menunjukkan cara mendaftarkan MSIX pada eksekusi pertama aplikasi:
[STAThread]
public static void Main(string[] cmdArgs)
{
//If app isn't running with identity, register its package with external identity
if (!ExecutionMode.IsRunningWithIdentity())
{
//TODO - update the value of externalLocation to match the output location of your VS Build binaries and the value of
//externalPkgPath to match the path to your signed package with external identity (.msix).
//Note that these values cannot be relative paths and must be complete paths
string externalLocation = Environment.CurrentDirectory;
string externalPkgPath = externalLocation + @"\PhotoStoreDemo.package.msix";
//Attempt registration
if (registerPackageWithExternalLocation(externalLocation, externalPkgPath))
{
//Registration succeeded, restart the app to run with identity
System.Diagnostics.Process.Start(Application.ResourceAssembly.Location, arguments: cmdArgs?.ToString());
}
else //Registration failed, run without identity
{
Debug.WriteLine("Package Registration failed, running WITHOUT Identity");
SingleInstanceManager wrapper = new SingleInstanceManager();
wrapper.Run(cmdArgs);
}
}
...
Terakhir, tangani aktivasi aplikasi:
[STAThread]
public static void Main(string[] cmdArgs)
{
//if app isn't running with identity, register its sparse package
if (!ExecutionMode.IsRunningWithIdentity())
{
...
}
else //App is registered and running with identity, handle launch and activation
{
//Handle Sparse Package based activation e.g Share target activation or clicking on a Tile
// Launching the .exe directly will have activationArgs == null
var activationArgs = AppInstance.GetActivatedEventArgs();
if (activationArgs != null)
{
switch (activationArgs.Kind)
{
case ActivationKind.Launch:
HandleLaunch(activationArgs as LaunchActivatedEventArgs);
break;
case ActivationKind.ToastNotification:
HandleToastNotification(activationArgs as ToastNotificationActivatedEventArgs);
break;
case ActivationKind.ShareTarget: // Handle the activation as a share target
HandleShareAsync(activationArgs as ShareTargetActivatedEventArgs);
break;
default:
HandleLaunch(null);
break;
}
}
//This is a direct exe based launch e.g. double click app .exe or desktop shortcut pointing to .exe
else
{
SingleInstanceManager singleInstanceManager = new SingleInstanceManager();
singleInstanceManager.Run(cmdArgs);
}
}
Windows Share dengan demo identitas paket
Video berikut menunjukkan bagaimana aplikasi yang tidak dikemas dapat menjadi target berbagi setelah diberikan identitas paket dan mendaftar sebagai target berbagi:
Lihat juga
- gambaran umum penyebaran SDK Aplikasi Windows
- Buat proyek WinUI 3 pertama Anda
- Migrasi dari UWP ke SDK Aplikasi Windows
- Keuntungan dan Kekurangan pengemasan aplikasi - Gambaran umum penyebaran
- Identitas, Pendaftaran, dan Aktivasi Aplikasi Win32 Non-paket
- Bagikan Implementasi Kontrak untuk Aplikasi WinAppSDK
- Bagikan Implementasi Kontrak untuk Aplikasi yang Dibungkus dengan Lokasi Eksternal
Windows developer