iRepair

iPhone-udvikling #5 – Links fra nettet

En lille knap
Der er nogle mennesker der skal have noget at trykke på! Derfor skal vi lave en opdaterings knap i vores app. Vi vil placere den øverst til venstre i vores titlebar.

Vi starter med at erklære den i NetLinkUiTableViewController.h

Der skal skrives

UIBarButtonItem* refresh;

og

@property (nonatomic,retain) UIBarButtonItem* refresh;

Samtidig kan vi erklære en metode, refreshlinks lige ovenover @end i samme fil

-(void) refreshLinks;

Vi vender nu tilbage til NetLinkUiTableViewController.m, hvor vi starter med at tilføje vores knap, refresh til den linie hvor der allerede står @synthesize links;

Dernæst skal vi lave lidt om i vores initializer metode.

Inden vi kalder initLinks skal vi initialisere og konfigurer vores knap.
Første linie initialisere den, giver den titlen “Opdatér” og fortæller at metoden “refreshLinks” (ikke lavet endnu) skal kaldes når man trykker på knappen.

I den næste linie placerer vi knappen øverst til venstre i vores titlebar.

refresh = [[UIBarButtonItem alloc]initWithTitle:@"Opdater" style:
UIBarButtonItemStylePlain target:self action:@selector(refreshLinks)];

self.navigationItem.leftBarButtonItem = refresh;

Vi skal nu tilføje metoden refreshLinks. Den skal indeholde nogle ting som at der allerede står i initLinks. RefreshLinks skal se således ud.

	NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
	NSDate* now = [[NSDate alloc]init];
	//læser  links fra en URL
	NSLog(@"Henter links fra url");
	[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
	links = [[NSArray alloc]initWithContentsOfURL:[NSURL URLWithString:
		@"http://www.iphoneguide.dk/anmeldelser.php"]];
	//gemmer den lokalt
	[links writeToFile:@"links.xml" atomically:YES];
	//gemmer tidspunktet for sidste download
	self.navigationItem.leftBarButtonItem.title =
		[now descriptionWithCalendarFormat:@"%d/%m %H:%M" timeZone:nil locale:nil];
	[defaults setObject:now forKey:@"lastFetch"];
	[defaults synchronize];
	[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Der er ikke så meget nyt her. Vi indlæser listen fra en url og gemmer tidspunktet i NSUserDefaults. Dernæst opdatere vi teksten på knappen således at den viser hvornår vi sidste opdaterede. Datoen “now” bliver formateret som “19/2 19:45”.
Du kan også se to andre nye ting.

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

Disse linier “tænder” og “slukker” simpelthen for den lille activityindicator der kan vises øverst i telefonens display, ved siden af operatø og tid. Denne indicatior bliver ikke vist på simulatoren :-(

Til sidst skal vi omskrive initLinks således at den kalder refreshLinks (hvis det er nødvendgt).
Samtidig skal initLinks sætte opdateringsdatoen på vores knap, hvis altså vi allerede indeholder data.

-(void)initLinks{
	//læs links fra fil
	links = [[NSArray alloc]initWithContentsOfFile:@"links.xml"];
	NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
	//Nuværende tidspunkt
	NSDate* now = [[NSDate alloc]init];
	//Sidst vi hentede
	NSDate* lastFetch = [defaults objectForKey:@"lastFetch"];
	NSTimeInterval diff= [now timeIntervalSinceDate:lastFetch];
	//60 sekunder * 60 minutter * 24 timer...en dag...
	int aDay=60*60*24;
	NSLog(@"Vi hentede sidste data fors %@ sekunder siden", [NSNumber numberWithDouble: diff]);
	if(lastFetch){
	self.navigationItem.leftBarButtonItem.title =
		[lastFetch descriptionWithCalendarFormat:@"%d/%m %H:%M" timeZone:nil locale:nil];
	}
	//hvis vi ikke har nogle links i den lokale fil, eller vi ikke har hentet i over 24 timer så
	if(links ==nil || diff > aDay){
		[self refreshLinks];
	}
}

Færdig!

Et lille tip. Hvis der opstår nogle problemer kan det som regel være en god ide at rydde helt op.
Dvs, slette links.xml og app’en fra iphone simulatoren. Links.xml ligger i “/” på harddisken.

Projektkode
Du kan hente koden til projektet her:
dev4

Kommentarer og spørgsmål kan skriver i kommentarerne.

Sider: 1 2 3 4 5 6 7

Skrevet af Martin Wolsing, 20/02 2009
Relaterede indlæg

Kommentarer
Subscribe to RSS
  •  

    Håber i kan følge med. Denne app er ret skæg…

    Dette er faktisk en app man sagtens kunne udgive!

    Hvis i skal køre den på en iphone, modsat simulatoren, skal der nok lige arbejdes lidt med hvor den gemmer den lokales fil.

    20. februar 2009 @ 09:01

  •  

    Der ser godt ud :) skal prøve det når jeg kommer hjem.

    20. februar 2009 @ 09:26

  •  

    Helt enig, det er en super app denne gang. Med lidt modifikationer er anvendelsesmulighederne nærmest uendelige. I dette tilfælde f.eks. kunne man inkludere programmets ikon foran navnet og antallet af stjerner i højre side. Under navnet kunne stå, kategori og pris. Det ville være ret lækkert. Nok ikke en betalings App, men det kunne jo være andre ting end lige links til anmeldelser på iPhoneguide, der var tale om. Prøv f.eks. at tjekke et af apples sample-programmer: https://developer.apple.com/iphone/library/samplecode/SeismicXML/index.html Det viser de 50 seneste jordskælv verden over. XML-feeded er et offentligt tilgængeligt feed fra en eller anden amerikansk jodskælvs-myndighed. Man kunne f.eks. udvide det til at vise placeringen på en kort, når man trykker på det enkelte skælv. Man kunne også bruge GPS på en smart måde.

    Godt du selv nævner det med filens placering, Mikkel, for det har jeg faktisk et spørgmål til. Men det er mere fordi jeg ønsker at inkludere en default fil i projektet. Grunden er, at hvis ikke man har netværksforbindelse første gang man starter det, er programmet jo ubrugelig, i og med der så intet indhold er. Hvis man har en lokal fil fra starten af (uanset hvor uopdateret den så er), er der i hvert fald en eller anden form for indhold.

    Jeg prøver selv at finde en løsning (det lære man jo nok mest af) :-)

    En andet spørgmål, Mikkel: I hvor høj grad skal man tage højde for at folk ikke har f.eks. netværksforbindelse, at serveren er nede osv.? Jeg mener, hvor meget skal man gøre ud af fejlmeddelelser a al “serveren er ikke tilgængelig i øjeblikket”, “du har ikke netværksadgang” osv.?

    20. februar 2009 @ 09:31

  •  

    Jeg har tidligere fået afvist en opdatering til iTog pga jeg ikke kom med en fejl meddelelse.

    Den letteste måde at gøre dette, er at få fat i Apples reachability sample app. Hive reachability.h og .m over i en projekt.

    Importere .h i sin appdelegate og lave noget der ligner

    BOOL con = [[Reachability sharedReachability]isHostReachable:@”http://www.iphoneguide.dk”];

    if(!con){
    UIAlertView* alertView =[[UIAlertView alloc]initWithTitle:@”fejl!” message:@”ingenforbindelse!” delegate:self cancelButtonTitle:@”exit” otherButtonTitles:nil];
    [alertView show];
    [alertView release];

    }

    øverst i applicationdidfinishlaunching

    20. februar 2009 @ 09:41

  •  

    Så er det mig igen ;)

    Jeg kan ikke få det på side 4 til at virke. Når jeg kører App’en, er der ikke noget, bortset fra “Anmeldelser” og nogle tomme celler.

    Hvad mangler der?

    20. februar 2009 @ 23:08

  •  

    @jackass

    Prøv at hente koden jeg har vedhæftet sidst i artiklen og se om ikke det virker.

    20. februar 2009 @ 23:59

  •  

    Det er det samme når jeg har hentet den vedhæftede fil!

    21. februar 2009 @ 11:05

  •  

    PS. Kan du (Mikkel) ikke lave en “ordbog”, med hvad man kan skrive af kode/hvilke koder der findes?

    21. februar 2009 @ 11:20

  •  

    jackass, prøv st slette links.xml, den ligger sikkert i roden af dit harddisk.

    Jeg kan ikke lave en ordbog, men xcode indeholder meget god dokumentation for alle klasser og biblioteker…

    21. februar 2009 @ 15:13

  •  

    @Mikkel

    Så vidt jeg kan se, opdateres tabellen ikke når man trykker på “opdater”. Det er kun xml-filen der opdateres, mens det der står på skærmen bliver ved med at være det samme , dvs. det er først næste gang man starter programme, at den opdaterede fil indlæses.

    Er det ikke muligt på en nem måde, at få oversigten opdateret med det samme, når man trykker på opdater – eller kræver det større ændringer?

    21. februar 2009 @ 21:06

  •  

    Aarghh

    En lill ebug

    Inde i refresh links skriver du noget ala

    [self.tableView reloadData];

    21. februar 2009 @ 21:45

  •  

    @Mikkel

    Når man tester på iPhonen kommer der en fejlmeddelelse omkring dato/tids-formateringen:

    ‘NSDate’ may not respond to ‘-description WithCalendarFormat:timeZone:locale:’
    (Messages without a matching method signature

    Den kommer som sagt kun på iPhone og ikke i simulatoren. Programmet kører dog fint nok så det er bare en skønhedsting.

    Jeg har her en løsning, omend jeg ikke ved om det er den “rigtige”:

    1) Først henter jeg datoen

    NSDateComponents *comps = [[NSCalendar currentCalendar] components:kCFCalendarUnitMonth|kCFCalendarUnitDay fromDate:[NSDate date]];

    Nu kan dag og måned hentes via [comps day] og [comps month]

    2) Jeg konverterer dem til text string (fordi jeg vil indsætte en skråstreg mellem de to tal)

    NSString* datoMonth = [NSString stringWithFormat:@"%d", [comps month]];
    NSString* datoDay = [NSString stringWithFormat:@"%d", [comps day]];

    3) Nu da de er konverteret til text, bruger jeg stringByAppendingString til at samle tre strenge til en og sætter knappen til denne:

    self.navigationItem.leftBarButtonItem.title = [datoDay stringByAppendingString:[@"//" stringByAppendingString:datoMonth]];

    Det skal siges, at ovenstående ikke sætter tidspunktet, men kun datoen, det er dog fint til mit behov så derfor har jeg ikke undersøgt det nærmere.

    Om det kan gøres mere simpelt ved jeg ikke, men det fungerer i hvert fald og giver ikke fejl når applikationen installeres på telefonen.

    24. februar 2009 @ 09:15

  •  

    Ok,
    jeg vil kigge det igennem…

    “warnings” er selvfølgeliog irreterende, men som du har opdaget, ikke kritiske (så længe man har lidt styr på hvilek warnings man har, og hvorfor)….

    Hvad skal vi snakke om i næste og pt sidste artikel??

    24. februar 2009 @ 10:36

  •  

    @mikkel

    ANg post #4 herover, så kan jeg ikke få det til at virke. Der kommer et hav af fejlmeddelelser.

    24. februar 2009 @ 19:44

  •  

    hvilke fejl???

    24. februar 2009 @ 20:00

  •  

    Hvad med noget om App’s med Tab Bars? Det ville i hvert fald være brugbart.

    24. februar 2009 @ 20:15

  •  

    @Mikkel

    Alt for mange. :-) Jeg har droppet det og istedet lavet en alert-box der fortæller at databasen ikke kunne opdateres.

    @alle

    Jeg har i øvrigt indsendt endne en app til review hos App Store. Den belv påbegyndt fredag eftermiddag og er altså nu klar til salg. Den bygger på principperne gennemgået i ovenstånde artikel. Blot har jeg udvidet det lidt.

    1) xml-feedet er noget andet end links og filen har en anden struktur. Jeg parser derfor filen med den indbyggede parser. Jeg har derudover inkluderet en xml-fil i programmet, så der er noget at arbejde med fra starten, hvis man ikke skulle have netforbindelse. Den kopieres så til et sted hvor den kan overskrives (når man trykker på opdater).

    2) Indholdet lægges i et tableview, som i artiklen, blot har jeg modificeret cellerne så de kan formateres som man vil (dette var overraskende nemt at gå til, og giver utroligt meget brugervenlighed ift. standarden).

    3) Fra table-view kan man gå til detaljeret view, hvor man kan nogle ting. Dette var den proces der voldte størst besvær, indtil jeg fandt ud af, at man kunne gøre tableview mindre end hele skærmen og på den måde få plads til andre ting (jeg ikke kunne finde ud af at putte i en celle).

    4) Info-view, som er såkaldt modalView. Dvs. et view der kommer glidende nedefra når man trykker på en info-knap og glider tilbage igen bagefter.

    Resume: Ud fra artiklen har jeg med små modifikationer kreeret en app der kan sælges i App Store. Jeg har stort set arbejdet i døgndrift, men jeg er blevet meget klogere udi iPhone-udvikling så det er prisen værd. Jeg har stadig mange ideer, der inkluderer tableView og xml-feeds så jeg udforsker det videre.

    25. februar 2009 @ 01:41

  • Benjamin

     

    Jeg er helt ny med al programmering har fulgt med i artikelserien.

    Det jeg har brug for er en liste en søgemaskine (som søger fra listen) og link til en ny side med tekst fra listen. Det er meget simpelt jeg kan bare ikke finde ud af det.

    Jeg ville være meget taknemlig hvis jeg kunne få hjælp.

    25. februar 2009 @ 10:47

  •  

    @Benjamin

    Jeg er netop ved at lave det du efterspørger, jeg skal se om jeg har tid til at lave en tutorial, men den bliver jo ikke klar de første par dage. Jeg overvejer det lige, men jeg kunne evt. tage over når Mikkel sidste artikel kommer på fredag, dvs. starte næste fredag.

    Vi kunne også alle sammen lave en app i fællesskab, dvs. at vi samarbejder om at udvikle et færdigt program.

    /martin

    25. februar 2009 @ 11:26

  • Benjamin

     

    lyder godt :)

    jeg har næsten alt andet klar så glæder mig meget til hvordan det kommer til at se ud.

    25. februar 2009 @ 16:17

  • Benjamin

     

    Der er en tig jeg godt vil vide. Kan det godt lade sig gøre at lave et program til app store, udgive det og alt uden at der er nogle udgifter?

    25. februar 2009 @ 19:31

  •  

    @Benjamin

    Det er ikke muligt at udgive en app uden udgifter, da man skal betale 99$ for en App Store licens. Men hvis din app er god, så bliver pengene jo hurtigt tjent ind igen :)

    25. februar 2009 @ 21:14

  • Benjamin

     

    Ok kan man så have så mange programmer man vil og er der tidsbegrensnig på licensen ?

    25. februar 2009 @ 22:05

  •  

    Man kan udgive ligeså mange apps man vil, de skal dog godkendes af apple.

    De 99$ dollars gælder for et år….der er pt ikke nogen der ved hvad der sker når det år er gået….

    25. februar 2009 @ 22:59

  • Benjamin

     

    Det er da ik så fedt hvis man ikke når at tjene det hjem. Men så tror jeg at jeg venter til jeg har 2 programmer klar før jeg køber licens. Det er jo ikke noget vildt togtidsprogram der bare sælger helt vildt, men bare noget simpelt. Så er det ik sikkert der er så mange som vil købe det selvom jeg selv ville gøre det.

    25. februar 2009 @ 23:49

  •  

    Benjamin,

    hvis du laver noget til det internationale marked er der ret stor sansynlighed for at du kan sælge et par hundrede apps…

    26. februar 2009 @ 10:59

  • Benjamin

     

    Ja det kan godt vare den bliver oversat til svensk og engelsk. (er halv svensker)

    Der er heller ikke nogen lignende app, ikke hvad jeg kan finde i hvert fald. Det øger vel salget lidt

    Martin
    Hvormang periodiske system har du solgt?

    26. februar 2009 @ 14:42

  •  

    Hvis man gerne vil lave sådan en for andre hvor man kan se news fra andre sider hvordan gør man så med den hvor der står php til sidst hvor finder man den fra andre sider håber i forstår hvad jeg siger?

    21. marts 2009 @ 14:52

  • Søren Høvring

     

    Hej med dig Mikkel..

    jeg er vildt begejstret over denne serie, endelig kan vi der har meget stor interesse få lidt viden om det, jeg synes SDK’en er en meget stor ting at begive sig ud i, men jeg har nogle spørgsmål faktisk en del.. håber du har lyst til at svare dem i alt almindelighed:

    1. Kan du fortælle mere om hvordan man benytter sig af alle de API moduler apple giver os mulighed for at bruge?
    2. Har du lyst til at vi afholder et lille bette arrangement, evt. hvor du fortæller lidt om programmeringen? Og at vi leger os lidt frem og tilbage, dette kunne være enormt skægt, og især hvis vi kan lære noget af hinanden, selvom det i første omgang nok er dig der skal lære os andre noget ;)

    Vedr. Itog

    Så synes jeg virkelig det er en fed app, desværre virker den ikke mere på vores 3.0, men jeg vil meget gerne vide hvordan du har lavet den, ikke at du skal sige hvordan du har kodet den, men er meget interesseret i at vide om du har en aftale med rejseplanen.dk eller om du bare henter data derfra?/hvordan du gør det? Via hvad(XML ?)? Eller om det er gratis og kan benyttes af alle osv.osv.osv.? Hvordan og hvorledes?

    30. marts 2009 @ 19:45

  • Brian Andersen

     

    Kan se det er lang tid siden nogen har skrevet noget, men håber der stadigvæk er nogen derude :)
    Jeg har samme spørgsmål som Søren Høvring.:

    Citat:
    men jeg vil meget gerne vide hvordan du har lavet den, ikke at du skal sige hvordan du har kodet den, men er meget interesseret i at vide om du har en aftale med rejseplanen.dk eller om du bare henter data derfra?/hvordan du gør det? Via hvad(XML ?)? Eller om det er gratis og kan benyttes af alle osv.osv.osv.? Hvordan og hvorledes?
    Citat slut:
    Nogen der kan forklare dette. Hvordan henter i data?

    12. november 2010 @ 10:57

Skriv en kommentar

For at kommentere skal du udfylde navn og mailadresse. Du kan også oprette en profil på siden. Du finder registreringsformen nederst i sidebaren i højre side (klik på "Opret").