
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.

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
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
Pitch well and prosper!
Vitalie Eșanu.