Archive of articles classified as' "iPhone"

Back home

iPhoneOS : Arkivera egna objekt

12/03/2010

Låt oss anta att vi vill designa en applikation som innehåller ett antal egendefinierade objekt.

Dessa behöver vi spara på något sätt, t.ex. när användaren stänger av applikationen eller om användaren skulle få ett telefonsamtal under tiden som applikationen körs.  Utifall att detta händer vill vi att applikationens variabler ska bevaras, och att även våra egendefinierade objekt ska sparas på samma sätt som andra inställningar sparas.

Att spara användardata är en återkommande punkt i de flesta iPhone-applikationer, och jag brukar använda NSUserDefaults för att på ett enkelt sätt spara och hämta data.

Data sparas på följande sätt


NSInteger intToSave = 23;

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

[preferences setInteger:intToSave forKey:@"keyToSavedInt"];

Och hämtas pÃ¥ följande sätt…


NSInteger intToRetrieve;

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

intToRetrieve = [preferences integerForKey:@"keyToSavedInt"];

I min mening det absolut smidigaste sättet att hantera användardata pÃ¥… det vill säga sÃ¥länge som man bara sparar Obj-C datatyper. Men om man däremot vill spara en array av egendefinierade typer, ja dÃ¥ blir det lite mindre smidigt.

Extra smidigt blir det om det dessutom är en hierarki av objekt.

Säg att vi har en applikation som ska hålla koll på lastbilar och deras last.

Låt oss använda en NSMutableArray för att hålla koll på alla lastbilar, och sedan definiera en klass för lastbilar, och en klass för last.

En näst intill pinsamt förenklad implementation av klassen Lastbil följer här.

Lastbil.h

#import <Foundation/Foundation.h>
#import "Last.h"

@interface Lastbil : NSObject {
	Last *last;
}

@property(nonatomic,retain) Last *last;

@end

Lastbil.m

#import "Lastbil.h"

@implementation Lastbil
     @synthesize last

-(id)init
{
    if (self = [super init])
    {
     //Init
		}

    return self;
}

- (void)dealloc
{
    [self.last release];
    [super dealloc];
}

@end

Och sÃ¥ lasten…

Last.h

#import <Foundation/Foundation.h>

@interface Last : NSObject {
	NSString *beskrivning;
}

@property(nonatomic,copy) NSString *beskrivning;

@end

Last.m

#import "Last.h"

@implementation Last

@synthesize beskrivning;

- (id)initWithBeskrivning: (NSString*)b
{
	self.beskrivning = b;
	return self;
}

- (void)dealloc
{
    [self.beskrivning release];
    [super dealloc];
}

@end

Ja nåt i den stilen. Blind kod och en knapphändig implementation, precis som det ska va.

Då är själva objekten deklarerade, det som återstår är att.. ja.. använda dem.

NSMutableArray *lastbilar = [[NSMutableArray alloc] init];

Lastbil *lastbil1 = [[Lastbil alloc] init];
Lastbil *lastbil2 = [[Lastbil alloc] init];

lastbil1.last = [[Last alloc] initWithBeskrivning:@"Fisk"];
lastbil2.last = [[Last alloc] initWithBeskrivning:@"Kött"];

[lastbilar addObject:lastbil1];
[lastbilar addObject:lastbil2];

[lastbilar release];

Då har vi en datastruktur som innehåller två lastbilar, den ena med fisk i lasten och den andra med gott, mört kött i lasten.

Om vi nu vill spara denna datastruktur till NSUserDefaults så skulle vi kunna göra det genom att först arkivera den till ett NSData-objekt med NSKeyedArchiver..

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

MEN detta är inte rumba, och kommer inte att fungera då våra egendefinierade objekt (Lastbil, Last) inte implementerar NSCoding protokollet. Alla objekt måste, om de ska kunna arkiveras, implementera metoder för hur de ska arkiveras och hur de ska avarkiveras. Enligt NSCoding måste alltså våra objekt implementera följande metoder.

- (void)encodeWithCoder:(NSCoder *)encoder
- (id)initWithCoder:(NSCoder *)decoder

Så låt oss implementera dessa metoder först i Lastbil.m. Det vi vill göra är att specifiera vilka av objektets egenskaper som ska arkiveras, och under vilka nycklas värdena ska arkiveras, detsamma för avarkivering.

- (void)encodeWithCoder:(NSCoder *)coder;
{
	[coder encodeObject:self.last forKey:@"last"];

}

- (id)initWithCoder:(NSCoder *)coder;
{
     if (self = [super init])
    {
		self.last = [coder decodeObjectForKey:@"last"];

	}
    return self;
}

…och sedan i Last.m

- (void)encodeWithCoder:(NSCoder *)coder;
{
	[coder encodeObject:self.beskrivning forKey:@"beskrivning"];

}

- (id)initWithCoder:(NSCoder *)coder;
{
     if (self = [super init])
    {
		self.beskrivning = [coder decodeObjectForKey:@"beskrivning"];

	}
    return self;
}

That’s pretty much it.

Nu går det bra att arkivera hela objekthierarkin, eftersom alla objekt i hierarkin kan arkiveras (NSCoder).

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

Och ett objekt av typen NSData går givetvis att spara till NSUserDefaults precis som motsvarande enkla datatyper.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSData *lastbilData = [NSKeyedArchiver archivedDataWithRootObject:lastbilar];

[preferences setObject:lastbilData forKey:@"Lastbilar"];

Och går att läsa tillbaka, med minimal ansträngning.

NSUserDefaults *preferences = [NSUserDefaults standardUserDefaults];

NSData *lastbilData = [preferences objectForKey:@"Lastbilar"];

	if (lastbilData != nil)
	{
		NSArray *gamlaLastbilar = [NSKeyedUnarchiver unarchiveObjectWithData:lastbilData];

			if (gamlaLastbilar != nil)
			{
				//Presentera information
			}
	}

Och så gör man alltså för att arkivera sina egna objekt!

Andra bloggar om: , , ,

1 Comment

iPhoneOS : Framerate independence

8/03/2010

Närsom man animerar ett objekt på egen hand (OpenGL) så måste man vara beredd på att saker och ting kan hända i resten av operativsystemet under tiden som animeringen pågår. Detta leder då till osmakliga hack i de annars så vackra rörelsemönstren.

För att lösa detta gör jag två saker.

1. Sätter upp en ”target” framerate som är referens vid alla beräkningar.
2. Räknar ut skillnaden mellan faktisk framerate och target-framerate och multiplicerar alla rörelser på skärmen med detta värde.

NÃ¥got i denhär stilen…

- (void)render {

NSDate *startDate = [[NSDate date] retain];

float wantedTime = 0.025; //Target framerate = 40 fps, dvs 1/40

/*
Rendering sker här, vi använder mätvärde från föregående frame för rörelsekompensation
*/

self.speedFactor = [[NSDate date] timeIntervalSinceDate:startDate] / wantedTime;

}

Alla rörelser multipliceras sedan med speedFactor, såsom


obj.Ypos = (sin(obj.direction*(M_PI/180))*BSPEED) * self.speedFactor;

Inga fler hack när iPhoneOS kollar din mail, uppdaterar din plats eller skickar hemliga data till Steve Jobs medan du spelar!

Andra bloggar om: , , , ,

No Comments

SDK Beta 2 ute.

28/03/2008

sdk Beta 2 ute.Apple lanserar nu iPhone SDK Beta 2, som bland annat innehåller en uppgraderad Interface Builder där man kan skapa interface till iPhone precis som man kan till vanliga OS X Program, samt en näve ny exempelkod. Riktigt gött.

Nästan lika gött som att man, trots att Apple förnekar detta, fortvarande kan installera och köra SDK:t pÃ¥ en PPC Mac 🙂

Mer info på ADC och en liten changelog här(kräver konto på ADC)

Andra bloggar om: , , ,

No Comments

iPhone SDK har anlänt!

6/03/2008

På tiden! för bara några timmar sen släpptes alltså SDK:t. Mer officiell information på iphone.com och inoficiell information på TUAW samt Macrumors

Intressant just nu är:
* Gratis SDK
* 99$ för utvecklingslicens
* Programdistribution via Itunes (Utvecklaren får 70% av priset vid försäljning)

Väldigt mycket rykten och löst snack just nu, men det som verkar säkert iallafall är följande:
* Firmware 2.0 till Juni (Gratis för iPhone, liten kostnad för iTouch)
* Exchange/ActiveSync i 2.0
* SDK släpps idag (dock är sidan överbelastad för tillfället, lite problematiskt att ladda ner)
* Spore för iPhone demonstrerat på SDK eventet (!)
* SDK endast för OS X

Hoppas kunna lägga vantarna på SDK:n under helgen iallafall, så man kan börja knacka lite kod

Det jag personligen är mest överraskad av är stödet för Embedded OpenGL och OpenAL, ska bli kul att försöka sig på att porta lite gamla projekt.

Andra bloggar om: , , ,

No Comments

iPhone & iPod Touch 1.1.4

26/02/2008

Spännande dag! först nya MacBooks, och nu såhär på kvällskvisten även en ny mjukvara till iPhone/iTouch. Inga nya funktioner vad jag kan se såhär direkt, verkar bara va en del buggfixar. Var medveten om att dina installerade program ryker all världens väg om du uppdaterar en jailbreakad enhet!

Men misströsta ej! det verkar som om ZiPhone Jailbreaken för 1.1.3 fungerar även på 1.1.4. Jailbreakar min Touch samtidigt som jag skriver detta och Installer verkar fungera bra. Bara att installera alla program igen.

Läs här för mer info

Andra bloggar om: , , , ,

No Comments

Topp 5 iPhone & iPod Touch Applikationer: Tema Nätverk

15/02/2008

Då var det dags för en ny lista med intressanta applikationer för iPhone/iTouch. Denna gång ska jag fokusera lite på nätverks-verktyg, och då främst säkerhetsrelaterade sådana. Som bekant har ju båda enheterna 802.11b/g wlan, och det innebär att det finns möjlighet för en del hyss! Även om det ännu inte är möjligt att sätta wlan-interfacet i monitor mode, så skadar det ändå inte att vara medveten om möjligheterna som framtiden bär med sig.

Alla dessa applikationer kräver som vanligt en jailbreakad iPhone/iTouch, och ytterligare program såsom vt100-term, sysinfo, sshd och så vidare, inget som inte går att googla sig till.

DÃ¥ ska vi se..

1. Ngrep

Ngrep i fickformat. Otroligt smidigt litet verktyg för nätverksövervakning/felsökning. Bara att dumpa ner all trafik när man är ute och far för att sedan analysera den med t.ex. Wireshark. Läs mer om hur man använder ngrep här.

2. Nmap

Ingen mobil nätverksplattform utan en portscanner. Fungerar precis som ”vanliga” nmap, inga konstigheter här.

3. Stumbler

Ett verktyg för att hitta trådlösa accesspunkter. Väldigt grundläggande funktionalitet än så länge, men det gör sitt jobb väl. Perfekt för att kartlägga räckvidden på grannens trådlösa nät.

4. Metasploit

Det här är nästan lite skrämmande, men ja, det går att installera Metasploit på din iPhone/iTouch :D. Det är dock inte helt lätt, och det kräver att man har bland annat perl installerat. Men i korta drag går det till såhär:
Ladda först ner framework 2.7
Packa upp, ladda upp till iPhone/iTouch i t.ex. /var/root och sätt chmod 755 pÃ¥ alla filer i katalogen. Kör sedan ”msfweb&”, starta Safari och surfa in pÃ¥ ”http://127.0.0.1:55555” :). Om Safari kraschar är det bara att starta om det.

4. CoreOS Network Tools

Som en påse gott och blandat. En liten samling av allt man behöver för att förvandla sin iPhone/iTouch till en riktig liten bärbar nätverksmaskin. T.ex. BitchX, wget osv.

Andra bloggar om: , , , , ,

No Comments

iAno, piano för iPhone & iPod Touch

14/02/2008

Haha detta är ju helt underbart. Trodde jag hade sett allt efter Pocket Guitar, men icke.

Skåda det senaste inom mobil musik!:

Ett litet smakprov av vad vi har att vänta när det officiella SDK:t lanseras!
Mer information over here. Kräver som vanligt en Jailbreakad iPhone/iTouch.

Andra bloggar om: , , ,

No Comments

Topp 5 iPhone & iPod Touch Applikationer

31/01/2008

Efter att ha inhandlat en iPod touch och av misstag uppgraderat den till version 1.1.3 bestämde jag mig för att nergradera och jailbreaka den och gräva runt lite bland tredjeparts-applikationer. Till slut och efter mycket om och men lyckades jag uppgradera från 1.1.1 till 1.1.3 jailbreak, och efter några dagars användande kommer här mina absoluta favorit-applikationer.

1. Installer

Helt klart den bästa applikationen enligt mig. Det enda sättet att installera andra applikationer utan att behöva uppsöka psykolog efteråt. Enkelt att lägga till nya källor, enkelt att installera nya applikationer, enkelt att uppdatera befintliga applikationer och enkelt att avinstallera applikationer. Vad mer kan man begära?

Installer

2. MobileScrobbler

ÄNTLIGEN! Den funktion jag saknade mest på min 3 år gamla iPod Nano! Ett sätt att få över låtar man har spelat i iPoden till Last.fm utan att behöva strula runt med Last.fm klientens enormt osmidiga iPod-funktionalitet. Och inte nog med det, är man ansluten till internet kan man även lyssna på musik via Last.fm precis som med den vanliga klienten. Fullspäckad med roliga och bra funktioner, och dessutom möjlighet att köpa musik från iTunes Store direkt! Fantastiskt!

MobileScrobbler

3. SysInfo

Behöver du starta om din iPod snabbt? Eller kanske bara starta om springboard? Varför inte undersöka vilka processer som är aktiva, eller till och med ändra prioriteten på dessa? Vill du veta hur mycket minne som finns ledigt? Eller vill du kanske bara veta hur hårt du behöver skaka din iPod för att toppa accelerometern?
Sysinfo gör allt detta och lite till, och ger användaren en efterlängtad översikt över vad som egentligen pågår i dendär lilla prylens hjärna.

Sysinfo

4. OpenTTD

Ett av tidernas bästa spel i fickformat! Ta en stund och bygg dendär rälsen som du så länge velat bygga mellan Fnortington och Oggbyville. En given klassiker som till och med har multiplayer-stöd. Det enda som saknas är egentligen ljudet, men enligt utvecklaren kommer även det att dyka upp i framtida versioner. VARNING det är näst intill omöjligt att spela detta spel för tillfället på grund av att ett medelstort finger är stort nog att trycka ner ungefär 3,2 knappar samtidigt, men misströsta ej, nya metoder att styra muspekaren på är under utveckling!.

OpenTTD

5. iPhysics

Fantastiskt rolig spelmotor med hundratals olika spel och banor att välja emellan. Allt från flipper till gud vet vad. Det roligaste är att man kan påverka spelet genom att kasta runt och luta enheten åt olika håll, eller genom att rita en boll som kan sedan kastar iväg med fingret. Har inte haft tid att spela igenom ens en bråkdel av utbudet vad gäller iPhysics, och frågan är om jag någonsin kommer hinna det! Helt klart ett roande spel med oändliga möjligheter.

iPhysics

Andra bloggar om: , , , ,

No Comments