{"id":5969,"date":"2011-03-01T12:01:51","date_gmt":"2011-03-01T11:01:51","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=5969"},"modified":"2011-03-01T12:07:42","modified_gmt":"2011-03-01T11:07:42","slug":"t087-notifiche-in-stile-growl-per-le-nostre-applicazioni-iphone-e-ipad","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t087-notifiche-in-stile-growl-per-le-nostre-applicazioni-iphone-e-ipad\/","title":{"rendered":"T#087 &#8211; Notifiche in stile growl per le nostre applicazioni iPhone e iPad"},"content":{"rendered":"<p>Nei nostri programmi iPhone e iPad spesso utilizziamo le classi <em>UIAlertView<\/em> e <em>UIActionSheet<\/em> per mostrare all&#8217;utente messaggi, avvisi e notifiche sullo stato del programma. Queste due classi sono ottime quando vogliamo l&#8217;intervento dell&#8217;utente, per esempio per richiedere la conferma per la cancellazione di un dato o qualcosa del genere ma ci sono altri casi in cui vogliamo soltanto mostrargli un messaggio, e per questo mettiamo nell&#8217;alertView solo il pulsante &#8220;ok&#8221;. Ecco, in questi casi le alertView e gli actionSheet pussono risultare fastidiosi se i messaggi mostrati sono tanti.<br \/>\nQuesto problema mi si \u00e8 presentato in un progetto sviluppato per l&#8217;azienda dove lavoro e mentre mi chiedevo quale soluzione alternativa potessi utilizzare mi \u00e8 venuto in mente <a href=\"http:\/\/growl.info\/\" target=\"_blank\">growl<\/a>, il sistema di notifiche che ho installato sul mio mac.<\/p>\n<p>L&#8217;idea mi \u00e8 sembrata pulita ed elegante, delle piccole view semitrasparenti da mostrare in un angolo della pagina e poi far scomparire in automatico&#8230;ok, si pu\u00f2 fare.<\/p>\n<p>Il risultato finale che dovremmo ottenere \u00e8 questo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t087-devAPP-Notification.growl-like.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t087-devAPP-Notification.growl-like.jpg\" alt=\"t087-devAPP-Notification-growl-like\" title=\"t087-devAPP-Notification-growl-like\" width=\"595\" height=\"181\" class=\"aligncenter size-full wp-image-6003\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t087-devAPP-Notification.growl-like.jpg 893w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t087-devAPP-Notification.growl-like-300x91.jpg 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t087-devAPP-Notification.growl-like-150x45.jpg 150w\" sizes=\"auto, (max-width: 595px) 100vw, 595px\" \/><\/a><br \/>\n<\/center><!--more--><\/p>\n<p>se vi piace continuate la lettura di questo nostro articolo, se non vi piace continuate lo stesso \ud83d\ude1b e commentate.. \ud83d\ude42<\/p>\n<h4>Prepariamo il nostro progetto<\/h4>\n<p>Per realizzare questo oggetto partiamo dal creare un nuovo file all&#8217;interno del nostro progetto, il file dovr\u00e0 essere subClass di UIview e lo chiameremo &#8220;NotificationView&#8221; (.h e .m).<br \/>\nPer chi non sapesse come fare, vi ricordo che basta cliccare sul men\u00f9 &#8220;file->new file&#8221; e scegliere &#8220;Objective-C class&#8221; dalla sezione &#8220;Cocoa Touch Class&#8221; avendo cura, per\u00f2, che nella casella a discesa sia selezionato &#8220;subclass of UIView&#8221;.<\/p>\n<p>Questa classe dovr\u00e0 (al momento) avere almeno tre propriet\u00e0:<\/p>\n<ul>\n<li>un titolo,<\/li>\n<li>un messaggio<\/li>\n<li>e una piccola immagine da mostrare in alto a sinistra.<\/li>\n<\/ul>\n<p>Iniziamo quindi a dichiarare questi oggetti all&#8217;interno del file header. In questa occasione ho utilizzato il costrutto @property invece dei pi\u00f9 classici getter e setter, spero non vi dispiaccia!<br \/>\nVisto che vogliamo avere gli angoli arrotondati ci servir\u00e0 importare anche <em>quartz<\/em>, quindi aggiungiamo il framework <em>QuartzCore<\/em>. I nostri due file dovrebbero apparire in questo modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/file: NotoficationView.h\r\n#import <UIKit\/UIKit.h>\r\n@interface NotificationView : UIView {\r\n\tNSString\t*title;\r\n\tNSString\t*message;\r\n\tUIImage\t*icon;\r\n}\r\n\r\n@property (nonatomic, retain) NSString *title;\r\n@property (nonatomic, retain) NSString *message;\r\n@property (nonatomic, retain) UIImage  *icon;\r\n<\/pre>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/file:NotificationView.m\r\n#import \"NotificationView.h\"\r\n\r\n@implementation NotificationView\r\n@synthesize title, message,icon;\r\n\r\n- (void)dealloc {\r\n    title = nil;\r\n\tmessage = nil;\r\n\ticon = nil;\r\n\t[super dealloc];\r\n\t\r\n}\r\n<\/pre>\n<h4>Prepariamo il nostro nuovo oggetto personalizzato<\/h4>\n<p>Bene, iniziamo adesso ad occuparci di come dovremo istanziare questo oggetto nel nostro codice.. mica vorremmo ogni volta dover settare il titolo, il messaggio e l&#8217;icona in tre istruzioni diverse. Vogliamo un solo metodo che, anche se lungo 300 caratteri, ci permetta di fare tutto con una sola istruzione!<br \/>\nAggiungiamo quindi un inizializzatore personalizzato, io in un eccesso di fantasia l&#8217;ho chiamato:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (id)initWithTitleMessageImage:(NSString *)atitle message:(NSString *)amessage image:(UIImage *)animage\r\n<\/pre>\n<p>Per prima cosa all&#8217;interno di questo metodo dobbiamo richiamare un secondo costruttore, presente di default e sul quale non facciamo nessun override:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nself = [self initWithFrame:CGRectMake(768, 55  , 300, 80)];\r\n<\/pre>\n<p>La view ha dimensioni 300&#215;80, ma il suo angolo superiore sinistro ha coordinate (768,55) quindi attualmente \u00e8 fuori dallo schermo.<br \/>\nOttenuto il riferimento a &#8220;self&#8221; passiamo ad impostare le propriet\u00e0 che avevamo dichiarato:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nself.title = atitle;\r\nself.message = amessage;\r\nself.icon = animage;\t\t\r\n<\/pre>\n<p>Per le caratteristiche grafiche della notification ho preferito utilizzare dei #define nel file .h cos\u00ec che sia pi\u00f9 facile eventualmente modificare questi valori. Ho scritto quindi in testa al file NotificationView.h:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#define kDefaultRectColor [UIColor blackColor]\r\n#define kDefaultCornerRadius 10.0\r\n#define kDefaultAlphaValue\t0.7\r\n#define kDefaultBorderWidth 2.0\r\n<\/pre>\n<p>cos\u00ec all&#8217;interno del metodo <em>initWithTitleMessageImage<\/em> ho settato l&#8217;aspetto della view tramite:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nself.layer.cornerRadius = kDefaultCornerRadius;\r\nself.backgroundColor\t= kDefaultRectColor;\r\nself.alpha\t\t\t= kDefaultAlphaValue;\r\n[self.layer setBorderColor:[[UIColor whiteColor] CGColor]];\r\n[self.layer setBorderWidth:kDefaultBorderWidth];\r\n<\/pre>\n<p>Infine ho dichiarato le due label e l&#8217;oggetto <em>UIImageView<\/em> per mostrare le propriet\u00e0. Il metodo completo \u00e8 questo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (id)initWithTitleMessageImage:(NSString *)atitle message:(NSString *)amessage image:(UIImage *)animage{\r\n\tself = [self initWithFrame:CGRectMake(768, 55  , 300, 80)];\r\n\tif (self) {\r\n\t\tself.title = atitle;\r\n\t\tself.message = amessage;\r\n\t\tself.icon = animage;\r\n\t\t\r\n\t\tself.layer.cornerRadius = kDefaultCornerRadius;\r\n\t\tself.backgroundColor\t= kDefaultRectColor;\r\n\t\tself.alpha\t\t\t\t= kDefaultAlphaValue;\r\n\t\t[self.layer setBorderColor:[[UIColor whiteColor] CGColor]];\r\n\t\t[self.layer setBorderWidth:kDefaultBorderWidth];\r\n\t\t\r\n\t\t\/\/Allocazione e posionzamento della label per il titolo.\r\n\t\tUILabel *titleLabel;\r\n\t\ttitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 5, 250, 35)];\r\n\t\t[titleLabel setFont:[UIFont boldSystemFontOfSize:18]];\r\n\t\t[titleLabel setBackgroundColor:[UIColor clearColor]];\r\n\t\t[titleLabel setTextColor:[UIColor whiteColor]];\r\n\t\t[titleLabel setAdjustsFontSizeToFitWidth:TRUE];\r\n\t\t[titleLabel setText:title];\r\n\t\t[self addSubview:titleLabel];\r\n\t\t\r\n\t\t\r\n\t\t\/\/Allocazione e posionzamento della label per il messaggio.\r\n\t\tUILabel *messageLabel;\r\n\t\tmessageLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 30, 250, 40)];\r\n\t\t[messageLabel setFont:[UIFont systemFontOfSize:16]];\r\n\t\t[messageLabel setBackgroundColor:[UIColor clearColor]];\r\n\t\t[messageLabel setTextColor:[UIColor whiteColor]];\r\n\t\t[messageLabel setAdjustsFontSizeToFitWidth:TRUE];\r\n\t\t[messageLabel setText:message];\r\n\t\t[self addSubview:messageLabel];\r\n\t\t\r\n\t\t\/\/Allocazione e posizionamento della imageview.\r\n\t\tUIImageView *imageView;\r\n\t\timageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 32, 32)];\r\n\t\t[imageView setImage:icon];\r\n\t\t[self addSubview:imageView];\r\n\t\t[imageView release];\r\n\t}\r\n\treturn self;\r\n}\r\n<\/pre>\n<p>Perfetto, adesso non ci resta che occuparci dell&#8217;animazione.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/supporto-applicazioni\/le-applicazioni-dei-nostri-autori\/parole-vietate-di-ignazio-calo\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bannerIgnazioc.png\" alt=\"\" width=\"480\" height=\"100\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>Le animazioni di entrata e uscita delle nostre notifiche<\/h4>\n<p>Io ho previsto tre stili di animazione:<\/p>\n<ul>\n<li>lo slide da destra<\/li>\n<li>lo slide da sinistra<\/li>\n<li>il fading<\/li>\n<\/ul>\n<p>Il concetto alla base \u00e8 identico per tutti e tre gli stili, quindi commenter\u00f2 in questo articolo solo il primo, potete provare da voi a completare il resto e se proprio non riuscite (ma sforzatevi ^^) trovate tutto il codice nel progetto allegato.<\/p>\n<p>L&#8217;idea di base \u00e8 che abbiamo tre eventi successivi, l&#8217;apparizione della notifica, la sua scomparsa ed il tempo che rester\u00e0 ferma e visibile. Dichiariamo anche in questo caso tre #define nel file .h per la durata in secondi di questi eventi:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#define kDefaultShowAnimationDuration .7\r\n#define kDefaultShowTime 1\r\n#define kDefaultDismissAnimationDuration .7\r\n<\/pre>\n<p>Il metodo che si occupa di far apparire la view da destra \u00e8 il seguente:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)showFromRight {\r\n\tCGRect endREct;\r\n\tendREct = CGRectMake(768 - 300 + 10, 55, 300, 80);\r\n\t[UIView beginAnimations:nil context:nil];\r\n\t[UIView setAnimationDuration:kDefaultShowAnimationDuration];\r\n\t[UIView setAnimationDelegate:self];\r\n\t[UIView setAnimationDidStopSelector:@selector(endRightAnimation)];\r\n\tself.frame = endREct;\r\n\t[delegate notificationViewWillAppear:self];\r\n\t[UIView commitAnimations];\r\n}\r\n<\/pre>\n<p>In questo codice abbiamo dichiarato un rettangolo dove dovr\u00e0 apparire la notifica (768 &#8211; 300 + 10 serve per ricordarmi che la view non appare tutta, ma lascio 10 px fuori dallo schermo).<br \/>\nCon il metodo <em>setAnimationDidStopSelector<\/em> definiamo che alla fine dell&#8217;animazione verr\u00e0 invocato il metodo <em>endRightAnimation<\/em>.<\/p>\n<p>Il metodo <em>endRightAnimation<\/em> viene invocato quando la view \u00e8 appena arrivata in posizione, quindi dovremmo attendere un certo lasso di tempo e poi far ritornare la view fuori dallo schermo. Io ho ottenuto questo risultato cos\u00ec facendo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)endRightAnimation {\r\n\t[self performSelector:@selector(dismissFromRight) withObject:self afterDelay:kDefaultShowTime];\r\n}\r\n\r\n- (void)dismissFromRight {\r\n\tCGRect endREct;\r\n\tendREct = CGRectMake(768 , 55 , 300, 80);\r\n\t[UIView beginAnimations:nil context:nil];\r\n\t[UIView setAnimationDuration:kDefaultDismissAnimationDuration];\r\n\t[UIView setAnimationDelegate:self];\r\n\t[UIView setAnimationDidStopSelector:@selector(remove)];\r\n\tself.frame = endREct;\r\n\t[UIView commitAnimations];\r\n}\r\n<\/pre>\n<p>In pratica all&#8217;interno del metodo <em>endRightAnimation<\/em> non faccio altro che invocare il metodo <em>performSelector<\/em> dopo un delay di &#8220;kDefaultShowTime&#8221; secondi. In questo modo la view rester\u00e0 visibile per questo lasso di tempo. Allo scadere del tempo viene invocato il metodo <em>dismissFromRight<\/em> che si occupa di far tornare la view nella posizione originale (fuori dallo schermo).<br \/>\nPer maggiore pulizia ho fatto in modo che alla fine di questa animazione venga invocato il metodo <em>remove<\/em>:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)remove {\r\n\t[self removeFromSuperview];\r\n}\r\n<\/pre>\n<p><strong>NOTA:<\/strong> <em>Se avete avuto difficolt\u00e0  a seguire qualche passaggio consultate il file del progetto allegato.<\/em><\/p>\n<h4>Usiamo le notifiche in stile growl nelle nostre applicazioni iPhone e iPad<\/h4>\n<p>In qualunque parte della nostra applicazione, se vogliamo far apparire una notifica, non dovremo far altro che scrivere:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNotificationView *n;\r\n\tn = [[NotificationView alloc] initWithTitleMessageImage:@\"Mail\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tmessage:@\"You have new email\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t  image:[UIImage imageNamed:@\"AlertICON.png\"]];\r\n\t[n setDelegate:self];\r\n\t[self.view addSubview:n];\r\n\t\t[n showFromRight];\r\n<\/pre>\n<h4>Una chicca per i pi\u00f9 smaliziati<\/h4>\n<p>Come possiamo fare ad essere avvisati quando la notifica sta per apparire e quando invece viene dismessa?<br \/>\nIn pratica vorremmo ricreare quello che accade con le <em>UIAlertView<\/em>, in cui settando la nostra classe come suo delegate riusciamo ad intercettarne tutti gli eventi.<br \/>\nOk, inventiamoci il <em>NotificationViewDelegateProtocol<\/em> e definiamo che debba avere questi due metodi:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@protocol NotificationViewDelegateProtocol\r\n\r\n- (void)notificationViewDidDismiss:(NotificationView *)alertView;\r\n- (void)notificationViewWillAppear:(NotificationView *)alertView;\r\n\r\n@end\r\n<\/pre>\n<p>(Il mio <a href=\"http:\/\/www.devapp.it\/wordpress\/l014-un-contratto-tra-la-gli-oggetti-il-protocol.html\" target=\"_blank\">precedente articolo<\/a> parla proprio del costrutto @protocol leggetelo se avete difficolt\u00e0 e non capite di cosa stiamo parlando ;))<br \/>\nModifichiamo quindi la classe <em>NotificationView<\/em> aggiungendo tra le sue propriet\u00e0 anche un oggetto che implementi tale protocollo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@interface NotificationView : UIView {\r\n\tNSString\t*title;\r\n\tNSString\t*message;\r\n\tUIImage\t*icon;\r\n\tid  delegate;\r\n}\r\n<\/pre>\n<p>e modifichiamo i metodi <em>showFromRight<\/em> e <em>remove<\/em> aggiungendo l&#8217;invocazione di tali metodi del delegate:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)showFromRight {\r\n\tCGRect endREct;\r\n\tendREct = CGRectMake(768 - 300 + 10, 55, 300, 80);\r\n\t[UIView beginAnimations:nil context:nil];\r\n\t[UIView setAnimationDuration:kDefaultShowAnimationDuration];\r\n\t[UIView setAnimationDelegate:self];\r\n\t[UIView setAnimationDidStopSelector:@selector(endRightAnimation)];\r\n\tself.frame = endREct;\r\n\t[delegate notificationViewWillAppear:self];\r\n\t[UIView commitAnimations];\r\n}\r\n- (void)remove {\r\n\t[self removeFromSuperview];\r\n\t[delegate notificationViewDidDismiss:self];\r\n}\r\n<\/pre>\n<p>In questo modo la classe che vorr\u00e0 fare da delegate alle nostre <em>NotificationView<\/em> potr\u00e0 dichiararlo nel file di implementazione tramite:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n<NotificationViewDelegateProtocol>;\r\n<\/pre>\n<p>ed utilizzare i due metodi per intercettare gli eventi della NotificationView:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#pragma mark -\r\n#pragma mark NotificationViewDelegateProtocol Methods\r\n\r\n-(void)notificationViewWillAppear:(NotificationView *)notificationView {\r\n\tNSLog(@\"La notificationView dal titolo: \\\"%@\\\" sta per apparire\",[notificationView title]);\r\n}\r\n\r\n-(void)notificationViewDidDismiss:(NotificationView *)notificationView {\r\n\tNSLog(@\"La notification dal titolo: \\\"%@\\\" \u00e8 stata dismessa\",[notificationView title]);\r\n\r\n}\r\n<\/pre>\n<h4>Problemi noti<\/h4>\n<p>Il codice che ho scritto \u00e8 sicuramente migliorabile.<br \/>\nDue modifiche sono sicuramente pi\u00f9 urgenti di altre (se volete collaborare possiamo organizzarci e mettere su goolecode o altre piattaforme). La prima riguarda la lunghezza del messaggio, che in questo caso \u00e8 molto limitata perch\u00e8 la view non si ridimensiona automaticamente (non l&#8217;abbiamo previsto :P). La seconda, riguarda invece l&#8217;apparizione di pi\u00f9 view contemporaneamente: se provate a farne apparire pi\u00f9 di una, infatti, noterete un effetto fastidioso e sicuramente non voluto: le notifiche vengono sovrapposte, quindi il risultato non \u00e8 ottimale.<\/p>\n<p>Quindi.. sviluppatori di tutto il mondo.. unitevi.. e miglioriamo insieme questo progetto \ud83d\ude00<\/p>\n<p>Alla prossima!<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t087-devAPP-Notification.growl-like.zip\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"Icona Download\" title=\"download_icon\" width=\"33\" height=\"40\" class=\"alignnone size-full wp-image-3385\" \/><\/a> Se avete problemi con il tutorial, questo \u00e8 il <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/t087-devAPP-Notification.growl-like.zip\" target=\"_blank\">nostro file di progetto<\/a>.<br \/>\n<\/center><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/supporto-applicazioni\/le-applicazioni-dei-nostri-autori\/parole-vietate-di-ignazio-calo\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bannerIgnazioc.png\" alt=\"\" width=\"480\" height=\"100\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nei nostri programmi iPhone e iPad spesso utilizziamo le classi UIAlertView e UIActionSheet per mostrare all&#8217;utente messaggi,&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[241,583,582,581,580],"class_list":["post-5969","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-ignazio-calo","tag-notificationview-iphone","tag-notifiche-growl-iphone","tag-notifiche-ipad","tag-notifiche-iphone"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5969","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=5969"}],"version-history":[{"count":17,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5969\/revisions"}],"predecessor-version":[{"id":6009,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/5969\/revisions\/6009"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=5969"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=5969"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=5969"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}