{"id":7558,"date":"2020-06-26T14:01:36","date_gmt":"2020-06-26T12:01:36","guid":{"rendered":"https:\/\/www.iprog.it\/blog\/?p=7558"},"modified":"2020-06-26T14:01:36","modified_gmt":"2020-06-26T12:01:36","slug":"ios14-widgets-con-widgetkit","status":"publish","type":"post","link":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/","title":{"rendered":"iOS14 Widgets con WidgetKit"},"content":{"rendered":"<p><span class=\"tlid-translation translation\" lang=\"it\"><span class=\"\" title=\"\">Al keynote di WWDC20, Apple ha annunciato iOS 14 con nuove straordinarie funzionalit\u00e0, tra le tante troviamo i Widget nella schermata principale.<\/span><\/span><\/p>\n<p><span title=\"\">Oggi scopriremo come aggiungere widget alla tua app!<\/span><\/p>\n<p><span title=\"\">Innanzitutto, dovrai scaricare alcuni software beta.<\/span> <span title=\"\">Tieni presente che si tratta di beta sviluppatore e avrai bisogno di un account sviluppatore Apple<\/span>.<\/p>\n<p><strong><span title=\"\">ASSICURARSI DI AVERE UN BACKUP DEI DATI PRIMA DI INSTALLARE QUALSIASI SOFTWARE BETA<\/span><\/strong><\/p>\n<p><span title=\"\">Tutto ci\u00f2 che serve \u00e8 <\/span><span title=\"\">Xcode 12<\/span>, oppure se vuoi anche la nuova UI di xcode and <span title=\"\">macOS Big Sur<\/span>.<\/p>\n<h3><span class=\"tlid-translation translation\" lang=\"it\"><span class=\"\" title=\"\">Configura il tuo progetto<\/span><\/span><\/h3>\n<p><span class=\"tlid-translation translation\" lang=\"it\"><span title=\"\">Puoi usare un progetto Xcode esistente o crearne uno nuovo.<\/span> <span title=\"\">Tutto ci\u00f2 che ti serve ora \u00e8 andare su File -&gt; New -&gt; Target<\/span><\/span><\/p>\n<p><span title=\"\">Quindi selezionare Widget Extension da l\u00ec<\/span><\/p>\n<p><a href=\"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/1-i8IT_KHzy_UGlp-jYoruQw.png\" rel=\"lightbox[7558]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-7559\" src=\"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/1-i8IT_KHzy_UGlp-jYoruQw-620x437.png\" alt=\"widget extension\" width=\"620\" height=\"437\" srcset=\"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/1-i8IT_KHzy_UGlp-jYoruQw-620x437.png 620w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/1-i8IT_KHzy_UGlp-jYoruQw-300x212.png 300w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/1-i8IT_KHzy_UGlp-jYoruQw-768x541.png 768w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/1-i8IT_KHzy_UGlp-jYoruQw-940x663.png 940w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/1-i8IT_KHzy_UGlp-jYoruQw-624x440.png 624w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/1-i8IT_KHzy_UGlp-jYoruQw.png 1400w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<div class=\"text-wrap tlid-copy-target\">\n<div class=\"result-shield-container tlid-copy-target\" tabindex=\"0\">\n<p><span class=\"tlid-translation translation\" lang=\"it\"><span class=\"\" title=\"\">E ora dai un nome alla tua estensione Widget (nel nostro caso <span title=\"\">MyWidget<\/span>) e assicurati che <strong class=\"gl hc\">Include Configuration Intent<\/strong> sia selezionato.<\/span><\/span><\/p>\n<p><span title=\"\">Ti verr\u00e0 quindi chiesto di attivare un nuovo schema.<\/span> <span title=\"\">Seleziona Attiva.<\/span><\/p>\n<p><span title=\"\">Ora vedrai una nuova cartella nel tuo progetto con il nome del tuo widget.<\/span><\/p>\n<p><span title=\"\">Apri MyWidget.swift ed elimina tutto al suo interno tranne le istruzioni di <strong>import<\/strong>.<\/span><\/p>\n<\/div>\n<\/div>\n<div tabindex=\"0\"><\/div>\n<div tabindex=\"0\"><\/div>\n<div class=\"tlid-result-transliteration-container result-transliteration-container transliteration-container\">\n<div class=\"tlid-transliteration-content transliteration-content full\">\n<div class=\"text-wrap tlid-copy-target\">\n<h3 class=\"result-shield-container tlid-copy-target\" tabindex=\"0\"><span class=\"tlid-translation translation\" lang=\"it\"><span class=\"\" title=\"\">Creare un widget<\/span><\/span><\/h3>\n<p class=\"result-shield-container tlid-copy-target\" tabindex=\"0\"><span class=\"tlid-translation translation\" lang=\"it\"><span class=\"\" title=\"\">Ora siamo pronti per iniziare a creare il nostro widget!<\/span> <span class=\"\" title=\"\">Crea una struct chiamata MyWidget conforme al protocollo Widget e aggiungi il wrapper di propriet\u00e0 @main <\/span><span title=\"\">come in SwiftUI, Xcode dovrebbe darti il completamento automatico.<\/span><\/span><\/p>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\n@main<br \/>\nstruct MyWidget: Widget {<br \/>\n    public var body: some WidgetConfiguration {<\/p>\n<p>    }<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>In questo tutorial vedremo solo i widget statici che possono mostrare solo contenuti specifici, come il widget fitness:<\/p>\n<p><a href=\"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1.jpg\" rel=\"lightbox[7558]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-7561\" src=\"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1-620x447.jpg\" alt=\"widget fitness\" width=\"620\" height=\"447\" srcset=\"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1-620x447.jpg 620w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1-300x216.jpg 300w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1-768x554.jpg 768w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1-940x678.jpg 940w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1-624x450.jpg 624w, https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1.jpg 1190w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<p>Esiste anche un altro tipo di widget che utilizzano le interazioni dell&#8217;utente nell&#8217;app per fornire dati pi\u00f9 personalizzati, chiamati widget Intent. Non li toccheremo in questo tutorial.<\/p>\n<p>Per creare un widget statico dobbiamo specificare la configurazione del widget nel corpo di MyWidget. Questo \u00e8 ci\u00f2 di cui avremo bisogno per creare una configurazione statica:<\/p>\n<ul>\n<li><strong>kind<\/strong> \u00e8 una stringa personalizzata che identificher\u00e0 il tuo widget. Es .: &#8220;com.example.mywidget&#8221;<\/li>\n<li><strong>provider<\/strong> \u00e8 un oggetto che determiner\u00e0 quando aggiornare il tuo widget, quindi \u00e8 sempre aggiornato.<\/li>\n<li><strong>placeholder<\/strong> \u00e8 una vista che mostra una rappresentazione generica del widget. WidgetKit mostra questa vista sulla schermata di blocco e prima di eseguire il rendering del contenuto del widget.<\/li>\n<li><strong>content<\/strong> \u00e8 una vista che render\u00e0 il widget. In questo tutorial useremo SwiftUI per il rendering del widget.<\/li>\n<\/ul>\n<p>Nota: TimelineProvider e TimelineEntry sono protocolli, quindi \u00e8 necessario creare oggetti conformi a questi.<\/p>\n<h3>Widget Entry<\/h3>\n<p>Inizialmente creeremo un oggetto WidgetEntry conforme a TimelineEntry. TimelineEntry richiede che i tipi conformi abbiano la variabile data.<\/p>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\nstruct WidgetEntry: TimelineEntry {<br \/>\n    var date: Date<br \/>\n    var value: Double<br \/>\n}<br \/>\n[\/code]<\/p>\n<h3>Widget Provider<\/h3>\n<p>Quindi creeremo una struct provider conforme a TimelineProvider. TimelineProvider \u00e8 anche esso un protocollo, quindi dobbiamo conformare il nostro Provider a un paio di metodi e anche creare un typealias.<\/p>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\nstruct Provider: TimelineProvider {<br \/>\n    typealias Entry = WidgetEntry<\/p>\n<p>    func snapshot(with context: Context, completion: @escaping (WidgetEntry) -&gt;; ()) {<br \/>\n}<br \/>\n    func timeline(with context: Context, completion: @escaping (Timeline&amp;lt;WidgetEntry&amp;gt;) -&amp;gt; ()) {<br \/>\n}<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>Ora dobbiamo inserire un po&#8217; di codice nella funzione <em>snapshot<\/em> e <em>timeline<\/em>.<\/p>\n<h3 id=\"0686\" class=\"hl hm cd cc hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ap\">Snapshot<\/h3>\n<p>Il metodo Snapshot mostra lo stato corrente del widget. Ad esempio, se effettuiamo una richiesta di rete e riceviamo dati da essa che sarebbe un&#8217;istantanea.<\/p>\n<p>Dobbiamo fare in modo che la voce del widget presenti un esempio di dati quando \u00e8 in modalit\u00e0 anteprima, quindi dobbiamo verificare se il contesto corrente \u00e8 in anteprima. Dopo aver creato una voce, dobbiamo passare questa voce al completamento. (WidgetData \u00e8 una struttura contenente propriet\u00e0 statiche come currentValue)<\/p>\n<\/div>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\nfunc snapshot(with context: Context, completion: @escaping (Entry) -&gt; ()) {<br \/>\n    let date = Date()<br \/>\n    let entry: WidgetEntry<br \/>\n    if context.isPreview {<br \/>\n        entry = WidgetEntry(date: date, value: 0.75)<br \/>\n    } else {<br \/>\n        entry = WidgetEntry(date: date, value: WidgetData.currentValue)<br \/>\n    }<br \/>\n    completion(entry)<br \/>\n}<br \/>\n[\/code]<\/p>\n<pre class=\"fq fr fs ft fu iz ja jb\"><\/pre>\n<div class=\"text-wrap tlid-copy-target\">\n<p>&nbsp;<\/p>\n<h3 id=\"c9d9\" class=\"hl hm cd cc hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ap\">Timeline<\/h3>\n<p>Il metodo della sequenza timeline \u00e8 responsabile della presentazione di dati aggiornati. Ai fini di questo tutorial creeremo una voce che invier\u00e0 la data corrente alla sequenza temporale.<\/p>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\nfunc timeline(with context: Context, completion: @escaping (Timeline&amp;lt;Entry&amp;gt;) -&amp;gt; ()) {<br \/>\n    let timeline = Timeline(entries: [entry], policy: .atEnd)<br \/>\n    completion(timeline)<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>&#8220;Che cosa significa la policy .atEnd?&#8221;<\/p>\n<p>TimelineReloadPolicy descrive quando dovremmo aggiornare il nostro widget. .atEnd significa che verr\u00e0 aggiornato quando passer\u00e0 la data delle voci precedenti. Inoltre, non si verifica mai un caso in cui il widget si aggiorna solo quando viene presentato il widget, quindi quando l&#8217;utente sblocca il proprio telefono o scorre attraverso la schermata principale.<\/p>\n<h3>Configurazione<\/h3>\n<p>Dopo aver fatto tutto ci\u00f2, ora puoi procedere per completare la configurazione statica.<\/p>\n<p>Ogni volta che viene passata una nuova voce nella sequenza temporale, verr\u00e0 chiamata la voce del blocco.<\/p>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\n@main<br \/>\nstruct MyWidget: Widget {<br \/>\n    public var body: some WidgetConfiguration {<br \/>\n        StaticConfiguration(<br \/>\n            kind: &quot;com.example.mywidget&quot;,<br \/>\n            provider: Provider(),<br \/>\n            placeholder: Text(&quot;Placeholder Text&quot;)) { entry in<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>Questo \u00e8 ci\u00f2 che dovresti trovare nel corpo di Widget.<\/p>\n<h3>Creare una view<\/h3>\n<p>Ora non resta che creare una view SwiftUI che presenter\u00e0 i dati. Questa \u00e8 una view semplice che ho creato. Ha una propriet\u00e0 entry che ti permette di cambiare lo stato del widget che dipende dai sui suoi dati.<\/p>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\nstruct WidgetView: View {<br \/>\n    var entry: WidgetEntry<br \/>\n var body: some View {<br \/>\n        ZStack {<br \/>\n            Rectangle()<br \/>\n                .foregroundColor(.black)<br \/>\n            Text(&quot;Il valore corrente \u00e8 \\(entry.value)%&quot;)<br \/>\n                .foregroundColor(.red)<br \/>\n                .font(.largeTitle)<br \/>\n                .multilineTextAlignment(.center)<br \/>\n                .padding()<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n[\/code]<\/p>\n<h3>Passare una view al widget<\/h3>\n<p>Crea un&#8217;istanza della tua vista nel blocco nella nostra configurazione statica.<\/p>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\n@main<br \/>\nstruct MyWidget: Widget {<br \/>\n    public var body: some WidgetConfiguration {<br \/>\n        StaticConfiguration(<br \/>\n            kind: &quot;com.example.mywidget&quot;,<br \/>\n            provider: Provider(),<br \/>\n            placeholder: Text(&quot;Placeholder Text&quot;)) { entry in<br \/>\n            WidgetView(entry: entry)<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>Finalmente siamo pronti per mostrare il nostro Widget al mondo!<\/p>\n<h3>Preview<\/h3>\n<p>In SwiftUI puoi facilmente vedere l&#8217;anteprima del widget usando WidgetPreviewContext<\/p>\n<p>Nel codice seguente presenteremo 3 viste di diverse dimensioni sul canvas.<\/p>\n<p>[code lang=&#8221;swift&#8221;]<br \/>\nstruct MyWidget_Previews: PreviewProvider {<br \/>\n    static var previews: some View {<br \/>\n        Group {<br \/>\n            WidgetView(entry: WidgetEntry(date: Date(), value: 75))<br \/>\n                .previewContext(WidgetPreviewContext(family: .systemSmall))<br \/>\n            WidgetView(entry: WidgetEntry(date: Date(), value: 75))<br \/>\n                .previewContext(WidgetPreviewContext(family: .systemMedium))<br \/>\n            WidgetView(entry: WidgetEntry(date: Date(), value: 75))<br \/>\n                .previewContext(WidgetPreviewContext(family: .systemLarge))<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n[\/code]<\/p>\n<p>Abbiamo fatto quindi una panoramica sui Widget statici di iOS14. Tra pochi giorni arriver\u00e0 anche il progetto di esempio da scaricare (la prima beta di Mac OS Big Sur ha ancora qualche problema)<\/p>\n<p>Ora tocca a te!<\/p>\n<p>Menziona sui social iProg, e condividi i tuoi widgets!<\/p>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Al keynote di WWDC20, Apple ha annunciato iOS 14 con nuove straordinarie funzionalit\u00e0, tra le tante troviamo i Widget nella schermata principale. Oggi scopriremo come aggiungere widget alla tua app! Innanzitutto, dovrai scaricare alcuni software beta. Tieni presente che si tratta di beta sviluppatore e avrai bisogno di un account&#8230; <a href=\"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/\">Read more &raquo;<\/a><\/p>\n","protected":false},"author":5,"featured_media":7561,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2234],"tags":[583,28,2521,2522,2384,38,1196],"class_list":["post-7558","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-swift","tag-apple","tag-ios","tag-ios14","tag-macos","tag-swift","tag-tutorial","tag-widget"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>iOS14 Widgets con WidgetKit - iProg<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"iOS14 Widgets con WidgetKit - iProg\" \/>\n<meta name=\"twitter:description\" content=\"Al keynote di WWDC20, Apple ha annunciato iOS 14 con nuove straordinarie funzionalit\u00e0, tra le tante troviamo i Widget nella schermata principale. Oggi scopriremo come aggiungere widget alla tua app! Innanzitutto, dovrai scaricare alcuni software beta. Tieni presente che si tratta di beta sviluppatore e avrai bisogno di un account... Read more &raquo;\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@iprogblog\" \/>\n<meta name=\"twitter:site\" content=\"@iprogblog\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fabio\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/\"},\"author\":{\"name\":\"Fabio\",\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/#\\\/schema\\\/person\\\/5f7d1474b2b5e8fe635f84906efc8c51\"},\"headline\":\"iOS14 Widgets con WidgetKit\",\"datePublished\":\"2020-06-26T12:01:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/\"},\"wordCount\":1045,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/ios1.jpg\",\"keywords\":[\"Apple\",\"ios\",\"ios14\",\"macos\",\"Swift\",\"tutorial\",\"widget\"],\"articleSection\":[\"Swift\"],\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/\",\"url\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/\",\"name\":\"iOS14 Widgets con WidgetKit - iProg\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/ios1.jpg\",\"datePublished\":\"2020-06-26T12:01:36+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/#\\\/schema\\\/person\\\/5f7d1474b2b5e8fe635f84906efc8c51\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/swift\\\/ios14-widgets-con-widgetkit\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/ios1.jpg\",\"contentUrl\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/wp-content\\\/uploads\\\/2020\\\/06\\\/ios1.jpg\",\"width\":1190,\"height\":858,\"caption\":\"widget fitness\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/\",\"name\":\"iProg\",\"description\":\"perch\u00e9 reinventare la ruota?\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/#\\\/schema\\\/person\\\/5f7d1474b2b5e8fe635f84906efc8c51\",\"name\":\"Fabio\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/03f928dca7330002301d292e5dc1b2fca35722d24a0628eaf129fd52acfc0a99?s=96&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/03f928dca7330002301d292e5dc1b2fca35722d24a0628eaf129fd52acfc0a99?s=96&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/03f928dca7330002301d292e5dc1b2fca35722d24a0628eaf129fd52acfc0a99?s=96&r=g\",\"caption\":\"Fabio\"},\"description\":\"Esperienza nella progettazione e sviluppo di Applicazioni mobili. Integro le conoscenze acquisite in ambito accademico con un continuo studio di nuove tecnologie che mi permettano di creare applicazioni sempre pi\u00f9 affidabili sicure ed efficienti. Venite a trovarmi sul blog Fabiosoft Google+\",\"sameAs\":[\"http:\\\/\\\/www.fabiosoft.com\",\"https:\\\/\\\/www.facebook.com\\\/devfabionisci\\\/\",\"http:\\\/\\\/it.linkedin.com\\\/in\\\/fabionisci\"],\"url\":\"https:\\\/\\\/www.iprog.it\\\/blog\\\/author\\\/fabiosoft\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"iOS14 Widgets con WidgetKit - iProg","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/","twitter_card":"summary_large_image","twitter_title":"iOS14 Widgets con WidgetKit - iProg","twitter_description":"Al keynote di WWDC20, Apple ha annunciato iOS 14 con nuove straordinarie funzionalit\u00e0, tra le tante troviamo i Widget nella schermata principale. Oggi scopriremo come aggiungere widget alla tua app! Innanzitutto, dovrai scaricare alcuni software beta. Tieni presente che si tratta di beta sviluppatore e avrai bisogno di un account... Read more &raquo;","twitter_image":"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1.jpg","twitter_creator":"@iprogblog","twitter_site":"@iprogblog","twitter_misc":{"Scritto da":"Fabio","Tempo di lettura stimato":"5 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/#article","isPartOf":{"@id":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/"},"author":{"name":"Fabio","@id":"https:\/\/www.iprog.it\/blog\/#\/schema\/person\/5f7d1474b2b5e8fe635f84906efc8c51"},"headline":"iOS14 Widgets con WidgetKit","datePublished":"2020-06-26T12:01:36+00:00","mainEntityOfPage":{"@id":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/"},"wordCount":1045,"commentCount":0,"image":{"@id":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/#primaryimage"},"thumbnailUrl":"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1.jpg","keywords":["Apple","ios","ios14","macos","Swift","tutorial","widget"],"articleSection":["Swift"],"inLanguage":"it-IT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/","url":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/","name":"iOS14 Widgets con WidgetKit - iProg","isPartOf":{"@id":"https:\/\/www.iprog.it\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/#primaryimage"},"image":{"@id":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/#primaryimage"},"thumbnailUrl":"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1.jpg","datePublished":"2020-06-26T12:01:36+00:00","author":{"@id":"https:\/\/www.iprog.it\/blog\/#\/schema\/person\/5f7d1474b2b5e8fe635f84906efc8c51"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.iprog.it\/blog\/swift\/ios14-widgets-con-widgetkit\/#primaryimage","url":"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1.jpg","contentUrl":"https:\/\/www.iprog.it\/blog\/wp-content\/uploads\/2020\/06\/ios1.jpg","width":1190,"height":858,"caption":"widget fitness"},{"@type":"WebSite","@id":"https:\/\/www.iprog.it\/blog\/#website","url":"https:\/\/www.iprog.it\/blog\/","name":"iProg","description":"perch\u00e9 reinventare la ruota?","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.iprog.it\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/www.iprog.it\/blog\/#\/schema\/person\/5f7d1474b2b5e8fe635f84906efc8c51","name":"Fabio","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/03f928dca7330002301d292e5dc1b2fca35722d24a0628eaf129fd52acfc0a99?s=96&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/03f928dca7330002301d292e5dc1b2fca35722d24a0628eaf129fd52acfc0a99?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/03f928dca7330002301d292e5dc1b2fca35722d24a0628eaf129fd52acfc0a99?s=96&r=g","caption":"Fabio"},"description":"Esperienza nella progettazione e sviluppo di Applicazioni mobili. Integro le conoscenze acquisite in ambito accademico con un continuo studio di nuove tecnologie che mi permettano di creare applicazioni sempre pi\u00f9 affidabili sicure ed efficienti. Venite a trovarmi sul blog Fabiosoft Google+","sameAs":["http:\/\/www.fabiosoft.com","https:\/\/www.facebook.com\/devfabionisci\/","http:\/\/it.linkedin.com\/in\/fabionisci"],"url":"https:\/\/www.iprog.it\/blog\/author\/fabiosoft\/"}]}},"views":2047,"_links":{"self":[{"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/posts\/7558","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/comments?post=7558"}],"version-history":[{"count":3,"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/posts\/7558\/revisions"}],"predecessor-version":[{"id":7564,"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/posts\/7558\/revisions\/7564"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/media\/7561"}],"wp:attachment":[{"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/media?parent=7558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/categories?post=7558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.iprog.it\/blog\/wp-json\/wp\/v2\/tags?post=7558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}