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.


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.