Semi-localization

Skrevs: June 6th, 2010 | Av: anders | Kategori: iphone | Taggad: , , , , , | Inga kommentarer »

För att byta mellan set av strängar kan du antingen göra en fullfjädrad localization. Ett alternativ att använda hantera strängar och språk manuellt i appen. Du kanske bara vill hantera olika sträng-set på ett överskådligt och uppdelat sätt.

Skapa en strings-fil:

Välj New File -> Strings File och döp filen till något du känner igen. Om det handlar om att separera språk så kan du exempelvis kalla den se.strings eller en.strings.

Sen fyller du på med nycklelvärden och strängar enligt:

/* se.strings */

/* urlar */

“baseurl” = “http://www.någonurlfördethärspråket.com”;

/* base menu */

“start” = “Hem”;

“settings” = “Inställningar”;

Notera semikolon i slutet av varje rad.

Hämta ut strängar från strings-filer:

Om du sedan vill hämta ut någon sträng – exempelvis “start”-strängen vilken ska översättas till “Hem” (i från ovan fil som heter se.strings) använder du bara:

NSLocalizedStringFromTable(@”start”, @”se”, nil);

Det första värdet är alltså namnet på “nyckeln”, det andra vilken fil, eller tabell, du vill läsa ifrån.


Hultsfredsappen släppt

Skrevs: June 2nd, 2010 | Av: anders | Kategori: iphone | Taggad: , , | Inga kommentarer »


Push-notiser

Skrevs: May 17th, 2010 | Av: anders | Kategori: iphone | Taggad: , , , , | Inga kommentarer »

Du kan skicka med vilka parametrar du vill i dina push-notiser.  Förutom badge-nummer, notisljud och notistext kan du skicka med extra-data som din app kan plocka upp i det NSDictionary-objekt som du tar emot via:

-(void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {

NSLog(@”Got values: %@”, [userInfo allValues]);

}

Eller  när programmet startar, triggad av en push-notification:

-(BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

application.applicationIconBadgeNumber = 0;

NSDictionary *userInfo = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

NSLog(@”Got values: %@”, [userInfo allValues]);

}

Exempelvis så skapar jag min JSON-array på följande vis med php:

$body['aps'] = array(’alert’ => $message);
if ($badge)
$body['aps']['badge'] = $badge;
if ($sound)
$body['aps']['sound'] = $sound;
$body['band'] = array();
$body['band']['id'] = “9″;

$body['aps'] = array(’alert’ => $message);

if ($badge)

$body['aps']['badge'] = $badge;

if ($sound)

$body['aps']['sound'] = $sound;

$body['extrainformation'] = array();

$body['extrainformation']['data1'] = “Extra sträng”;

json_encode($body);

Override på en Coredata-objekt setter

Skrevs: May 14th, 2010 | Av: anders | Kategori: iphone | Taggad: , , , | Inga kommentarer »

Om du skapat ett Coredata-objekt med en uppsättning attribut och automat-genererat en klass kan det hända att du vill ändra en set-funktion. I mitt fall ville jag exempelvis nyligen uppdatera “tid för senaste updatering” samtidigt som jag favorit-markerade ett objekt.

I och med att alla Coredata-attribut är @dynamic kan du inte sätta värden som om det vore en vanlig @property utan du använder dig av Key Value Coding:

-(void) setFavourite:(NSNumber *) newFav {

[self willChangeValueForKey:@"favourite"];

[self setPrimitiveValue:newFav forKey:@"favourite"];

[self didChangeValueForKey:@"favourite"];

[self timestamp];

}

Det viktiga här är, för det första, att du använder willChangeValueForKey och didChangeValueForKey. Sen kan du använda setValue: forKey: vilket jag fått att fungera för NSString-attribut, men inte för NSNumber – så använd setPrimitiveValue: forKey: istället. Vad jag förstått är det generellt att föredra.

Då vi ändå är inne på key values så tänkte jag tipsa om key-paths. Letade rätt på en bloggpost som visar lite saker du kan använda det till – exempelvis smidigt söka igenom en NSArray eller NSDictionary.


iPhone och JSON decoding tips

Skrevs: May 14th, 2010 | Av: anders | Kategori: iphone | Taggad: , , | Inga kommentarer »

Hade en app som fungerade perfekt med  SBJSON-encoder/decoder (som jag har sett och hört fler använda med goda resultat). Det har varit så för mig väldigt länge…

MEN… Helt plötsligt fick jag felmeddelanden utan att ha ändrat någon närliggande kod. Det klagades på att key-values inte var rätt separerade osv.

Det verkar som att den decodern inte klarar av för långa strängar och när json-flödet växte så gav den upp. Jag hittade istället TouchJSON vilken fungerade perfekt. Decodar på följande vis:

NSString *jsonString =[[NSString alloc] initWithString:collectedDataString];

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding];

NSError *error = nil;

NSDictionary *res = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];

Touch JSON finns att ladda ner här.

Efter ytterligare läsning hittade jag även YAJL som i olika tester verkar vara snabbast av de tre.

**

Numera använder jag bara YAJL då den gett bäst prestanda och har aldrig haft några problem.


XCode och resurser igen

Skrevs: April 26th, 2010 | Av: anders | Kategori: iphone | Taggad: , , , , | Inga kommentarer »

Efter att ha rensat upp och strukturerat om min projektfil och tillhörande resurser slutade mitt projekt helt plötsligt att fungera. Det enda felmeddelandet jag fick upp var:

Failed to launch simulated application: Unknown error.

Efter att ha spenderat någon timme med att lista ut varför, kollat /var/log/system.log och googlat inser jag att många har haft samma problem, men inte alla hittar lösningen. Vanligtvis kan det räcka med att tömma cache:n i XCode eller reset:a iPhone Simulator, men i mitt fall räcker det inte.

Vad löste då problemet?

Jo, det var så enkelt som att vissa mappnamn inte är okej. Jag hade först döpt en resurs-mapp, som använder sig av folder-references, till Resources och därefter ExternalResources – båda vållade problem. Sen döpte jag mappen till samma namn som appen vilket också gav problem tills jag slutligen valde namnet Material. Och helt plötsligt fungerar projektet precis som det ska.

Konstigt att XCode inte kan ge ett korrekt felmeddelande när man försöker kompilera och testköra, men nu vet jag åtminstone att jag inte ska döpa externa resursmappar till något med resources eller något som innehåller app-namnet.


Adobe Flash och iPhones på MWC Barcelona

Skrevs: February 16th, 2010 | Av: anders | Kategori: Flash, iphone | Taggad: , , , , | Inga kommentarer »

Adobe-mwc

MWC har kickat igång och i och med Adobes satsning på mobilplattformar, senast iPhone var de självklart på plats. Med min bakgrund som flashutvecklare är Adobe:s iPhone-satsning självklart intressant att hålla koll på. En av de som arbetar med iPhone och mobil-exporten i största allämnhet var där och jag passade på att fråga ut honom.

Tydligen har Adobe c:a 400 flashutvecklare som just nu  testar deras iPhone-inriktning. Och till skillnad från vad man kan se på Adobe:s hemsida menade han bland annat att det just nu finns 40 st appar på AppStore som är gjorda via Flash, fast de har inte rätt att publicera namnen på dessa på adobe.com. Det är intressant! Jag skulle gärna veta vilka fler appar som gjorts och se om de är bättre än de exempel som finns på adobe.com.

Adobe iPhone Export

Jag frågade även om prestandan och tog upp att jag inte var helt nöjd med prestandan på de spel jag sett exporterade till iPhone och provat på en 3G. Han höll med men tillade att samma spel flyter bättre på exempelvis en Android-telefon, samtidigt han även sa att de jobbar vidare med optimering samt koppling till iPhone:s GPU. iPhone-exportmöjligheter kommer finnas i Flash CS5, men han sa att det kommer vara beta-stadie även på det och han ville inte ge någon tidsram för när systemet kan anses vara komplett. Adobe arbetar även på ett white paper för optimering rent generellt som ska underlätta för utvecklare att skriva hårdare optimerade program och spel.

Har inte sett det här själv förut men såhär ser export-rutan ut. Du behöver alltså bara fylla i dina grunduppgifter från iPhone Developer Programme, lägga in certifikatet och sen exporteras en färdig app. Att kompilera direkt till telefonen kommer inte fungera, men allting förbereds så att det bara är att dra och släppa till iTunes för att installera på din iPhone.

Passade även på att kolla in källkoden på ett av programmen som använde multi-touch och jag måste spontant säga att det såg ganska enkelt ut att programmera.

När jag frågade vad han trodde om Flash för iPhone sa han bland annat att han förstår att Apple inte vill ta in Flash av strategiska skäl.

Adobe demonstration

Adobe iPhone Export


”Världens första” iPad-app

Skrevs: February 6th, 2010 | Av: anders | Kategori: Sociala Medier, iPad | Taggad: , , , , , , , , , , , , , | 2 kommentarer »

Anders Färdigh iPad App

I samband med iPad-vakan på Carnaby förra veckan kodade jag snabbt ihop en app, så fort den nya utvecklingsmiljön släppts för allmänheten. iPad-appen visade en bild på mig i röd mössa och en adress till min hemsida – något som vanligtvis inte imponerar på någon.

På plats var dock iPhone24 som bevakade eventet och bilder på min kreation lades upp med formuleringar som ”Världens första iPad-app är svensk” och ”den redan nu legendariska appen”. Allting med glimten i ögat såklart.

Redan på kvällen började det spridas på twitter och när jag vaknade dagen efter och som vanligt började med att kolla twitterflödet ser jag retweets och mentions. Jag blev dock väldigt förvånad då mitt namn så småningom dök upp i flödet tillsammans med MacWorld, som publicerat en artikel med rubriken ”Svensk ligger bakom första iPad-appen”.

Jag blev ännu mer förvånad när även Metro Teknik ringer upp mig samma dag för en intervju – en intervju som publicerades i onsdags med rubriken ”Svensken som gjorde första appen till iPad”.

De senaste dagarna har jag blivit gratulerad till den lyckade PR-kuppen, vilket är väldigt roligt, men det roligaste för min egen del är att “PR-kuppen” var lika oplanerad som utfallet var oväntat.

Huruvida det tillhör världens första kompilationer kan ifrågasättas. Det mest intressanta i min mening är dock att en sån här, till synes ointressant, app kan få spridning och även nå traditionella medier. Detta skulle dels kunna visa på det enorma intresset för iPad. Men det bekräftar framförallt att journalister, på ett annat sätt än tidigare, bevakar vad som bedöms vara intressant genom att hålla koll på aktiviteter inom sociala medier.

Avslutningsvis, var detta en väldigt rolig vecka för en utvecklare som vanligtvis inte syns så mycket i medier. Nästa gång det händer hoppas jag dock kunna visa upp en app som i sig är imponerande.

Relaterade länkar