Apple

Pagina principală - privesc.eu

Pagina principală - privesc.eu

Site-ul Privesc.Eu a început simplu de tot. Un site pe wordpress și embeduri video de pe ustream.tv. Timp de 10 ani, rezolvând problemele una câte una, am construit un sistem scalabil și destul de complex. Anume rezolvarea acestor probleme grele m-au motivat să construiesc acest sistem. Dacă era simplu, cred că cedam.

Privesc.Eu de unii este considerat mass-media, de alții startup tehnologic. Noi credem că suntem undeva pe la mijloc. În situații excepționale, cum ar fi alegeri naționale sau revolte, acest sistem are cel mai mare trafic din țară. Maximum atins este peste 30 mii oameni live. În acele zile, mare majoritatea a televiziunilor preiau imaginile video de la noi.

Articolul este dedicat celor care vor să construiască un startup. Să aibă o impresie despre tehnologiile care trebuie să le învețe și să le mânuiască pentru a construi o companie. Din experiența mea - 90% din timp este dedicat anume citirii documentației și integrării acestor servicii și doar 10% - programării.

Aici nu voi vorbi despre oamenii care zi de zi întrețin acest sistem sau care transmit live-uri. Munca lor e enormă - peste 36 mii de ore de transmisiuni live.

În continuare, pentru curioși, un longread tehnologic.

BROWSER. Când un om deschide www.privesc.eu, să vadă un live, în spate stau o mulțime de servere legate între ele prin microservicii. Unele servicii sunt construite de mine altele sunt cumpărate și plătite lunar. Unele servere stau în cloud, altele împrăștiate prin Europa. Fiecare decizie are un tradeoff, cost/performană. Dacă le greșești, compania poate chiar da faliment.

WEB. Site-ul www.privesc.eu este hostat pe Microsoft Azure (prefer această platformă, față de AWS sau Google Cloud, le folosesc și pe celalte dar la alte proiecte) este construit pe framework-ul ASP.NET MVC. Pingdom, de câți va ani, îmi arată uptime 100%. Aceasta este primul indiciu de calitate a unui site. Să nu cadă! Site-ul rulează pe minimum 2 web servere și se autoscalează până la 100 de servere în dependență de volumul de oameni care privesc. Limita de minimum 2 servere am impus-o din cauza că avem widgetul privesc.eu care este embedat pe mii de site-uri. Dacă vom pica se va vedea pe tot Internetul 😀

DB. Serverele web au în spate o bază de date SQL Server. Acolo se păstrează toate informația despre live-uri, titluri, operatori, camere, servere, utilizatori, autorizări… Fără această bază de date nimic nu funcționează. Folosesc Azure SQL Server care îmi asigură un uptime de 100%.

CACHE. Este destul de costisitor să interpelezi baza de date la orice flecușteț. Pentru a minimiza interpelările folosesc un Redis Cache Server as a service din Azure, care îl poți scala în dependență de necesități. Cache centralizat prin Redis e necesar mai ales când servere se autoscalează și nu trebuie de repopulat informația la fiecare server nou pornit. Mai folosesc și cache in memory pentru unele taskuri mici.

STORAGE. Cea mai mare problemă la privesc.eu este stocarea datelor. Avem TB de video care trebuie ținute online. Mai muți TB care trebuie ținute offline (originalele de la camerele de filmat). GB de date care trebuie de interpelat în realtime (contoare și fețele oamenilor). Pentru a micșora cheltuielile, am hotărât ca serverele de stocare video să fie păstrate în țară, în cloud e foarte costisitor. Avem un server în Moldova la Moldtelecom și altul în România la 2KTelecom. Ambele servere umplute până la refuz cu HDD-uri în RAID0. Folosim RAID0 pentru că la fluxuri mari de cereri alt tip de RAID nu face față. 

VIDEO: De la început am hotărât să folosim camere de înregistrare video pentru începători. În timp, camerele pentru începători au devenit foarte bune. La ce facem noi sunt, uneori, mai bune decât cele profesioniste. Zoom mai mare, sunt foarte ușoare și ieftine. La proteste ne ajută mult. Camerele sunt Sony AX53 4K .

AUDIO: Spre deosebire de profesioniști care folosesc microfoane prin wireless analogic, mari și cu logouri pe ele, noi ne folosim de microfoane mici bluetooth Sony ECMW1M Wireless sau microfoane Zoom H5 și pe post de mini mixer audio. Sunt ieftine, micuțe. Uneori paza de stat ne creează probleme cu bruiajele.

ENCODER: Am început cu notebook-uri, 10 ani în urmă. Camera video prin A/V cablu conectate la un convertor USB apărea ca o camera web în windows și prin Adobe Media Encoder transmiteam prin protocolul RTMP la serverele Wowza. An de an scanam ce apare nou în acest domeniu să fie ieftin și bun. Până am dat de Teradek VidiU.

BROADCAST: De obicei transmisiunile de la encoder la serverul central se face prin modeme 4G. Toți cameramanii au minim câte 2 modeme de la diferiți operatori de telefonie mobilă. Rareori facem prin cablu. În Moldova utlizăm Orange și Unite, în România Orange și Telekom. Nu ne folosim de serviciul de bounding, este destul de scump.

LIVESTREAM. Servere de stocare, care nu prea sunt expuse publicului, mai îndeplinesc și funcția de a primi semnalul video de la cameramani, de autoînregistra și servi video pentru serverele de cache video. Ele sunt interconectate între ele. Dacă un video din România este cerut din Moldova este tras mai întâi în Moldova și apoi este mai departe servit prin serverele cache. Pe aceste servere mai rulează și IIS care are soft făcut de mine. Mă ajută la thumnails, gif-uri, extragere de sunete, să pornească restreamuri sau să permit TV-urilor să poată descărca din arhivă.

CACHESTREAM. Aceste servere sunt cele mai expuse publicului și uneori servesc peste 15GB/s de informație video. Ele rulează pe nginx/docker/ubuntu. Misiunea lor e simplă - vine un http request la un chunk video din un fișier .hls, și dacă nu-l are, îl cere de la serverul de stocare, și păstrează acel chunk de video .mp4 local timp de 30 min. Când priviți video online, de obicei nu vine un fișier de câțiva GB pe local ci sunt trase fișere mici a cât 2-3MB de câteva secunde. Aceste servere sunt așa de solicitate încât undeori cedeză cartelele de rețea. Pentru a evita problemele cu cădearea lor, serverul de monitorizare periodic verifică dacă aceste serverele cache răspund înainte de a trimite oameni spre ele. Privesc.Eu are astfel de servere la Starnet (Moldova), Hetzner (Germania), Digital Ocean (Amsterdam). Au storage mic și sunt pe SSD.

P2PSTREAM: Tehnologie testată cu 2 companii și implementată. Acum este nefuncțională, însă o pot activa în situații de criză. Este mai ieftin traficul în MD decât P2P 😉

COUNTERS: Mulți clienți de ai nostri cer datele despre live-uri. Am creat un sistem de contorizare. O problemă netrivială când ai sute de cereri pe secunde și trebuie agregate datele în timp real de la mai multe servere www. Pentru asta am folosi Azure Table Storage fiecare servere înscrie acolo numele lui, ce live și câte vizualizări. Mai contorizăm și pe ce site-uri au apărut live-urile și păstrăm titlu site-ulu și pagina unde a apărut. Datele acestea sunt păstrate pe serverul Redis.

FACE RECOGNITION: De vreun an am adăugat această funcționalitate care scanează înregistarea video, găsește toate fețele. Le clasterizează astel ca să fie fiecare claster să fie aceași persoană. Memorizează unde acea față a apărut și vectorul care identifică acea față. Pentru procesarea video folosesc un calculator de birou cu 12 procesoare care 24/24 descarcă fiecare video de pe serverele de stocare, rulează face recognition și apoi aceste rezultate se salvează în cloud pe CosmosDB. CosmosDB e cea mai rapidă și scalabilă baza de date din lume. Iar imaginile se stocheză ca blob-uri în Azure Blob storage. CosmosDB a ajuns la 25GB și fiecare request e sub 10ms. 😝

CHAT: Practic e resursa care consumă cel mai mult serverele www atunci când mii de oameni stau pe pagina care are un chat. Serverele trebuie să țină conexiuni active cu toți cei care privesc - să primească și să trimită mesaje. Cererea crește exponențial față de numărul de oameni activi. Folosesc tehnologia SignalR de la Microsoft și serverul Redis pentru comunicarea între serverele www. În paralel serverele www primesc prin webhooks și comentariile de la live-urle difuzate pe Facebook.

DDOS: Cloudflare Un serviciu foarte util care te protejează contra atacurilor. Noi îl folosim pentru a minimiza cheltuielile de trafic la thumnails și player-ul video. Economisim TB de date doar folosind acest serviciu foarte comod. Deasemnea și DNS-urile stau aici care rapid pot fi modificate.

EMAIL: Trimitem lunar peste 40 mii de email-uri, alerte, rapoarte la organizatorii, începutul de transmisiune, închiderea, fotografii și statistică. Folosim de ani buni serviciul SendGrid. Este simplu și eficient. Serverele noastre de email sunt hostate de Gmail.

SMS: Transmitem lunar câteva sute. Folosim pentru comunicare urgentă cu cameramani și cu organizatorii. Oricine poate apăsa butonul Raportează de sub live și trimite un SMS cameramanului. Folosim Nexmo care e destul de bun.

PAYMENT: Aș prefera Stripe însă nu lucrează nici în România și nici în Moldova. Am găsit unul foarte bun - Braintree, care are sistem de subscription. Adică el duce evidența cardurilor bancare și are grijă să extragă banii lunar și dacă nu mai poate - îți raportează. 

NOTIFICATIONS: Avem un server, worker role, care e plin de taskuri repetitive. Serverul trimite notificări la aplicațiile de iOS, Android, Chrome și Firefox. Monitorizeză fluxurile de live stream și imediat ce pică, anunță cameramanul prin Discord și Slack despre problemă.

ANALYTICS: Web, iOS și Android sunt legate raportează la Google Analytics. La serverul web în trecut foloseam un sistem de monitorizare NewRelic. La început era gratuit, apoi când au ieșit la IPO și au anulat planul gratuit am trecut la Microsoft Application Insights.

RESTREAMING: O funcționalitate foarte întrebată la privesc.eu este retransmisiunea pe Facebook și Youtube a live-urilor filmate de noi. Cu aceasta acum se ocupă serverele centrale de stocare. Când imaginea video este nemodificată se utilizează puține resurse CPU. Însă dacă vrem să punem logo-ul privesc.eu servere țin doar 4 live-uri în paralel 😔. Pentru a scala această problemă am construit un docker care automat se pornește în cloud și se oprește când live-ul se deconectează. Suntem acum în faza de testare.

TRANSCRIPTION: Este un sistem intern dezvotat pentru a transcrie video manual, importa sau recunoașterea vocii. Cu recunoașterea vocii va trebui de mai așteptat. Ne-am integrat cu Google Speech Recognition însă e destul de prost în limba română.

PHOTO: Fotograful după ce fotografiază la eveniment încarcă pe loc toate fotografiile pe iPad apoi de pe iPad le trimite pe server. Fotografiile se stocheză în Azure Blob Storage și alertăm organizatorul cu un email. Toți oamenii de pe chat deasemnea primesc alerte despre fotografiile încărcate. Utilizatorii pot descărca aceste fotografii una câte una sau toată arhiva.

SEARCH: La început căutam doar cuvinte în titlurile evenimentelor prin SQL. Săptămâna aceasta îm integrat Azure Search, care indexează, titlurile, tag-urile și transcrierile și practic instant îți dă rezultatele. Este un serviciu de search foarte flexibil în interpelări care înțelege și limba română. Rezultatele pot fi ordonate după rank sau timpul de înregistrare.

SEO: Paginile de la privesc.eu de obicei au multe componente: chat, fețe de oameni, agenda, linkuri cu alte portaluri care se generează dinamic. Pentru a servi aceste pagini foarte rapid search-urilor este un serviciu bun - prerender.io. El deschide pagina cerută în chromeless procesază exact cum o face un browser și stocheză plain html în memorie. La o a doua cerere răspunde instant. Privesc.Eu are peste 90 mii de pagini și crawlerele cer mii de pagini pe zi. Pentru a economisi am pornit un Azure Container Instance cu un docker prerender și merge brici.

IDE: Visual Studio 2015 și 2019- dezvoltare web, Visual Studio Code - recunoașterea fețelor. XCode - aplicația iOS. Android Studio - aplicația Android.

LANGUAGES: C# - pentru progamare de web servere. Java - custom plug-in pentru Wowza. Python - recunoașterea fețelor în video. Objective-C/Swift - aplicația iOS, Java/Kotlin - Aplicația Andoid. Javascript/Typescript - Web site. Uneori mă încurc în ele când trec de la una la alta :D.

SOFT: IIS - serverele de stocare, Wowza - livestream, FFMPEG - procesare video, conversie, restream, NGINX - servere cache in reverse proxy.

OS: Windows Server - serverele www și de stocare, Ubuntu - serverele de cache video și recunoașterea fețelor, MacOS - pentru development.

Chiar dacă acest sistem este construit de un singur om, în spatele serviciilor care le folosim stau sute, poate mii de ingineri. Un mare mulțumesc lor, celor care ne ajută ca acest site să lucreze nonstop.

PS. Azi doar blogul privesc.eu a mai rămas pe wordpress. 😉

PS: Următorul post - Cum să contruiești un canal TV funcțional complet autonom.

Siri așteaptă întrebarea.

Siri așteaptă întrebarea. (Siri - asistent virtual cu Inteligență Artificială)

La conferința ICEEFEST 2018 am asistat la un panel despre politică, internet, revolte și AI. La întrebarea mea paneliștilor “Cum arată sfârșitul democrației în contextul tematicii panelului” ei au arătat nedumeriți, să nu spunem că m-au considerat un țâcnit.

Mai jos voi încerca să răspund ce am avut eu în vedere. Stați cu mine.

Rezultatul electoral depinde în mare măsură de faptul cum candidații sunt arătați de mass-media. Odată cu popularizarea Internetului și a rețelelor de socializare tot mai mulți politicieni recurg la dialogul cu electoratul prin Internet. Pentru cei sceptici, în anul 2019 timpul petrecut în Internet va întrece timpul petrecut în fața TV-ului. Adică consumul neliniar de informație va întrece consumul liniar și centralizat (Radio/TV). De ziare nu mai vorbim, ele sunt duse.

Însă în epoca Internetului există o mare problemă cu informația, ea este mult prea multă. La început au fost multe search-uri care au dat faliment după ce a apărut google cu un nou algoritm de aranjare a informației (PageRank) și care practic a acaparat tot Internetul. Mai târziu Google a introdus un nou sistem, BrainRank. Atunci când cauți ceva informație pe o anumită temă, AI (Inteligența Artificială) decide ce rezultate vei vedea.

Pe de altă parte, Facebook-ul vine cu o altă invenție destul de revoluționară, News Feed. Unde informația curge spre tine, nu tu o cauți. Însă acest șir informațional la fel este generat în dependență de preferințele tale, prietenii tăi, timp și multe alte semnale care Facebook-ul alimentează EdgeRank-ul lor pentru a scoate ceva relevant pentru ochii tăi în timp ce tu faci scroll de pe mobil. Deci și aici șirul informațional va depinde sau deja depinde de AI pentru că Facebook investește resurse considerabile în acest domeniu.

Similar e și la Twitter, Youtube, Netflix... și alte servicii unde abundă informația, iar tehnologiile de growth hacking încearcă să te facă să revii și să revii pentru că îți arată doar ceea ce dorești.

Marea majoritate din noi având dispozitive mobile transmitem cantități enorme de date la companiile care produc telefoane sau aplicații. Acestea la rândul lor ne servesc informațiile care nouă ne plac.

Viralitatea revoltelor mult lăudate din Chișinău și #rezist din București este dependentă de diciziile AI-ului. AI decide cât de viral poate fi un eveniment sau grup, sau o postare; în dependență de numărul de like-uri, share-uri, comentarii, locație, timp… La un eveniment care a avut succes posibil sunt sute de evenimente la care organizatorii nu au reușit să adune lume. De ce? Pentru că creierul artificial a decis că nu se merită de promovat în news feed-ul oamenilor.

Facebook are atât de multe date despre fiecare din noi că își permite să genereze liste de oameni în baza unei alte liste de oameni (Lookalike). De exemplu, dacă vrei să-ți mărești numărul membrilor în partid, îi dai Facebook-ului lista tuturor membrilor de partid care au cont în Facebook și el îți face o altă listă de oameni care au viziuni similare, însă încă nu sunt membri de partid. Îți rămâne să plasezi un îndemn și să îi chemi în partid.

Scandalul Cambridge Analytica i-a făcut pe congresmeni să înțeleagă puterea unui sistem cu inteligență artificială și cum el poate influența alegerile. Alegeri care până mai ieri se făceau de pe ecranele TV-ului.

Deci sistemele bazate pe AI deja controlează fluxul informațional și totodată știu foarte mult despre comportamentul nostru.

În viitorul apropiat când majoritatea populației va fi în Internet (în unele țăre majoritatea deja este în Internet) partidele politice pot adopta o altă tactică, cea de simulare a candidatului cu cea mai mare probabilitate de câștig în dependență de preferințele electoratului. Vor lupta în a găsi candidatul, nu în promovarea lui. De aceea în viitor mult va conta brandul personal. La alegerile parlamentare lista candidaților se va face în dependență de simulările membrilor de partid care au cele mai mari șanse de câștig a electoratului. Sau se va încerca diversificarea listei. De exemplu, un candidat este popular printre bucătari, altul printre ingineri, al treilea pe instagram….

Democrația devine broasca care încetul cu încetul se fierbe în apă și nu-și dă seama că moare. Vom avea iluzia că am găsit candidatul cel mai bun însă cine este acest candidat îl va decide inteligența artificială.

În final vom ajunge să întrebăm de Siri pe cine să votăm.

Există vreo soluție pentru a evita această dependență de AI? Dacă aveți și voi una sunteți bineveniți să o lăsați în comentarii.

Eu am una. Vă aștept să o citiți în articolul viitor.

9 Comments

Gossip app screenshot

Gossip captură

Nu sunt bârfitor, însă mulți/multe sunt 😉
Discutând cu partenerul meu despre noi idei de aplicații, am ajuns la una. Una despre bârfe. Gossip.

Ideea este simplă, să simulăm virtual procesul de bârfe din lumea reală.
Adică, spui cuiva niște informații, uneori dubioase sau intenționat greșite, cu eticheta “Numai să nu spui nimănui!” și bârfa pleacă în lume.

Aplicația e simplă de tot:

  1. Indici numărul tău de telefon, primești un SMS cu codul de activare.
  2. Inviți câțiva din cei mai buni prieteni/prietene să ți se alăture.
  3. Scrii mesaje pe care toți prietenii tăi le văd.
  4. Atenție! Dacă cineva răspunde la un mesaj de al tău, răspunsul lui și mesajul tău este văzut și de prietenii prietenului. Așa se propagă bârfa 😉
  5. Toți cei pe care i-ai invitat și au instalat aplicația, automat îți devin prieteni.

Șmecheria este că nu există nickname-uri, nume sau fotografii de profil. Între utilizatori diferă doar culoarea de fundal a mesajelor.
Culoare se schimbă odată la fiecare 24 de ore. Totul e anonim, până când decizi tu să-ți dezvălui identitatea în vreun mesaj.

Gossip se poate descărca de pe App Store.

PS1: Știind cum lucrează clasa politică la noi în țară, le-aș recomanda și lor această aplicație 🙂
PS2: Aplicația iOS și partea de server a fost făcută de 10 oameni-zile.

1 Comment

Aplicația iPhone Privesc.Eu

Aplicația iPhone Privesc.Eu

Demult mă întrebau prietenii de ce nu o fac, o aplicație Privesc.Eu pentru iPhone. Răspunsul e în Google Analytics. Pentru că sunt puțini oameni cu iPhone/iPad! Rețeaua Privesc.eu a găsit că în Moldova și România sunt aproximatic 130 mii de astfel de oameni. Însă tendința e în creștere, săptămâna trecută am bătut recordul cu 28 mii de vizite de pe mobil.

Publicul nostru țintă vine dimineața pe la 9:00 pe site, studiază agenda și se întorc când începe un eveniment interesant. Deci aplicația MVP (minimum viable product) trebuie să rezolve problema publicului țintă. Să le amintească când se începe un live. O aplicație cât se poate de simplă, ador aplicațiile simple și utile.

Ca să nu pierd timpul din contul altor proiecte am făcut aplicația în goană, într-un weekend. Aplicația conține doar 3 forme: Lista evenimentelor, setările și playerul video.

Din lista evenimentelor vă puteți da seama ce eveniment a început, care e live sau în arhivă. Dacă evenimentul nu a început, apăsați pe el și veți primi o notificare când va începe. Privesc.Eu e același pentru România și Moldova, aplicația determină din ce țară accesezi Internetul și îți arată doar acele evenimente. Din setări puteți schimba forțat regiunile și vă puteți abona la notificări după categori. Gata. Asta e tot.

Îți rămâne să tragi aplicația, și să aștepți când va începe un live.

Pentru fanii iOS-ului, voi lămuri cum a fost făcută.

După ce îți faci un cont apple pentru developer. Moldoveni, trebuie să trimită un fax la Apple cu semnatura și numărul de cardului de credit. Apoi setezi conturile bancare, tragi XCode de pe App Store. Îți adaugi UDID-ul iPhone-ul pe portalul de la Apple. Pentru că noi dorim să trimitem notificări, bundle ID trebuie să fie exact, fără *. Apoi faci certificatele pentru sandbox și production pentru notificări și provision profiles pentru developer și distribuții ad-hoc și distribuții Apple.

Lista device-urilor asignate contului meu.

Lista device-urilor asignate contului meu.



Privesc.Eu Bundle ID

Privesc.Eu Bundle ID

Deschizi XCode și alegi un template pentru table view. Niște mici modificări, setăm bundleID, iconițele, default screen-uri. Și putem rula aplicația pe simulator sau device.

Setari în XCode

Setari în XCode

Cu librăria ASIHTTP dăm un request la server care întoarce rezultatul în JSON, iar cu frameworkul SBJSON îl procesăm și îl facem în NSObiecte. Îl transmitem la UITablewView datasource și avem live-urile afișate. Facem un custom la UICellView și băgăm UIImageView inteligent, care singur își trage imaginea din Internet în background, fără a frâna scrolarea. Am luat din source code de la Facebook și am modificat 😉

La pornirea aplicației cerem utilizatorului să ne dea voie să-i trimitem notification

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];

Iar când avem răspunsul îl trimitem la serverul nostru. Să știe și serverul ce și cum, ce deviceToken cu ce regiuni și ce categorii să-l alerteze.

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
self.onlineController.deviceToken = deviceToken;
[self.onlineController updateDeviceToken:self.onlineController.deviceToken];
}

Trimisul notificarilor e destul de complicat, însă sunt băieți harnici care rezolvă repejor. Hei, programerii sunt leneși și folosesc la maximum codul altora.

Serverul e pe .NET framework în c# sub Windows Azure. Facem un Worker Role, cu un Thread care procesează o coadă de mesaje. Folosim frameworkul PushSharp pentru a trimite notificări la iPhone, Android sau Windows Phone.

PushService push = new PushService();
//Wire up the events
push.Events.OnDeviceSubscriptionExpired += new PushSharp.Common.ChannelEvents.DeviceSubscriptionExpired(Events_OnDeviceSubscriptionExpired);
push.Events.OnChannelException += new PushSharp.Common.ChannelEvents.ChannelExceptionDelegate(Events_OnChannelException);
push.Events.OnNotificationSendFailure += new PushSharp.Common.ChannelEvents.NotificationSendFailureDelegate(Events_OnNotificationSendFailure);
push.Events.OnNotificationSent += new PushSharp.Common.ChannelEvents.NotificationSentDelegate(Events_OnNotificationSent);
var appleCert = RoleEnvironment.IsEmulated ?
Certificates.loadCertificateFromAppData("PrivescEu.Sandbox.p12") :
Certificates.loadCertificateFromBlob("PrivescEu.Production.p12");
push.StartApplePushService(new ApplePushChannelSettings(!RoleEnvironment.IsEmulated, appleCert, "catpecesauitsascotparoladeaici"), new PushServiceSettings());

....
un ciclu veșnic

//Fluent construction of an iOS notification
AppleNotification an = NotificationFactory.Apple()
.WithTag(pn) //for feedback in events
.ForDeviceToken(pn.DeviceToken)
.WithAlert(pn.Title)
.WithSound(pn.Sound)
.WithBadge(pn.Bag)
.WithCustomItem(pn.PayLoadName, pn.PayLoadValue);

push.QueueNotification(an);

iar pe device-uri prindem aceste notificari.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
if (!userInfo) return;
[self processRemoteNotification:userInfo];
}

Ne rămâne să afișăm screen de live. E simplu, se face în două rânduri.

MPMoviePlayerViewController *mpc = [[MPMoviePlayerViewController alloc] initWithContentURL:live.VideoStreamUrl];
[self presentMoviePlayerViewControllerAnimated:mpc];

Compilăm, testăm, dăm la prieteni să-și spună părerile, nu-i ascutăm și trimitem la iTunes App Store. Așteptăm o săptămână pentru aprobare și facem buzzzzz până ne ridicăm pe primul loc.

Privesc.Eu primul în topul aplicațiilor gratuite pe iPhone

Privesc.Eu primul în topul aplicațiilor gratuite pe iPhone


Pitch well and prosper!
Vitalie Eșanu.