Italian App a scadenza annuale, come fare?

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ciao a tutti, come da titolo vorrei realizzare un'app che alla scadenza di un periodo prefissato e cioè di 365 giorni a partire dal giorno impostato, questi dovrebbe avvisare l'utilizzatore a rinnovare la licenza, qualcuno di voi a fatto qualcosa in merito? vorrei inoltre che se lìutente mettesse indietro il calendario, questi dovrebbe lo stesso avvisare l'utente della licenza scaduta.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
posso utilizzare un db sqlite in locale, ma dimmi come funziona anche in remoto
anche se volevo cercare di usare il datetime.date
 

MarcoRome

Expert
Licensed User
Longtime User
allora potresti leggere la data su internet e a quel punto non avresti bisogno ne di DB remoto ne di orologio indietro etc.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
il problema è che al 90% dei casi lavorerà offline.
Quindi dovrei utilizzare una alternativa ad internet
 

MarcoRome

Expert
Licensed User
Longtime User
Ti basterebbe collegarti solo alla partenza.... oppure utilizza un file.ini sotto la cartella DirInternal ( casomai con i dati cryptati..altrimenti potrebbero cambiarla se hanno un telefono con root ) dove memorizzi la data e ora ogni qualvolta lanci l'applicativo.
Se provano a farlo tornare indietro i conti non torneranno...e quindi bloccherai l'app. Facendoti un esempio.
La tua app scade il 05.03.2017 Genn 2018.
Oggi è la prima volta che eseguono l'app. Leggi la data e l'ora e memorizzi lo stesso quindi 04.03.2017 ore 16:32.... e cosi via dicendo tutte le volte in cui aprono l'app...
Se ad esempio domani mattina, giorno di scadenza cambiano la data e quindi supponiamo che cambiano la data e la portano un giorno indietro o 10 giorni indietro risulterà 04.03.2017 ( quindi un giorno indietro ) ma l'ora se sarà minore ( ipotesi lanciano l'app la mattina ) 11:32. Potrai fare un controllo che l'ultima data che hai registrato e maggiore di oggi...e quindi c'è qualcosa che non va ;).
Questo potrebbe essere uno dei tanti modi
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
sto preparando un pezzettino di codice, poi lo posto e mi dici cosa ne pensi
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
con questo codice faccio una verifica, adesso devo memorizzare questi dati creando un file.ini che essendo stato creato questi non permette la riapertura del programma, adesso dovrei anche creare una sorta di codice che memorizza la data di partenza e se viene inserita una data inferiore allora dovrà dare le stesse modalità della licenza scaduta, come fare al momento non lo so ma ci sto smanettando.....
B4X:
Dim targetDate As Long = DateUtils.SetDate(txtyear.Text, txtmonth.Text, txtday.Text)' uso 3 caselle di testo per l'anno, mese, giorno che memorizzano i dati in un db.
  
    Dim timeToDate As Period = DateUtils.PeriodBetween(DateTime.Now, targetDate)
  
    Msgbox("Time left to 2017: " & timeToDate.Months & " months, " & timeToDate.Days & " days","")
  
    If  timeToDate.Months = 0 And timeToDate.Days = 0 Then ' se risultano a 0 allora mi da licenza scaduta altrimenti continua ad utilizzarlo
      
        Msgbox("Licenza scaduta","")
      
    Else
          
        Msgbox("vai tranquillo","")
          
    End If
 

MarcoRome

Expert
Licensed User
Longtime User
con questo codice faccio una verifica, adesso devo memorizzare questi dati creando un file.ini che essendo stato creato questi non permette la riapertura del programma, adesso dovrei anche creare una sorta di codice che memorizza la data di partenza e se viene inserita una data inferiore allora dovrà dare le stesse modalità della licenza scaduta, come fare al momento non lo so ma ci sto smanettando.....
B4X:
Dim targetDate As Long = DateUtils.SetDate(txtyear.Text, txtmonth.Text, txtday.Text)' uso 3 caselle di testo per l'anno, mese, giorno che memorizzano i dati in un db.
 
    Dim timeToDate As Period = DateUtils.PeriodBetween(DateTime.Now, targetDate)
 
    Msgbox("Time left to 2017: " & timeToDate.Months & " months, " & timeToDate.Days & " days","")
 
    If  timeToDate.Months = 0 And timeToDate.Days = 0 Then ' se risultano a 0 allora mi da licenza scaduta altrimenti continua ad utilizzarlo
     
        Msgbox("Licenza scaduta","")
     
    Else
         
        Msgbox("vai tranquillo","")
         
    End If

Prova questo codicello ;) :

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim anno, mese, giorno, chiave As String
    anno = "2017"
    mese = "03"
    giorno = "05"
    chiave = "123456"
    Dim verificaanno(), verificamese(), verificagiorno() As Byte
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.
    Dim cifro As B4XCipher
    Dim encode, decode As StringUtils
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    'Activity.LoadLayout("Layout1")

    Dim annocrypt(), mesecrypt(), giornocrypt() As Byte
    Dim a_crypt, m_crypt, g_crypt As String
  
    annocrypt = Encrypt(anno)
    a_crypt = encode.EncodeBase64(annocrypt)
    Log(a_crypt)
   
    mesecrypt = Encrypt(mese)
    m_crypt = encode.EncodeBase64(mesecrypt)
    Log(m_crypt)
   
    giornocrypt = Encrypt(giorno)
    g_crypt = encode.EncodeBase64(giornocrypt)
    Log(g_crypt)

   
    Dim map3 As Map
    map3.Initialize
    If File.Exists(File.DirInternal,"licenza.ini") Then
        map3 = File.ReadMap(File.DirInternal, "licenza.ini")
        Log("Anno: " & map3.Get("anno"))
        verificaanno = decode.DecodeBase64(map3.Get("anno"))
        verificamese = decode.DecodeBase64(map3.Get("mese"))
        verificagiorno = decode.DecodeBase64(map3.Get("giorno"))
        Dim a_decrypt, m_decrypt, g_decrypt  As String
        a_decrypt = Decrypt(verificaanno)
        m_decrypt =  Decrypt(verificamese)
        g_decrypt =  Decrypt(verificagiorno)
    Else
        Dim map2 As Map
        map2.Initialize
        map2.Put("anno", a_crypt )
        map2.Put("mese", m_crypt )
        map2.Put("giorno", g_crypt )
        File.WriteMap(File.DirInternal,  "licenza.ini", map2)
        verificaanno = decode.DecodeBase64(a_crypt)
        verificamese = decode.DecodeBase64(m_crypt)
        verificagiorno = decode.DecodeBase64(g_crypt)
        Dim a_decrypt, m_decrypt, g_decrypt  As String
        a_decrypt = Decrypt(verificaanno)
        m_decrypt =  Decrypt(verificamese)
        g_decrypt =  Decrypt(verificagiorno)
    End If
   
   

   
    Dim targetDate As Long = DateUtils.SetDate(a_decrypt, m_decrypt, g_decrypt)' uso 3 caselle di testo per l'anno, mese, giorno che memorizzano i dati in un db.
   
    Dim timeToDate As Period = DateUtils.PeriodBetween(DateTime.Now, targetDate)
   
    Msgbox("Time left to 2017: " & timeToDate.Months & " months, " & timeToDate.Days & " days","")
   
    If  timeToDate.Months = 0 And timeToDate.Days = 0 Then ' se risultano a 0 allora mi da licenza scaduta altrimenti continua ad utilizzarlo
   
        Msgbox("Licenza scaduta","")
   
    Else
   
        Msgbox("vai tranquillo","")
   
    End If

End Sub

Sub Encrypt(testo As String) As Byte()
    Dim ByteArray() As Byte
    ByteArray=cifro.Encrypt(testo.GetBytes("UTF8"), chiave)
    Return ByteArray
End Sub



Sub Decrypt(testo() As Byte) As String
    Dim ByteArray() As Byte
    ByteArray=cifro.Decrypt(testo, chiave)
    Return BytesToString(ByteArray, 0, ByteArray.Length, "UTF8")
End Sub

Ovviamente compila con opzione obfuscated.
Oppure c'è questa libreria:
Library ProtectYourApp
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
che ne pensi di questo? lo provato e funziona alla grande, semplice semplice.
serve a stabilire se l'app è impostata con una data diversa, in tal caso esce dall'applicazione.
B4X:
If DateTime.GetYear(now) < txtyear.Text - 2 Then
        Msgbox("Data del dispositivo impostata in modo errata o tentativo di rimettere indietro la data volontariamente, reimpostare la data affinchè possa essere riutilizzata l'app, il dispositivo uscirà dall'applicazione","AVVISO")
      
        ExitApplication
        Else
          
      
    End If
 

MarcoRome

Expert
Licensed User
Longtime User
L'esempio che ti ho incollato sopra ( #12 ) basta che sostituisci:
B4X:
....
Dim anno, mese, giorno, chiave As String
anno = "2017"
mese = "03"
giorno = "05"
.....
con la data di scadenza che vuoi
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
si, in sostanza quest'app funziona in questo modo, legge il contenuto di un file cryptato se questi corrisponde al contenuto da me inviato allora funziona, se questi non corrisponde il contentuto oppure non esiste allora l'app non parte ed invita ad inserire un numero che viene creato in random, questo numero verrà inviato tramite sms con l'aggiunta di un codice cryptato a sua volta questo codice viene decriptato da una mia app creata in visual basic ed poi reinviato all'app tramite sms, questi sblocca il telefono consentendo l'uso dell'app, usando il datetime.now e ciò che hai visto sopra confronto se l'app sta nei limiti dell'utilizzo annuale, se supera il limite quest'app rimanda ad un messaggio che avvert che l'app e scaduta e che ha bisogno di un nuovo codice di sblocco, se viene inserita una data indietro a quella attuale semplicemente avverte l'operatore di sistemare la data e finchè non si sistema essa non fa partire l'app.
 

MarcoRome

Expert
Licensed User
Longtime User
Fifi, ma lo sai che non ci ho capito una mazza. :D:D:D
Comunque se hai risolto ...meglio cosi
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
comunque il tuo codice lo proverò, mi sembra molto originale, il mio lo fatto con poche righe di codice senza tanti problemi, considera che sono rimasto indietro con la programmazione, e pensare che prima facevo i tutorial per insegnare gli altri a programmare ma ahime sono rimasto alle semplici funzioni di porgrammazione, adesso avrei io bisogno di tutorial :)
 

LucaMs

Expert
Licensed User
Longtime User
adesso avrei io bisogno di tutorial

Avresti anche bisogno di farmi almeno sapere se il progetto che ti ho inviato ti sia stato utile.

E vero che sono tanto idiota da sprecare troppo tempo della mia vita ed è anche vero che magari non era la soluzione che ti serviva, ma perlomeno un commento avresti potuto darlo... è passata una settimana!

E pure qualche like a chi ti risponde e pubblica codice per te, come ha fatto Marco, non costa moltissimo.
 
Last edited:

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ti chiedo scusa LucaMs ma sono stato preso da tanti lavori che ho dovuto trascurare un po quel progetto con la quale avevo chiesto il tuo aiuto, poi ho il brutto vizio di iniziare diversi progetti per poi capitare anche di lasciarmi sfuggire anche un commento di risposta per un aiuto davvero importante, non rendendomi conto che alcuni magari si spendono del tempo per aiutarti, rinnovo ancora le scuse per questo mio errore.
 
Top