-- Gestione notifiche -- Aggiunti pacchetti NuGet: - Microsoft.AspNet.SignalR (2.4.3) -> Per gestione connessione - Microsoft.Owin.Security.Jwt (4.2.3) -> Per autenticazione Create classi: - StartUp -> Avvia SignalR - NotificheHub -> Gestisce la connessione client - server - NotificheService -> Servizio che invia le notifiche Tabelle nuove -- Dispositivi connessi CREATE TABLE AppDispositivi ( ID INT IDENTITY PRIMARY KEY, IDConnessione NVARCHAR(100) NULL, -- Id della connessione con SignalR. Si azzera quandi si disconnette il telefono UserId NVARCHAR(100) NOT NULL, DeviceId NVARCHAR(200) NOT NULL, -- identificativo univoco del dispositivo UltimaConnessione DATETIME NULL, CONSTRAINT UQ_DeviceId UNIQUE (DeviceId) ) -- elenco notifiche CREATE TABLE AppNotifiche ( ID INT PRIMARY KEY, DeviceId VARCHAR(200) NOT NULL, Titolo VARCHAR(200) NOT NULL, Testo VARCHAR(MAX) NOT NULL, Comando VARCHAR(50) NULL, -- es. 'APRI_URL', 'APRI_PDF' ComandoParam VARCHAR(MAX) NULL, -- URL o path PDF Stato VARCHAR(20) NOT NULL DEFAULT 'IN_ATTESA', DataCreazione DATETIME NOT NULL DEFAULT GETDATE(), DataConsegna DATETIME NULL ) -- Sequenza per AppNotifiche CREATE SEQUENCE [dbo].[Seq_AppNotifiche] AS [bigint] START WITH 0 INCREMENT BY 1 MINVALUE 0 MAXVALUE 9223372036854775807 CACHE GO ┌─────────────────────────────────────┐ │ NotificheHub │ │ (istanziato da SignalR) │ │ │ App MAUI ────────────►│ RegistraDispositivo() │ App MAUI ────────────►│ ConfermaNotitica() │ App MAUI ────────────►│ OnDisconnected() │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ WSMetheosApp │ │ │ Tuo codice ──────────►│ InviaNotifica() │──────► App MAUI (es. ASMX, altro) │ │ (via GetHubContext) └─────────────────────────────────────┘ Flusso completo: - Il client parla solo con NotificheHub — si connette, si registra, manda gli ACK (conferma di connessione) Quando si connette, nel DB connID viene valorizzato, quando si disconnette torna NULL - Il server parla chiama InviaNotifica e non sa nulla di SignalR - WSMetheosApp.InviaNotifica internamente usa GetHubContext per raggiungere il client attraverso l'Hub App MAUI si connette │ ▼ RegistraDispositivo() ──► ConnId = "abc123" ← SCRITTO │ │ (connessione attiva, ConnId rimane "abc123") │ ├── InviaNotifica() legge ConnId per sapere dove mandare il push ← LETTO │ App MAUI perde connessione / cambia cella │ ▼ OnDisconnected() ──► ConnId = NULL ← AZZERATO │ App MAUI si riconnette (riconnessione automatica) │ ▼ RegistraDispositivo() ──► ConnId = "xyz789" ← AGGIORNATO (nuovo ID) ---------------------- Mi sono fermato in WSMetheosApp.asmx.vb InviaNotifica Bisogna: - finire quella procedura che effettua l'invio - Verificare tutto NotificheHub - Testare con VB6 (vedi routine di scambio zigolo time) - Implementare la registrazione e ricezione in MAUI -------------------- Tempo WS Client Installa l'APP Scansiona un QR -> Viene scritto un file txt contenente: - Azienda (AziendeWS.dbo.Aziende.Codice) - Password (AziendeWS.dbo.Aziende.UtePass) Viene poi chiesto di indicare un nome utente segnalando che sarà visibile nel sistema -> Max 8 caratteri senza simboli tutto maiuscolo Viene aggiornato il file TXT SignalR si inizializza e si connette al WS (.CreateHubProxy("NotificheHub")) Vengono registrati gli eventi nell'hub _hub.ON -> Eventi che vengono richiamati dal server nel client _hub.Invoke -> Eventi che il client richiama nel server Viene lanciata la registrazione passando Azienda - Password - NomeUtente - IDDispositivo Scatta NotificheHub.RegistraDispositivo - Verifica credenziali corrette - Verifica nome utente non doppio - Salva/Aggiorna il device nel DB Viene risposto con la conferma Viene ricevuta la conferma della connessione SignalR inizia il polling, se ci sono notifiche in sospeso per quel NomeUtente vengono ricevute ---------------------------------------- Da Pitagora invio la notifica --------------------------------------------------------------- Chiamata SOAP a InviaNotificaDispositivo Si crea la notifica nel DB InviaNotifica verifica se il dispositivo è connesso ed in caso spedisce tutte le notifiche pendenti richiamando nel client "riceviNotifica" SignalR riceve la richiesta e fa scattare l'evento registrato "riceviNotifica", il quale fa scattare la mia routine "DisplayNotifica"