Posted: June 6th, 2010 | Author: anders | Filed under: iphone | Tags: c, iphone, objective-c, strängar, strings, xcode | No Comments »
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.
Posted: May 17th, 2010 | Author: anders | Filed under: iphone | Tags: apple, iphone, notifications, objective-c, push | No Comments »
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);
Posted: May 14th, 2010 | Author: anders | Filed under: iphone | Tags: coredata, iphone, objective-c, xcode | No Comments »
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.
Posted: May 14th, 2010 | Author: anders | Filed under: iphone | Tags: iphone, json, objective-c | No Comments »
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.
Posted: April 20th, 2010 | Author: anders | Filed under: iphone | Tags: iphone, iphone sdk, objective-c, xcode | No Comments »
Här kommer ett kort tips för att snabbt få rundade hörn på bilder i din app. Börja med att importera QuartsCore:
#import <QuartzCore/QuartzCore.h>
Sen räcker det med följande kod:
[imageView.layer setMasksToBounds:YES];
[imageView.layer setCornerRadius:5.0];
Posted: April 17th, 2010 | Author: anders | Filed under: iphone | Tags: iphone, iphone sdk, objective-c, xcode | No Comments »

iPhone-appar med många bilder som kanske uppdateras under utvecklingsarbetet kan ställa till det. Det finns två metoder i XCode för att hålla reda på resurser – antingen med mappreferenser eller enkelt grupperat – båda medför problem. Särskilt när du uppdaterar redan existerande bilder.

Efter att manuellt ha lagt till eller tagit bort filer hittade jag den här artikeln på majicjungle.com som innehåller en smidig lösning. Det går ut på att du lägger till ett skript som körs varje gång du kompilerar. Scriptet kör bara en “touch” på resurskatalogen med exempelvis bilder, vilket leder till att XCode ser att katalogen är uppdaterad och tar med den nya versionen i bundle:n.
För att lägga till scriptet så behöver du bara:
- Högerklicka på din target, välj “New Run Script Build Phase” enligt bilden ovan.
- Byt shell till tcsh och gör en touch på din resurskatalogs sökväg, baserat på var den ligger i förhållande till projektfilen (se bild). I mitt fall lägger jag dem oftast i samma katalog och skriver därför följande: touch -cm ${SRCROOT}/Resources
- Flytta ordningen så att scriptet körs först av allt i the build phase (se bild).

- Klart!
För mig fungerade det här klockrent både vid skapande och uppdatering av bildresurser. Hur fungerar det för er? Ni kanske har något annat tips?