{"id":626,"date":"2012-12-20T16:03:53","date_gmt":"2012-12-20T13:03:53","guid":{"rendered":"http:\/\/www.esanu.name\/vitalie\/?p=626"},"modified":"2012-12-20T16:03:53","modified_gmt":"2012-12-20T13:03:53","slug":"aplica%c8%9bia-iphone-pentru-privesc-eu-din-fuga","status":"publish","type":"post","link":"http:\/\/esanu.name\/vitalie\/?p=626","title":{"rendered":"Aplica\u021bia iPhone pentru Privesc.Eu din fug\u0103"},"content":{"rendered":"<figure id=\"attachment_627\" aria-describedby=\"caption-attachment-627\" style=\"width: 147px\" class=\"wp-caption alignleft\"><a href=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Privesc.Eu_.Small_.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Privesc.Eu_.Small_-157x300.png\" alt=\"Aplica\u021bia iPhone Privesc.Eu\" title=\"Privesc.Eu\" width=\"157\" height=\"300\" class=\"size-medium wp-image-627\" \/><\/a><figcaption id=\"caption-attachment-627\" class=\"wp-caption-text\">Aplica\u021bia iPhone Privesc.Eu<\/figcaption><\/figure>\n<p>Demult m\u0103 \u00eentrebau prietenii de ce nu o fac, o aplica\u021bie<a href=\"https:\/\/itunes.apple.com\/ro\/app\/privesc.eu\/id587512182?ls=1&#038;mt=8\"> Privesc.Eu<\/a> pentru iPhone. R\u0103spunsul e \u00een Google Analytics. Pentru c\u0103 sunt pu\u021bini oameni cu iPhone\/iPad! Re\u021beaua <a href=\"http:\/\/www.privesc.eu\">Privesc.eu<\/a> a g\u0103sit c\u0103 \u00een Moldova \u0219i Rom\u00e2nia sunt aproximatic <strong>130<\/strong> mii de astfel de oameni. \u00cens\u0103 tendin\u021ba e \u00een cre\u0219tere, s\u0103pt\u0103m\u00e2na trecut\u0103 am b\u0103tut recordul cu <strong>28<\/strong> mii de vizite de pe mobil.<\/p>\n<p><a href=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-2.14.51-PM.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-2.14.51-PM-300x60.png\" alt=\"\" title=\"Google Analytics\" width=\"300\" height=\"60\" class=\"alignleft size-medium wp-image-628\" \/><\/a><\/p>\n<p>Publicul nostru \u021bint\u0103 vine diminea\u021ba pe la 9:00 pe site, studiaz\u0103 agenda \u0219i se \u00eentorc c\u00e2nd \u00eencepe un eveniment interesant. Deci aplica\u021bia MVP (minimum viable product) trebuie s\u0103 rezolve problema publicului \u021bint\u0103. S\u0103 le aminteasc\u0103 c\u00e2nd se \u00eencepe un live. O aplica\u021bie c\u00e2t se poate de simpl\u0103, ador aplica\u021biile simple \u0219i utile.<\/p>\n<p>Ca s\u0103 nu pierd timpul din contul altor proiecte am f\u0103cut aplica\u021bia \u00een goan\u0103, \u00eentr-un weekend. Aplica\u021bia con\u021bine doar 3 forme: Lista evenimentelor, set\u0103rile \u0219i playerul video.<\/p>\n<p>Din lista evenimentelor v\u0103 pute\u021bi da seama ce eveniment a \u00eenceput, care e live sau \u00een arhiv\u0103. Dac\u0103 evenimentul nu a \u00eenceput, ap\u0103sa\u021bi pe el \u0219i ve\u021bi primi o notificare c\u00e2nd va \u00eencepe. Privesc.Eu e acela\u0219i pentru Rom\u00e2nia \u0219i Moldova, aplica\u021bia determin\u0103 din ce \u021bar\u0103 accesezi Internetul \u0219i \u00ee\u021bi arat\u0103 doar acele evenimente. Din set\u0103ri pute\u021bi schimba for\u021bat regiunile \u0219i v\u0103 pute\u021bi abona la notific\u0103ri dup\u0103 categori. Gata. Asta e tot.<\/p>\n<p>\u00ce\u021bi r\u0103m\u00e2ne s\u0103 <a href=\"https:\/\/itunes.apple.com\/ro\/app\/privesc.eu\/id587512182?ls=1&#038;mt=8\">tragi aplica\u021bia<\/a>, \u0219i s\u0103 a\u0219tep\u021bi c\u00e2nd va \u00eencepe un live.<\/p>\n<p>Pentru fanii iOS-ului, voi l\u0103muri cum a fost f\u0103cut\u0103.<\/p>\n<p>Dup\u0103 ce \u00ee\u021bi faci un cont <a href=\"http:\/\/developer.apple.com\/iphone\">apple pentru developer<\/a>. Moldoveni, trebuie s\u0103 trimit\u0103 un fax la Apple cu semnatura \u0219i num\u0103rul de cardului de credit.  Apoi setezi conturile bancare, tragi XCode de pe App Store. \u00ce\u021bi adaugi UDID-ul iPhone-ul pe portalul de la Apple. Pentru c\u0103 noi dorim s\u0103 trimitem notific\u0103ri, bundle ID trebuie s\u0103 fie exact, f\u0103r\u0103 *. Apoi faci certificatele pentru sandbox \u0219i production pentru notific\u0103ri \u0219i provision profiles pentru developer \u0219i distribu\u021bii ad-hoc \u0219i distribu\u021bii Apple. <\/p>\n<p><figure id=\"attachment_633\" aria-describedby=\"caption-attachment-633\" style=\"width: 290px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-2.15.56-PM.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-2.15.56-PM-300x139.png\" alt=\"Lista device-urilor asignate contului meu.\" title=\"Devices list\" width=\"300\" height=\"139\" class=\"size-medium wp-image-633\" \/><\/a><figcaption id=\"caption-attachment-633\" class=\"wp-caption-text\">Lista device-urilor asignate contului meu.<\/figcaption><\/figure><br \/>\n<br \/>\n<figure id=\"attachment_634\" aria-describedby=\"caption-attachment-634\" style=\"width: 290px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-2.16.44-PM.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-2.16.44-PM-300x67.png\" alt=\"Privesc.Eu Bundle ID\" title=\"Privesc.Eu Bundle ID\" width=\"300\" height=\"67\" class=\"size-medium wp-image-634\" \/><\/a><figcaption id=\"caption-attachment-634\" class=\"wp-caption-text\">Privesc.Eu Bundle ID<\/figcaption><\/figure><\/p>\n<p>Deschizi XCode \u0219i alegi un template pentru table view. Ni\u0219te mici modific\u0103ri, set\u0103m bundleID, iconi\u021bele, default screen-uri. \u0218i putem rula aplica\u021bia pe simulator sau device.<br \/>\n<figure id=\"attachment_635\" aria-describedby=\"caption-attachment-635\" style=\"width: 290px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-2.17.45-PM.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-2.17.45-PM-300x176.png\" alt=\"Setari \u00een XCode\" title=\"Setari \u00een XCode\" width=\"300\" height=\"176\" class=\"size-medium wp-image-635\" \/><\/a><figcaption id=\"caption-attachment-635\" class=\"wp-caption-text\">Setari \u00een XCode<\/figcaption><\/figure><\/p>\n<p>Cu libr\u0103ria <a href=\"http:\/\/allseeing-i.com\/ASIHTTPRequest\">ASIHTTP<\/a> d\u0103m un request la server care \u00eentoarce rezultatul \u00een JSON, iar cu frameworkul <a href=\"http:\/\/stig.github.com\/json-framework\/\">SBJSON<\/a> \u00eel proces\u0103m \u0219i \u00eel facem \u00een NSObiecte. \u00cel transmitem la UITablewView datasource \u0219i avem live-urile afi\u0219ate. Facem un custom la UICellView \u0219i b\u0103g\u0103m UIImageView inteligent, care singur \u00ee\u0219i trage imaginea din Internet \u00een background, f\u0103r\u0103 a fr\u00e2na scrolarea. Am luat din source code de la Facebook \u0219i am modificat \ud83d\ude09<\/p>\n<p>La pornirea aplica\u021biei cerem utilizatorului s\u0103 ne dea voie s\u0103-i trimitem notification<\/p>\n<p><code>    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:<br \/>\n     UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];<\/code><\/p>\n<p>Iar c\u00e2nd avem r\u0103spunsul \u00eel trimitem la serverul nostru. S\u0103 \u0219tie \u0219i serverul ce \u0219i cum, ce deviceToken cu ce regiuni \u0219i ce categorii s\u0103-l alerteze.<\/p>\n<p><code>- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken<br \/>\n{<br \/>\n    self.onlineController.deviceToken = deviceToken;<br \/>\n    [self.onlineController updateDeviceToken:self.onlineController.deviceToken];<br \/>\n}<\/code><\/p>\n<p>Trimisul notificarilor e destul de complicat, \u00eens\u0103 sunt b\u0103ie\u021bi harnici care rezolv\u0103 repejor. Hei, programerii sunt lene\u0219i \u0219i folosesc la maximum codul altora. <\/p>\n<p>Serverul e pe .NET framework \u00een c# sub <a href=\"http:\/\/www.azure.com\">Windows Azure<\/a>. Facem un Worker Role, cu un Thread care proceseaz\u0103 o coad\u0103 de mesaje. Folosim frameworkul <a href=\"https:\/\/github.com\/Redth\/PushSharp\">PushSharp<\/a> pentru a trimite notific\u0103ri la iPhone, Android sau Windows Phone.<\/p>\n<p><code>PushService push = new PushService();<br \/>\n            \/\/Wire up the events<br \/>\n            push.Events.OnDeviceSubscriptionExpired += new PushSharp.Common.ChannelEvents.DeviceSubscriptionExpired(Events_OnDeviceSubscriptionExpired);<br \/>\n            push.Events.OnChannelException += new PushSharp.Common.ChannelEvents.ChannelExceptionDelegate(Events_OnChannelException);<br \/>\n            push.Events.OnNotificationSendFailure += new PushSharp.Common.ChannelEvents.NotificationSendFailureDelegate(Events_OnNotificationSendFailure);<br \/>\n            push.Events.OnNotificationSent += new PushSharp.Common.ChannelEvents.NotificationSentDelegate(Events_OnNotificationSent);<br \/>\n            var appleCert = RoleEnvironment.IsEmulated ?<br \/>\n                Certificates.loadCertificateFromAppData(\"PrivescEu.Sandbox.p12\") :<br \/>\n                Certificates.loadCertificateFromBlob(\"PrivescEu.Production.p12\");<br \/>\n            push.StartApplePushService(new ApplePushChannelSettings(!RoleEnvironment.IsEmulated, appleCert, \"catpecesauitsascotparoladeaici\"), new PushServiceSettings()); <\/p>\n<p>....<br \/>\nun ciclu ve\u0219nic<\/p>\n<p>                            \/\/Fluent construction of an iOS notification<br \/>\n                            AppleNotification an = NotificationFactory.Apple()<br \/>\n                                .WithTag(pn) \/\/for feedback in events<br \/>\n                                .ForDeviceToken(pn.DeviceToken)<br \/>\n                                .WithAlert(pn.Title)<br \/>\n                                .WithSound(pn.Sound)<br \/>\n                                .WithBadge(pn.Bag)<br \/>\n                                .WithCustomItem(pn.PayLoadName, pn.PayLoadValue);<\/p>\n<p>                            push.QueueNotification(an);<\/code><\/p>\n<p>iar pe device-uri prindem aceste notificari.<\/p>\n<p><code>- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo<br \/>\n{<br \/>\n    if (!userInfo) return;<br \/>\n    [self processRemoteNotification:userInfo];<br \/>\n}<\/code><\/p>\n<p>Ne r\u0103m\u00e2ne s\u0103 afi\u0219\u0103m screen de live. E simplu, se face \u00een dou\u0103 r\u00e2nduri.<\/p>\n<p><code>MPMoviePlayerViewController *mpc = [[MPMoviePlayerViewController alloc] initWithContentURL:live.VideoStreamUrl];<br \/>\n            [self presentMoviePlayerViewControllerAnimated:mpc];<\/code><\/p>\n<p>Compil\u0103m, test\u0103m, d\u0103m la prieteni s\u0103-\u0219i spun\u0103 p\u0103rerile, nu-i ascut\u0103m \u0219i trimitem la iTunes App Store. A\u0219tept\u0103m o s\u0103pt\u0103m\u00e2n\u0103 pentru aprobare \u0219i facem buzzzzz p\u00e2n\u0103 ne ridic\u0103m pe primul loc.<\/p>\n<p><figure id=\"attachment_636\" aria-describedby=\"caption-attachment-636\" style=\"width: 290px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-11.47.10-AM.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.esanu.name\/vitalie\/wp-content\/uploads\/2012\/12\/Screen-Shot-2012-12-20-at-11.47.10-AM-300x109.png\" alt=\"Privesc.Eu primul \u00een topul aplica\u021biilor gratuite pe iPhone\" title=\"Privesc.Eu primul \u00een topul aplica\u021biilor gratuite pe iPhone\" width=\"300\" height=\"109\" class=\"size-medium wp-image-636\" \/><\/a><figcaption id=\"caption-attachment-636\" class=\"wp-caption-text\">Privesc.Eu primul \u00een topul aplica\u021biilor gratuite pe iPhone<\/figcaption><\/figure><br \/>\nPitch well and prosper!<br \/>\nVitalie E\u0219anu.\t\t<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Demult m\u0103 \u00eentrebau prietenii de ce nu o fac, o aplica\u021bie Privesc.Eu pentru iPhone. R\u0103spunsul e \u00een Google Analytics. Pentru c\u0103 sunt pu\u021bini oameni cu iPhone\/iPad! Re\u021beaua Privesc.eu a g\u0103sit c\u0103 \u00een Moldova \u0219i Rom\u00e2nia sunt aproximatic 130 mii de astfel de oameni. \u00cens\u0103 tendin\u021ba e \u00een cre\u0219tere, s\u0103pt\u0103m\u00e2na trecut\u0103 am b\u0103tut recordul cu 28 &#8230; <a title=\"Aplica\u021bia iPhone pentru Privesc.Eu din fug\u0103\" class=\"read-more\" href=\"http:\/\/esanu.name\/vitalie\/?p=626\" aria-label=\"More on Aplica\u021bia iPhone pentru Privesc.Eu din fug\u0103\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,4,20,25,35],"tags":[],"class_list":["post-626","post","type-post","status-publish","format-standard","hentry","category-net","category-apple","category-fun","category-internet","category-privesc-eu"],"_links":{"self":[{"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/posts\/626","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=626"}],"version-history":[{"count":0,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=\/wp\/v2\/posts\/626\/revisions"}],"wp:attachment":[{"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=626"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/esanu.name\/vitalie\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}