Creazione di un componente aggiuntivo nativo C++ con notifiche

Questa guida illustra come creare un componente aggiuntivo nativo C++ che chiama le API di notifica SDK per app di Windows nell'app Electron. Questo è un ottimo punto di partenza per comprendere i componenti aggiuntivi nativi prima di approfondire scenari più complessi.

Prerequisiti

Prima di iniziare questa guida, assicurarsi di avere:

Passaggio 1: Creare un componente aggiuntivo nativo C++

Si creerà un componente aggiuntivo nativo usando C++ e node-addon-api. In questo modo è possibile accedere direttamente alle API di Windows con prestazioni massime.

npx winapp node create-addon

Annotazioni

Questo comando potrebbe richiedere di installare Python o gli strumenti di Visual Studio necessari se non sono già installati.

Verrà creata una nativeWindowsAddon/ cartella con:

  • nativeWindowsAddon.cc - Codice C++ che chiamerà le API Di Windows
  • binding.gyp - Configurazione della compilazione per node-gyp

Il comando installa anche le dipendenze di sviluppo necessarie (nan, node-addon-api, node-gyp) e aggiunge uno script build-nativeWindowsAddon al package.json:

{
  "scripts": {
    "build-nativeWindowsAddon": "node-gyp clean configure build --directory=nativeWindowsAddon"
  }
}

Il modello generato include una funzione di esempio ShowNotification che usa le API di notifica Windows SDK. Verificare che tutto sia configurato correttamente creando il componente aggiuntivo:

# Build the C++ addon
npm run build-nativeWindowsAddon

Annotazioni

È anche possibile creare un componente aggiuntivo C# usando npx winapp node create-addon --template cs. I componenti aggiuntivi C# usano node-api-dotnet. Per altre opzioni, vedere le altre guide per la creazione di componenti aggiuntivi o la documentazione completa dei comandi .

Passaggio 2: Testare il componente aggiuntivo generato

Verificare che il componente aggiuntivo generato funzioni chiamandolo dal processo principale. Aprire src/index.js:

  1. Aggiungi l'import dell'addon insieme alle altre istruzioni require nella parte superiore.
const nativeWindowsAddon = require('../nativeWindowsAddon/build/Release/nativeWindowsAddon.node');
  1. Chiamare la funzione di notifica alla fine della funzione createWindow().
const createWindow = () => {
  // ... existing window creation code ...

  // Test the Windows SDK notification
  nativeWindowsAddon.showNotification(
    'Hello from Electron!',
    'This notification uses the Windows SDK.'
  );
};

Prima che l'API di notifica funzioni, è necessario assicurarsi che l'app venga eseguita con l'identità. Corri!

npx winapp node add-electron-debug-identity

Annotazioni

Questo comando fa già parte dello postinstall script aggiunto nella guida all'installazione, quindi viene eseguito automaticamente dopo npm install. Tuttavia, è necessario eseguirlo manualmente ogni volta che si modifica Package.appxmanifest, si aggiornano gli asset dell'app o si reinstallano le dipendenze.

Ora esegui l'applicazione:

npm start

Verrà visualizzata una notifica. 🎉 Il componente aggiuntivo generato funziona subito senza bisogno di configurazione.

⚠️ Problema noto: arresto anomalo dell'app o finestra vuota (fare clic per espandere)

Esiste un bug noto di Windows con la creazione sparsa di pacchetti di applicazioni Electron che causa l'arresto anomalo dell'app all'avvio o al mancato renderizzazione del contenuto web. Il problema è stato risolto in Windows ma non è ancora stato propagato a tutti i dispositivi.

Per una soluzione alternativa, vedere Configurazione dell'ambiente di sviluppo .

Passaggio 3: Eseguire l'aggiornamento alle notifiche di SDK per app di Windows

Ora che il componente aggiuntivo è stato confermato, è possibile aggiornarlo per usare le API di notifica moderne SDK per app di Windows (Microsoft.Windows.AppNotifications), che offrono un'esperienza di sviluppo migliore e altre funzionalità. È già stato configurato il SDK per app di Windows quando è stato eseguito il comando init dai passaggi di installazione.

Aprire nativeWindowsAddon/nativeWindowsAddon.cc e sostituire l'intero contenuto con questo codice:

#include <napi.h>
#include <windows.h>

#include <winrt/Windows.Foundation.h>
#include <winrt/Microsoft.Windows.AppNotifications.h>
#include <winrt/Microsoft.Windows.AppNotifications.Builder.h>

using namespace winrt;
using namespace Microsoft::Windows::AppNotifications;
using namespace Microsoft::Windows::AppNotifications::Builder;

// Function to display a Windows App SDK notification
void ShowNotification(const Napi::CallbackInfo& info) {
    Napi::Env env = info.Env();

    try {
        // Get arguments from JavaScript (title and message)
        if (info.Length() < 2 || !info[0].IsString() || !info[1].IsString()) {
            Napi::TypeError::New(env, "Expected two string arguments: title and message").ThrowAsJavaScriptException();
            return;
        }

        std::string title = info[0].As<Napi::String>();
        std::string message = info[1].As<Napi::String>();

        // Convert to wide strings
        std::wstring wTitle(title.begin(), title.end());
        std::wstring wMessage(message.begin(), message.end());

        // Use AppNotificationBuilder for a cleaner API
        AppNotificationBuilder builder;
        builder.AddText(wTitle);
        builder.AddText(wMessage);
        
        AppNotification notification = builder.BuildNotification();
        AppNotificationManager::Default().Show(notification);

    } catch (const winrt::hresult_error& ex) {
        Napi::Error::New(env, winrt::to_string(ex.message())).ThrowAsJavaScriptException();
    } catch (const std::exception& ex) {
        // Handle exceptions and throw back to JavaScript
        Napi::Error::New(env, ex.what()).ThrowAsJavaScriptException();
    } catch (...) {
        Napi::Error::New(env, "Unknown error occurred").ThrowAsJavaScriptException();
    }
}

// Initialize the module
Napi::Object Init(Napi::Env env, Napi::Object exports) {
    exports.Set(Napi::String::New(env, "showNotification"), Napi::Function::New(env, ShowNotification));
    return exports;
}

NODE_API_MODULE(addon, Init)

Le modifiche chiave in questo caso passano dallo spazio dei nomi Windows.UI.Notifications al moderno Microsoft.Windows.AppNotifications API e usano AppNotificationBuilder per costruire notifiche invece di creare manualmente stringhe XML. In questo modo è disponibile un'API più pulita e gestibile coerente con i modelli di SDK per app di Windows.

Passaggio 4: Ricompilare e testare

Ricompilare ora il componente aggiuntivo con il codice aggiornato:

npm run build-nativeWindowsAddon

Aggiornare il messaggio in src/index.js per riflettere la modifica:

nativeWindowsAddon.showNotification(
  'Hello from Electron!',
  'This notification is powered by the Windows App SDK!'
);

Eseguire di nuovo l'app:

npm start

Verrà visualizzata la notifica aggiornata usando le API di SDK per app di Windows moderne.

Operazioni successive

Complimenti. Hai creato con successo un componente aggiuntivo C++ nativo che chiama le API di SDK per app di Windows! 🎉

A questo momento è possibile:

In alternativa, esplorare altre guide:

Risorse aggiuntive