by Aage Andre

8 ting jeg savner med Android(og omvendt)

Alle IT-blogger med respekt for seg selv har en iPhone-post. De fleste har en “vs”-post også.. Nå skulle jeg egentlig blogge om Kerio vs Exchange, eller Hyper-V vs Xen vs VMWare, men det er ikke like gøy.


Så, jeg kjøpte meg iPhone 4. Til alle i vennegjengens store forskrekkelse etter årevis med korstog mot den lukkede verden, Jobs arroganse og fanboi-mentaliteten som dominerer Apple-universet  alt for mye.
Ha det helt klart: Jeg er kjempefornøyd med iPhone. Jeg har faktisk aldri brukt mobilen på langt nær så mye som jeg gjør nå, og fikler mer med den når jeg sitter på kontoret enn sjefen liker. Dog skal det sies at jeg hadde HTC Hero, intro-modellen med hardware langt under par. Hadde jeg hatt Samsung Galaxy S eller HTC Desire kan det nok hende den hadde vært like flittig brukt som iPhone er nå.

Så, fullstendig uoffisielt, og kun for å tilfredstille min egen ytringskåthet:

1. People-app. Er vel mer en HTC Sense-ting enn Android, men uansett.. Kontakt-opplegget på iPhone er det jeg er mest misfornøyd med på hele telefonen. Alle som mener Kontakt-appen til Iphone er bra har enten aldri brukt noe annet eller kan ikke å organisere kontaktene sine. People-app på Androiden min savner jeg.. Hver dag, hver gang noen oppdaterer Facebook eller Twitter. Hver gang jeg skal sjekke mailer fra spesifikke kontakter. Bare det faktum at jeg ikke kan gå inn på en kontakt på iPhone og se ringe-logg på vedkommende irriterer meg og er meg fullstendig uforståelig.

2. Kalender. Skjønner at Steve (Jobs) har sin egen sekretær som passer på avtalene hans, men vi som ikke har det kunne godt fått en skikkelig kalender-app.

3. Long-press menyer. ALT i iPhone er basert på neste->neste og tilbake-menyer. Hvorfor kan jeg ikke holde inne på en SMS for å kunne velge å ringe kontakten, editere, slette, flytte etc etc? Alt for mye blaing frem og tilbake/opp og ned for å få til det du vil(om det KAN gjøres).

4. Settings per app. Litt det samme som 3. Når jeg står i Mail-appen, hvorfor kan jeg ikke med 2 kjappe trykk endre signatur, oppsett o.l.? Nei, man må ut i den egne Settings-appen, trykke seg fremover, fremover, obs!, bakover, der kanskje,  fremover, endre, og så kan man tilbake til Mail.

5. Foto-app som kan brukes til noe fornuftig. Steve har latt oss få opp DCIM-mappen som ekstern disk på PC/Mac. Men kun for å lese. Når jeg lagrer en MMS, hva i alle dager har den i Camera Roll-mappen å gjøre? Jeg vil lage mine egne mapper! Og hva om jeg vil flytte bildene mellom mapper? Åja, i Explorer/Finder og resync telefonen neste gang du er foran den… Talentløst, og jeg er overraska over at målgruppen til Apple(de hippe, kule av oss) ikke klager mer over det.

6. Widgets. Faktisk ikke noe stor krise, men innbiller meg det er barnslig vil-ikke-mentalitet hos Jobs som er grunnen til at iPhone ikke har det. Ser ingen annen grunn.

7. Skikkelig multitasking. Ironisk nok skal multitasking på iPhone visstnok være gjort “slik det burde være”. Vel.. Jeg vil ha kontroll på appene som lever, og jeg vil kunne stoppe de på eget initiativ. Når jeg trykker home på iPhone, putter jeg appen i hibernate? Selv om jeg har trykket pause på Spotify, bruker den ressurser? Burde jeg fjerne den fra lista over siste apps med den “enkle” 5-trykks kombinasjonen slik jeg tidligere hadde min kjære “one push kill all”-widget?

8. Mini-USB-connection. Koble til en vanlig mini-USB, som alle har liggende, og vips har du tilgang på samtlige filer på minnekortet, inkludert mulighet til å kopiere inn bilder, musikk, dokumenter etc. Som de fleste andre Windows-brukere, hater jeg iTunes. Heldigvis har jeg VHD-boot og en dedikert iTunes-PC, men noen som påstår det er ikke for alle.

Omvendt! Eller, 9 ting jeg liker med iPhone

1. Surfe-opplevelse. Ok, jeg hadde en HTC Hero med stock 2.1. Ting var dødtregt og det skulle virkelig være livsnødvendig før jeg gadd å prøve surfe på den. Herlig på iPhone. Vil tro det er bedre på nyere Android-telefoner.

2. Mail-app. K9 er det nærmeste jeg har kommet en bra mail-app på Android. iPhone har faktisk en over snittet bra app for dette, med mindre du bruker gmail og vil lable mailer.

3. Kamera. Alle som har hatt en HTC vet hvor latterlig dårlig kameraet er på samtlige mobiler fra de. Bedre på andre. Best på iPhone. Nå bruker jeg faktisk kameraet av og til.

4. Angry Birds. I know. Men fullversjonen kommer på Android snart.

5. Facebook-app. Jeg bruker fortsatt iPhone på Facebook selv om jeg sitter foran PCen. Har vel aldri vært så aktiv hverken på Facebook eller Twitter som jeg plutselig ble med iPhone.

6. Screen-lock. Egentlig utrolig at det er noe jeg irriterer meg over på Sense..  Også her er det en HTC-ting mer enn Android(stock Android uten Sense har nice lock-screen). Jeg virkelig hatet at man kan låse opp Heroen med å dra hvor som helst på skjermen. Og apropos det.. Hvem hos HTC bestemte at alarmen på Sense skulle være “Dra hvor som helst for å slå av, trykk på den 4 pixel store knappen for å snooze”. Beviser bare at ingen hos HTC faktisk bruker telefonen som vekkerklokke. Våkner jo før man omsider klarer å treffe den nesten usynnlige knappen.

7. Alt kommer til iPhone “først”. Alle brukbare apps(nyheter, info, hvasomhelst) kommer på iPhone lenge før Android. Bare se på GuleSider, VGTV, LinkedIN etc.

8. Facetime. Faktisk litt kult. Spesielt den ene gangen jeg brukte det for å teste. Men det blir nok ingen vane. Vi er 3 stykker på kontoret med iPhone 4 og vi ringer fortsatt normale samtaler oss imellom på fritiden.  Jeg håper faktisk alle bruker FaceTime som meg. Kanskje det tvinger frem ett samarbeid om en felles standard for videosamtaler på mobil om folk ikke bruker det pga plattform-inkompabilitet.

9. Skjermen. Nam! Alt jeg har å si.

Om du ser fort over listen på ting jeg liker med iPhone ser man ganske fort at det er trivielle ting, men ting som gjøre hverdagen litt enklere og morsommere.

Det er ikke noe bedre eller verre.. Det er bare snakk om hva du vil ha og hva du(og lommeboka) er komfortabel med. Så vennligst legg flame-krigen død for en gangs skyld. For mange passer ingen av delene.. Derfor har vi Nokia, Samsung Wave og gode gamle Sony Ericsson Walkman-mobiler. Kjøp det som passer for deg, og glem hva evangelistene sier.

Og jeg? Så snart HTC Desire HD får en offisiell lagerdato hos diverse nettbutikker ligger det en iPhone på Finn.no

by Degree Admin

iPhone Utvikling UIAlertView

UIAlertView er en nyttig funksjon som er vanlig å bruke i iPhone applikasjoner. Det brukes til å vise en “popup” boks for å gi brukeren ulike valg. I denne artikelen skal jeg vise hvordan man bruker dette for å lage en logg-ut dialog med brukeren. Jeg skal også gi et eksempel på en alert med et input text område.

- (IBAction) quitApp
{
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:@"Sign Out"
message:@"Do you wish to sign out?"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles: @"OK" ,nil];

[alert show];
[alert release];

}

I eksempelet ovenfor vil brukeren få presentert en alert som inneholder to knapper, samt et spørsmål om å logge ut av applikasjonen.

- (IBAction) alertTextbox
{
UIAlertView *dialog = [[[UIAlertView alloc] init] retain];
[dialog setDelegate:self];
[dialog setTitle:@"Enter Text"];
[dialog setMessage:@"Enter Text"];
[dialog addButtonWithTitle:@"Cancel"];
[dialog addButtonWithTitle:@"OK"];

nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)];
[nameField setBackgroundColor:[UIColor whiteColor]];
[dialog addSubview:nameField];
CGAffineTransform moveUp = CGAffineTransformMakeTranslation(0.0, 0.0);
[dialog setTransform: moveUp];
[dialog show];
[dialog release];
[nameField release];

}

Dette eksepelet gir brukeren en alert som inneholder en tekstboks og to knapper. Her kan brukeren skrive inn en verdi i tekstboksen som kan hentes og benyttes i applikasjonen.

Nedenfor er et kodeeksempel som benyttes på knappene i uialertview.

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)index
{
if (index == 0)
{

}
else if (index == 1)
{
//handle textfield text
}
}

Et tips for å få bruke flere UIAlertViews på ett UIView er å definere hver alert med en egen tag. Definer hver ID slik:

#define kAlertViewOne 1;
#define kAlertViewTwo 2;

Deretter knytter man den ønskelige ID’en til den ønskelige alert’en slik:

alertname.tag = kAlertviewOne;

Da kan man enkelt identifisere hvilken UIAlertView som brukes med en enkel if setning:

if (alertView.tag == kAlertView){
}

by Degree Admin

iPhone Utvikling ASIHTTPRequest

ASIHTTPRequest brukes i iPhone utvikling for å gjøre kommunikasjon med web servere lettere. Noen eksempler på hva ASIHTTPRequest tilbyr er blandt annet muligheten for å sende eller motta data fra en web server, laste ned data til minne eller direkte til en fil på disk, enkel tilgang til request og response HTTP header, GZIP og cookie støtte, synchronous og asynchronous requester.

Last ned ASIHTTPRequest her: ASIHTTPRequest

Kopier de filene du trenger til din prosjekt mappe og legg dem til i ditt xcode prosjekt. Hvis du ikke er sikker på hvilke filer du trenger så kopier over følgende filer:

* ASIHTTPRequestConfig.hiphone
* ASIHTTPRequestDelegate.h
* ASIProgressDelegate.h
* ASICacheDelegate.h
* ASIInputStream.h
* ASIInputStream.m
* ASIHTTPRequest.h
* ASIHTTPRequest.m
* ASIFormDataRequest.h
* ASIFormDataRequest.m
* ASINetworkQueue.h
* ASINetworkQueue.m
* ASIDownloadCache.h
* ASIDownloadCache.m
* ASIAuthenticationDialog.h
* ASIAuthenticationDialog.m
* Reachability.h (i External/Reachability mappen)
* Reachability.m (i External/Reachability mappen)

Den enkleste måten å bruke ASIHTTPRequest er å bruke en synchronous request. Ved å sende startSynchronous meldingen vil requesten bli kjørt i samme tråd og returnere når requesten er fullført (uansett om den var suksessfull eller ikke). For å få responsen som en string bruker man responseString metoden og for binære data bruker man responseData. Få requesten til å laste ned data til en fil med downloadDestinationPath property.

- (IBAction)grabURL:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://blog.degree.no"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
NSString *response = [request responseString];
}
}

Bruk asynchronous request for å kjøre requesten i bakgrunnen.

- (IBAction)grabURLInBackground:(id)sender
{
NSURL *url = [NSURL URLWithString:@"http://blog.degree.no"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDelegate:self];
[request startAsynchronous];
}


- (void)requestFinished:(ASIHTTPRequest *)request
{
// Use when fetching text data
NSString *responseString = [request responseString];

// Use when fetching binary data
NSData *responseData = [request responseData];
}

– (void)requestFailed:(ASIHTTPRequest *)request
{
NSError *error = [request error];
}

For mer informasjon om ASIHTTPRequest og hvordan man kan benytte det i eget prosjekt besøk ASIHTTPRequest

by Degree Admin

iPhone Utvikling UIViews

Jeg kommer til å legge ut en del innlegg som omhandler iPhone utvikling på denne bloggen. Jeg kommer til å begynne med mest grunnleggende funksjoner og muligheter for deretter å avansere. Dagens innlegg handler om å benytte forskjellige UIViews og hvordan man bytter mellom dem.

Etter å ha opprettet ett nytt “Window-based Application” prosjekt høyreklikker man på “Classes” mappen i prosjekt treet i Xcode. Velg Add -> New File… og velg “UIViewController subclass”. Huk av for “with XIB for user interface” og klikk neste. Gi filene et passende navn (jeg har brukt untitled og untitled2 siden dette bare er en demo), deretter drar man XIB filen over i “Resources” mappen. Gjenta denne prosessen slik at du har tilsammen to sett med filer.

Alle nødvendige filer er nå opprettet og neste steg er å tilføre den nødvendige koden som skal til for å veksle mellom de nye viewcontrollene. Gå først inn i App delegaten sin header fil (.h) og modifiser filen slik at den er lik som koden nedenfor:


#import

@class untitled;
@class untitled2;

@interface TestAppDelegate : NSObject {
UIWindow *window;
IBOutlet untitled *viewControllerOne;
IBOutlet untitled2 *viewControllerTwo;
}

-(void) switchViewOne;
-(void) switchViewTwo;

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet untitled *viewControllerOne;
@property (nonatomic, retain) IBOutlet untitled2 *viewControllerTwo;

@end

Deretter går du inn i App delegaten sin implementasjons fil (.m) og legger inn nødvendig kode slik at den ligner på koden nedenfor:


#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
untitled *_untitledOne = [[untitled alloc] initWithNibName:@"untitled" bundle:[NSBundle mainBundle]];
self.viewControllerOne = _untitledOne;
[_untitledOne release];
[window addSubview:[viewControllerOne view]];
[window makeKeyAndVisible];

return YES;
}

To metoder for å bytte mellom de ulike views’ene. En enkel flip animasjon er lagt til når man bytter views:


-(void) switchViewOne
{
untitled2 *mainview = [[untitled2 alloc] initWithNibName:@"untitled2" bundle:nil];
[self setViewControllerTwo:mainview];
[mainview release];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES];
[viewControllerOne.view removeFromSuperview];
[self.window addSubview:[viewControllerTwo view]];
[UIView commitAnimations];
}

-(void) switchViewTwo
{
untitled *mainview = [[untitled alloc] initWithNibName:@"untitled" bundle:nil];
[self setViewControllerOne:mainview];
[mainview release];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES];
[viewControllerTwo.view removeFromSuperview];
[self.window addSubview:[viewControllerOne view]];
[UIView commitAnimations];
}

Neste steg er å legge til kode i den første viewcontrolleren sin .h fil. Tilfør følgende kode:


#import
#import "untitled2.h"

@interface untitled : UIViewController {
IBOutlet UILabel *lblOne;
IBOutlet UIWindow *window;
}

@property (nonatomic, retain) UILabel *lblOne;
@property (nonatomic, retain) UIWindow *window;

-(IBAction)switchView: (id) sender;

@end

Deretter utfører du følgende kode i .m filen:


#import "untitled.h"
#import "untitled2.h"
#import "TestAppDelegate.h"

@implementation untitled

@synthesize lblOne;
@synthesize window;

-(IBAction)switchView: (id) sender
{
TestAppDelegate *mainDelegate = (TestAppDelegate *)[[UIApplication sharedApplication ]delegate];
[mainDelegate switchViewOne];
}

Den neste viewcontrolleren sin .h fil skal se slik ut:


#import
#import "untitled.h"

@interface untitled2 : UIViewController {
IBOutlet UILabel *lblOne;
IBOutlet UIWindow *window;
}

@property (nonatomic, retain) UILabel *lblOne;
@property (nonatomic, retain) UIWindow *window;

-(IBAction)switchView: (id) sender;

@end

Og .m filen skal se slik ut:


#import "untitled2.h"
#import "untitled.h"
#import "TestAppDelegate.h"

@implementation untitled2

@synthesize lblOne;
@synthesize window;

-(IBAction)switchView: (id) sender
{
TestAppDelegate *mainDelegate = (TestAppDelegate *)[[UIApplication sharedApplication ]delegate];
[mainDelegate switchViewTwo];
}

All nødvendig kode er nå lagt til. Siste steg er å knytte disse metodene til objekter i et view. Dobbelklikk på den første XIB filen som ble opprettet i steg èn som ligger under mappen “Interface Builder Files” i Xcode. Filen vil da åpnes i Interface Builder. Hvis ikke View’et åpnet seg så dobbelklikker du på “View” i xib filen. Dra over en label og legg til en tekst. Deretter drar du over en “round rect button” og gir den ett navn. Det neste som må gjøres er å knytte disse til koden vi implementerte i viewcontrolleren. Marker “File’s owner” og åpne “Connections Inspector”. Under “Received Actions” ligger det en metode. Dra en linje fra denne til knappen du opprettet i view’et. Gjør det så med lblOne som ligger under “Outlets” og dra den til Labelen som ble opprettet på view’et. Gjenta denne prosessen med den andre xib filen.

Applikasjonen er nå ferdig!

Build og kjør appen. Klikk på knappene for å bytte views. Da er det bare å begynne å leke med koden og ta dette videre!