Compatibile con Xcode 8

Introduzione al CloudKit in iOS e Swift

ENTRA NEL NOSTRO GRUPPO FACEBOOK

Certe volte dovremmo scendere dalle nuvole, altre dovremmo farci prendere e trasportare dalla loro forza e potenza!

Se non hai mai sentito la parola nuvole o cloud associato alla programmazione, non scoraggiarti, il motivo risiede nel fatto che solo negli ultimi anni questa tecnologia ha iniziato a diffondersi nella routine quotidiana… Ma aspetta, sai cos’è il cloud?

Il cloud è un vento di tecnologia, la nuova rivoluzione copernicana dopo l’avvento dello stesso internet.

Immagina di scattare una fotografia e di volerla passare sul tuo Mac. Il passaggio è semplicissimo, attacchi il cavo o la memory card al tuo dispositivo e trascini il file dalla fotocamera alla memoria del tuo computer.

Quando scatti una fotografia e la passi sul computer sai benissimo che quel documento risiede in uno spazio della memoria (la cartella per intenderci) del tuo dispositivo. Ma quando carichi la tua foto su Facebook o Dropbox ti sei mai chiesto che fine fa quel documento?

Ebbene si! senza accorgertene già stai utilizzando quello che gli esperti chiamano cloud computing: la capacità di spalmare su internet, anche detto on the cloud, file e informazioni.

Il cloud non è solo la capacità di memorizzare file su internet, il cloud è quella tecnologia che ti permette di ascoltare musica in streaming, utilizzare programmi sulla rete (pensa a Google Drive o Keynote online) o inviare email. Per meglio capire di cosa sto parlando, ti invito a guardare questo video su youtube.

Anche Apple, da ormai molti anni, sta utilizzando questa tecnologia conosciuta con il nome di iCloud: lo spazio d’archiviazione on the cloud utilizzato principalmente per conservare backup e dati essenziali (note, foto, rubrica e email).

Il vantaggio? Avere sempre con te i tuoi documenti.

Ma non finisce qui! Sorpresa delle sorprese, c’è anche iCloud Drive che ti permette di salvare sulla nuvola qualsiasi tipo di file e documento, fornendo finalmente un servizio simile a quelli che già altri concorrenti offrono da tempo (Google Drive e OneDrive).

Ma tu sei un programmatore e devi chiederti, come faccio ad utilizzare la potenza di iCloud all’interno della mia applicazione iOS con il linguaggio Swift?
La risposta alla tua domanda si chiama CloudKit.

cos'è il cloudkit

Spostiamoci sul campo che ci interessa maggiormente, lo sviluppo di applicazioni. Dire che un’app è cloud based significa che alcuni dati utilizzati nella stessa vengono salvati in server online come quelli iCloud.

Apple, per permetterti di salvare dati ed informazioni sui propri server, ti mette a disposizione un framework chiamato CloudKit.

La bellezza di affidarsi ad un servizio come quello offerto da iCloud sta nella semplicità di implementazione e nella sicurezza che ne derivano i dati in esso inseriti. 

Molti pensano che il Cloud sia qualcosa di volubile e di poco affidabile, ma non è assolutamente così! Uno dei vantaggi del cloud è che i dati essendo suddivisi in tanti server, sono anche difficili da recuperare da parte di eventuali attacchi informatici.

Un altro mal pensiero è quello di associare il cloud alla dislocazione dei server nei vari continenti. La potenza del cloud deriva dallo spalmare i dati su più server che, nella maggior parte dei casi, sono residenti nella stessa struttura. Questo ad esempio è il caso dei server Apple.

Fatta questa premessa, il CloudKit è lo strumento, offerto agli sviluppatori, per interfacciare i dati della propria applicazione ad uno spazio dedicato all’interno dei server Apple. I dati, inseriti nel cloud, possono essere condivisi con gli altri utenti oppure mantenuti privati.

3 motivi per utilizzare il cloudkit

3 Motivi per affidarsi al CloudKit

I motivi per cui si sceglie di utilizzare il CloudKit invece di altri servizi online (ad esempio Parse Online) sono 3:

Semplicità di utilizzo

Per avere il permesso di utilizzare il CloudKit, e quindi permettere alla tua applicazione di conservare dati sui server iCloud, è necessario registrarsi al Developer Program. Questo farà si che Apple configuri in automatico uno spazio dedicato alla conservazione delle informazioni delle tue applicazioni.

Dal lato dell’utilizzatore della tua applicazione, il CloudKit evita la creazione di fastidiosi moduli di registrazione dato che vengono utilizzati di default le credenziali dell’account iCloud che ogni utente Apple possiede.

In pratica un utente che utilizza un’app con CloudKit è già di default loggato nello spazio cloud dedicato.

Sicurezza

L’ho già detto poc’anzi, tutte le informazioni vengono salvate sui server Apple. Apple = Sicuro! Quindi utilizzare il CloudKit è sinonimo di sicurezza. In più i dati non possono essere trattati se non nei limiti imposti dal regolamento Apple e dalle norme vigenti in maniera di tutela della privacy Americana.

Non è da sottovalutare questo aspetto, molte compagnie online non ti impongono di trattare e tutelare i dati degli utilizzatori della tua applicazione e per questo, molti potrebbero sbandierare i tuoi dati a società terze come quelle pubblicitarie.

Riflettici! se tutti utilizzano iCloud, perché non dovrebbero utilizzare la tua app CloudKit?

Costi

Apple ti offre una quantità di storage gratuito che non può neanche lontanamente essere paragonato a quello che gli altri servizi mettono sul mercato. Non mi credi? vai a vedere con i tuoi occhi: https://developer.apple.com/icloud/documentation/cloudkit-storage/

Per utilizzare il CloudKit è necessario avere una licenza da sviluppatori iOS. Senza di essa è impossibile procedere con il tutorial.

Il progetto base e la configurazione del CloudKit

In questa introduzione al CloudKit in iOS e Swift, voglio farti creare una semplice applicazione che riesca:

  1. Salvare sui server iCloud delle note personali
  2. Recuperare le note in un secondo momento

Questa volta, dato che voglio direttamente entrare nel vivo della discussione, ho preparato un progetto base che modificherai per aggiungere le funzionalità del CloudKit.

L’applicazione è composta da un ViewController diviso in 2 aree:

  1. Invio delle note sul server iCloud.
  2. Recupero dei dati dal Cloud e visualizzazione in TableView.

anteprima app cloudKit in swift

Puoi scaricare il progetto base da qui:

[wpdm_package id=’2844′]

I prossimi passaggi sono fondamentali per poter utilizzare correttamente il CloudKit! Leggi con attenzione e non andare giù per vedere direttamente il codice :P

Abilitare la connessione al CloudKit

Prima di cominciare devi, modificare il Bundle Identifier della tua applicazione e assicurarti di essere loggato con l’account sviluppatore:

Bundle e Team per CloudKit integrazione

Per evitare la nascita di errori futuri ti consiglio di utilizzare un Identifier unico. Puoi ad esempio utilizzare la seguente sintassi:

  • it.tuoDominio.nomeApp
  • tuoDominio.nomeApp

Se non hai un dominio puoi mettere anche il tuo nome, l’importante è che sia seguito dalla dot notation e dal nome della tua applicazione. Per poter connettere la tua applicazione con iCloud, vai nel menu Capabilities e poi passa su On la voce iCloud: 

abilitare il cloudkit in xcode

Le immagini sono della versione di Xcode precedente. Non ci sono cambiamenti nelle versioni di Xcode successive alla 7.0

Adesso che la tua app è pronta a connettersi ai server iCloud, serve anche uno spazio in cui poter conservare le informazioni pubbliche e private dei tuoi utenti. Lo spazio di memorizzazione prende il nome di Container e per abilitarlo devi spuntare la casella CloudKit:

aggiungere il cloudKit alla propria app

Il Container della tua applicazione ha un identificativo che è dato dall’unione della parola iCloud seguita dal tuo Bundle Identifier e deve obbligatoriamente trovarsi in questa forma, quindi non modificarlo.

Ti ricordo che devi essere loggato con il tuo account da sviluppatore (quindi devi aver pagato i 99€ per l’Apple Developer).

A questo punto la tua applicazione è pronta a connettersi ad iCloud. Una delle cose che noterai dall’utilizzo di questo strumento è l’aggiunta del framework CloudKit. La spunta del “Key-value storage” serve per abilitare il salvataggio dei dati tramite sistema di chiave e valore (come i dizionari in Swift, riuscirai a recuperare i valori salvati accedendo ad una chiave)

Introduzione alla CloudKit DashBoard

La tua app è pronta ad utilizzare il CloudKit e a connettersi con i server iCloud. Per poter accedere all’aria riservata alla gestione dei dati, premi il bottone “CloudKit Dashboard” oppure collegati dal seguente link: https://icloud.developer.apple.com/dashboard/

Dovresti vedere qualcosa di simile a questo:

CloudKit DashBoard

Ricapitoliamo:

  1. Il CloudKit è il kit di strumenti utilizzati per connettere la propria app ai server iCloud.
  2. Ogni app che utilizza il CloudKit può avere associato un Container dove inserire i dati.

Nel Container, cioè lo spazio destinato a tutti i dati della tua applicazione, puoi inserire 3 tipi di “oggetti”, definiti e gestiti nell’area “SCHEMA”, chiamati: Record Types, Security Roles e Subscription Types. In questo tutorial utilizzerai solo il Record Types.

Ti stai chiedendo di che diamine sto parlando?

I Record Types, come rappresentare un oggetto in iCloud

Hai presente la programmazione ad oggetti? classi e oggetti? Il principio di funzionamento del salvataggio dei dati su iCloud non si discosta molto.

Per evitare di generare confusione con diverse tipologie di dati caricati, pensa alla confusione che si verrebbe a creare se mischi foto con documenti di testo o dati che rappresentano oggetti con altri oggetti, Apple ha ben pensato di catalogare le informazioni a blocchi o per meglio dire in Record.

Un Record Type è l’equivalente di un oggetto instanziato a partire una Classe in OOP. Per definire il Record devi creare degli attributi che ne definiranno il contenuto. Dato che l’applicazione che stai creando è simile ad un diario, è facile immaginare che i dati vengano immagazzinati in oggetti Nota, istanze dell’omonima classe:

Creare un Record Type

Una volta che hai una mezza idea dell’oggetto che vuoi salvare su iCloud è tempo di creare un Record che ne rappresenti le caratteristiche.

Dal menu SCHEMA, seleziona Record Types e premi il tasto + per aggiungere un nuovo Record:

Aggiungere nuovo record CloudKit iOS Swift

Rinomina il Record in “Nota”, cambia l’attributo creato in “titolo” e infine aggiungi un nuovo attributo di tipo String chiamato “testo”:

CloudKit aggiungere un nuovo record type

Per salvare il Record Type ricordati di premere Save.

Pensa ad un Record Type come alla definizione di una nuova classe. Quando la tua applicazione si collegherà ad iCloud, grazie al CloudKit, riuscirai a salvare ed a recuperare le tue note perché istanzierai degli oggetti di quello specifico Record Type. Di conseguenza, tutti gli oggetti di quel Record Type, saranno archiviati nella stessa e medesima categoria. Rendendo più semplice e facile il recupero e l’archiviazione delle informazioni.

private data e public data

Public Data e Private Data. Le politiche di sicurezza dei dati

Ora che hai un modello, per il salvataggio dei dati della tua applicazione su iCloud, è necessario domandarsi come questi dati vengano gestiti.

Se tutti gli utilizzatori della tua applicazione utilizzano lo stesso spazio iCloud, vuol dire che i miei dati possono essere letti anche da altri utenti?

No! esistono 2 aree dove vengono salvati i dati di ogni utente, la Public Data e la Private Data.

Nella Public Data vengono inseriti tutti i Record types che vogliono essere condivisi con tutti gli utilizzatori della tua applicazione. Se ad esempio l’applicazione utilizza dei dati che servono a tutti gli utenti, allora il record andrà inserito in questa sezione.

All’interno della Public Data sono presenti 2 sezioni:

  1. User Records: Se hai notato, nella sezione Record Types era presente un Record chiamato User. Esso rappresenta gli utilizzatori della tua applicazione e i vari dati che associ all’User vengono conservati qui.
  2. Default Zone: In questa sezione vengono salvati tutti i Record Types pubblici e diversi da quelli User.

La Private Data è la zone in cui salvare i record types privati.

Public Data e Private Data in CloudKit

L’immagina è della versione precedente del tutorial. Non ci sono differenze con i nuovi aggiornamenti di Xcode.

Un Record Types ricordati che è come una Classe quindi è un qualcosa di trascendentale. Le istanze del Record Type cioè gli oggetti che andrai a creare non hanno, di conseguenza, un posto di default in cui verranno salvati. Sarai tu, da codice, a smistarli nella relativa Zone d’appartenenza.

Nota Bene, lo sviluppatore dell’applicazione non ha accesso alla Default Zone privata di ogni utente della sua applicazione! Questo ti deve far ben capire come Apple ha a cuore la salvaguardia e la tutela dei dati personali.

Aggiungere un Record alla Default Zone Pubblica

Viste quali sono le politiche di smistamento dei dati e cosa sono i Record Types, è arrivato il momento di aggiungere un Record alla Default Zone pubblica.

Clicca su Default Zone, poi sul tasto + in alto, riempi il record aggiungendo testo e titolo. Ricordati di premere Save:

aggiungere un nuovo record da dashboard icloud

L’immagine è della versione precedente del tutorial. Non ci sono aggiornamenti e per tanto l’immagine è invariata (nella forma).

In questo modo hai creato un Record, simile ad un oggetto in OOP, che è accessibile da tutti gli utenti che utilizzano la tua applicazione.

Se sei un visitatore del mio blog forse hai letto, oppure già conosci, uno dei servizi concorrenti all’iCloud: Parse Online. Se già lo conosci avrai sicuramente notato come siano simili i metodi di rappresentazione dei dati.

Connettere un’applicazione ad iCloud con il CloudKit

Fatto l’excursus sulla DashBoard e sui Record Types, passiamo all’implementazione del codice! Ti ricordo che sto utilizzando un progetto di base che dovresti aver scaricato ad inizio tutorial (se non lo hai fatto ti invito a farlo e a seguire i paragrafi per l’implementazione del CloudKit in un progetto).

CKContainer e CKDatabase

Aggiungi un nuovo Swift File (File\New File…), chiamalo CloudController e all’interno crea una classe dall’omonimo nome:

Questa classe sarà delegata al trattamento della connessione con il server iCloud e con il Container dell’applicazione. In più, qui dentro, verranno aggiunti i metodi per il salvataggio ed il recupero dei dati.

Come prima cosa importa il CloudKit sotto l’import già presente:

All’interno della classe aggiungi i seguenti attributi:

All’inizio del tutorial, ti ho detto che creare una connessione con iCloud mediante il CloudKit faceva si che venisse realizzato uno spazio di memoria dedicato a tutti i dati dell’applicazione, il nome di questo spazio è Container. La variabile “container” sarà il riferimento al Container dell’applicazione.

All’interno Container sai che puoi salvare Record, oggetti di tipo Record Types, con due proprietà di sicurezza: pubblico e privato. Tutti i Record diversi da User vengono salvati nella rispettiva Default Zone privata/pubblica.

Un CKDatabase è lo spazio pubblico o privato del Container. Se il CKContainer rappresenta l’intera nuvola, il CKDatabase è il riferimento sia alla Default Zone privata che pubblica. Ecco che così, il metodo init istanzia il container, prende la rispettiva zona privata/pubblica e la assegna alle rispettive variabili. Sotto il precedente codice aggiungi:

CKRecord e CKQuery aggiungere e recuperare record

CKRecord e CKQuery. Aggiungere e recuperare record con CloudKit

Come qualsiasi database, per recuperare e aggiungere dati, bisogna fare delle richieste: “Ehi Database, non è che puoi aggiungere tizio X?”. Le richieste ad un Database vengono chiamate Query.

Nel tuo caso, la query che creerai chiederà al tuo container di aggiungere un Record (CKRecord) in un CKDatabase oppure recuperare dati, di una tipologia di Record type, utilizzando una CKQuery.

Vediamo come si fa!

Aggiungere un nuovo Record

All’interno della classe aggiungi il seguente metodo:

Il CKRecord è un oggetto di tipo Record Type, infatti dentro la sua inizializzazione vuole in nome del Record Type a cui riferirsi. Nel tuo caso è “Nota” (quello creato poc’anzi da dashboard).

Per accedere al contenuto o modificarlo, il CKRecord, ti mette a disposizione il metodo setValue(<valore>, forKey: <nomeChiave>).

Una volta modificati i value del record, viene salvato all’interno del Database con il saveRecord. Il saveRecord viene eseguito dal database in cui vuoi effettivamente salvare il record. Per rendere il record privato devi anche cambiare il database in cui permutare l’azione. In soldoni, se sbagli il database puoi causare grossi problemi di violazione di privacy.

In questo tutorial, dato che l’applicazione che stai creando è di prova, salverò tutti i dati nel public database.

Recuperare uno o più Record

Ti ricordi la classe Nota che ti ho mostrato poco fa? Hai un’ottima memoria :D

Aggiungi un nuovo File al progetto (File\New File…) e seleziona il linguaggio Swift (ti ricordo che tutti i miei tutorial sono scritti per supportare il linguaggio di programmazione Swift), chiamalo Nota e al suo interno inserisci il seguente codice:

Torna al CloudController.swift, e sopra la definizione della classe, crea un protocollo di delega (una Interfaccia per chi proviene da altri linguaggi di programmazione da utilizzare per implementare il protocollo Delegate) con 2 metodi all’interno che verranno richiamati dal ViewController (il motivo te lo spiegherò tra un po’):

Adesso all’interno della classe CloudController, aggiungi i seguenti attributi (mettilo sotto quelli del database):

Il metodo per il recupero dei dati dall’iCloud è il seguente:

Una CKQuery è la domanda che viene fatta al CKDatabase per recuperare una tipologia di contenuti o per meglio dire record. Dato che possono esistere, in un CKDatabase, migliaia di record puoi effettuare una query impostando dei filtri di ricerca chiamati NSPredicate. Nel seguente tutorial non ne faccio uso e per questo motivo ne ho creato uno che fa in modo di recuperare tutti i record (non va messo nil, nella CKQuery, bensì un NSPredicate come quello creato nel metodo).

Una CKQuery viene eseguita dal CKDatabase, dal quale vuoi recuperare i record, mediante il metodo performQuery. Il primo parametro del metodo è la query da eseguire mentre il secondo parametro, inZoneWithId, rappresenta l’ID della zona in cui performare la Query (oltre alla Default Zone ne puoi creare altre ma tale argomento non è trattato in questo tutorial).

La performQuery è una closure con 2 argomenti, results e error. Se l’esecuzione della query ritorna un errore… Aspetta! Nel codice c’è qualcosa di strano e che forse non ho mai visto: Il dispatch_async.

Te lo spiego brevemente perché richiederebbe un intero tutorial solo per questo argomento.

thread ed esempio delle poste

Quando vai allo sportello della posta, possono accadere 2 cose: 

  1. entri, non c’è nessuno e quindi sei il primo della fila.
  2. oppure c’è una fila spropositata e ti tocca aspettare.

Questo tipo di possibilità accade anche nella programmazione. Nel particolare, quando viene eseguita una Query su un Database non è sicuro che venga eseguita all’istante. Questa insicurezza fa si che venga creato un ritardo tra il passare del tempo tra l’effettiva chiamata della funzione e il reale tempo dedicato all’esecuzione della query.

Se gli oggetti da recuperare sono tantissimi, l’applicazione potrebbe bloccarsi perché ferma all’esecuzione della query. Un po’ come mettersi a dormire fin quando non aspetti che arrivi il tuo turno allo sportello della posta.

Per evitare che ciò accada i programmatori hanno inventato un sistema che permette di eseguire delle operazioni grandi divisi in piccoli pezzettini. In questo modo l’applicazione, mentre vengono eseguiti i pezzettini della Query, può continuare ad eseguire il resto del codice senza bloccarsi.

Dato che l’esecuzione dell’applicazione continua, cosa succede se devo mostrare il numero di record del Database se non ho ancora finito di eseguire la Query?

Semplicemente o non vengono mostrate oppure vengono mostrate solo quelle fin ora recuperate dalla query.

Per evitare di premere 300 volte il bottone “ricarica”, esiste un modo che ti permette di “aspettare” e attivarsi solo quando finisce l’effettiva operazione di ricerca: il dispatch_async (chi conosce ciò di cui sto parlando potrebbe storcere il naso ad un’associazione di questo tipo. Dato che sei un nuovo programmatore non posso che spiegarti concetti complicati in maniera quanto più semplice possibile).

All’interno dei due dispatch_async vengono invocati i metodi definiti dal protocol:

  1. errorUpdating: gestisce il messaggio d’errore e verrà usato per mostrare una AlertView contenente il messaggio d’errore.
  2. modelUpdate: verrà utilizzato per aggiornare gli elementi della TableView.

condividi xCoding

Sarei davvero felice se contribuissi al mio progetto semplicemente mettendo un mi piace o follow alle mie pagine

[addtoany]

Grazie davvero :-)

La modifica del ViewController, l’invio di un nuovo Record e la visualizzazione degli elementi in TableView

Se non sei morto lungo la strada, ti avviso che sei arrivato quasi alla fine!

Apri il ViewController.Swift e aggiungi il delegate appena creato alla definizione della classe:

Crea un oggetto CloudController per poter gestire la connessione, recupero e aggiunta dei dati dal server iCloud. Aggiungi il seguente attributo (sotto le varie IBOutlet):

Nel metodo viewDidLoad, rendi il delegate del cloudCtr la stessa ViewController. In questo modo farai si che i metodi invocati dalla funzione performQuery (errorUpdating e modelUpdate) vengano gestiti all’interno del ViewController:

Implementa il metodo errorUpdating:

Il metodo crea un AlertView e mostrare l’errore qualora venisse generato dal metodo performQuery (errore di connessione con iCloud ecc). Questo metodo viene chiamato nel CloudController quando non riesce a connettersi al database oppure ci sono dei problemi nel recuperare le informazioni.

Adesso tocca al metodo modelUpdate che richiamerà tutti i metodi per l’aggiornamento dei dati della TableView. Il modelUpdate viene richiamato quando la performQuery termina la sua esecuzione:

Poi aggiungi il seguente codice alla IBAction loadMessage_Clicked. Servirà a chiamare il metodo per il recupero delle informazioni dal Container:

I metodi per la gestione della TableView vengono modificati di conseguenza (do per scontato che sai utilizzare una TableView, in caso contrario visita questo tutorial: Creare una Table View con ricerca in Swift):

L’ultimo passaggio da fare è quello della modifica delle seconda IBAction per il salvataggio e il recupero dei dati:

Simulatore e CloudKit

Prima di avviare l’applicazione devi loggarti, con il tuo account iCloud, sul simulatore. Per farlo, avvia l’applicazione, poi premi il tasto CMD+H per tornare in Home e vai su Settings. Spostati nel menu iCloud ed esegui il login con i tuoi dati.

Adesso avvia l’applicazione. Poi premi sul tasto “Carica Note”. Dovresti vedere, nella tabella, l’elemento salvato nella public zone da dashboard:

Introduzione al CloudKit in iOS 8 e Swift test finale

Considerazioni e Download del progetto finale

In questa introduzione al CloudKit in iOS e Swift, ho voluto darti un assaggio della potenza e della semplicità di utilizzo del CloudKit. Una cosa che ancora non ti ho detto è che il CloudKit può essere benissimo sfruttato insieme alla potenza del Core Data!

Comunque, per non lasciarti con troppa confusione, faccio un riassunto veloce dei concetti fondamentali:

Il Container è l’intero spazio iCloud dedicato all’applicazione. I dati all’interno del container vengono salvati in 2 tipologie di databaseprivato e pubblico. Più precisamente ogni database ha una Default Zone dove vengono conservati i dati.

I diti di dato vengono chiamati Record Types ed è simile ad una classe nella programmazione ad oggetti. Quindi un record è l’istanza di un Record Types.

Dove proseguire da qui

Il mio consiglio è quello di salvare i dati su iCloud, recuperarli e poi spostarli in memoria del dispositivo grazie al Core Data. Così non appesantisci troppo l’applicazione con Query inutili, eviti la dipendenza costante da internet e dai la possibilità all’app di utilizzare i dati anche offline.

Se invece non ti piace il CloudKit, ti puoi affidare a servizi di terze parti come, il sempre più citato, Parse Online.

  1. Tutorial Core Data in Swift, salvare oggetti nel dispositivo
  2. Tutorial Core Data, creare e gestire relazioni tra Entity
  3. Connettere la propria app a Parse con Swift
  4. Creare una Table View con ricerca in Swift
  5. Tutorial Alert View e Action Sheets in iOS con Swift

Download del progetto

Se hai avuto problemi o difficoltà con il tuo progetto, sbloccando il seguente modulo, puoi scaricare quello fatto da me. Ricordati di impostare correttamente l’Identifier legato al tuo account da Apple Developer e di abilitare iCloud dalla sezione Capabilities.

[sociallocker][wpdm_package id=’2846′][/sociallocker]

Buona Programmazione!

Start typing and press Enter to search

Tutorial NSTimer in Swift, creare applicazione cronometroTutorial UIKit in Swift. Come animare la propria applicazione