Kategoriarkiv: Utveckling

Inlägg med kodningstips och annat som har med mjukvaruutveckling att göra.

Recepten.se för iPhone – nu i App Store

På tredje försöket blev recepten.se för iPhone godkänd av Apple och finns nu i App Store. 🙂

Som jag tidigare berättat om så är det inte bara att göra en mobilsajt och kapsla in den och tro att Apple ska godkänna den.

För att bli godkänd krävs att man använder ”tillräckligt” många iOS features. Nu har jag alltså äntligen lyckats med denna bedrift! 🙂

Anledningen till att jag inte valt att implementera appen native fullt ut och istället gjort denna hybridlösning är för att spara tid.

Nu är m.recepten.se inkapslad i både appen för iPhone och appen för Android-mobiler.  Användarna har nu 3 möjligheter:

  1. Surfa in på m.recepten.se
  2. Ladda ner appen för iPhone i App Store.
  3. Ladda ner appen för Android i Google Play.

Fördelar för mig är att det är enkelt att uppdatera. För det mesta kommer det räcka för mig att uppdatera m.recepten.se och jag behöver inte heller lägga tid på att bygga nya versioner av apparna och lägga upp i App Store och Google Play.

Nackdelar är förstås att native appar har snabbare responstid och är snyggare. Men jag tror ändå att det här är bästa lösningen för recepten.se i mobilt format.

Så vad händer närmast framöver? Jag kommer uppdatera m.recepten.se så den blir snyggare och får fler funktioner och mer innehåll!

Android Licensing

Jag har nu implementerat Android Licensing i Poworkout Trim & Tone för Android.

Det var faktiskt ganska lätt och tog inte mer än någon timme plus en timme att testa. Även om texten är lång att läsa så är det inte så mycket konkret man måste göra och det finns exempelkod som man kan plocka nästan rakt av.

Något som är bra att veta är att testkonton inte beter sig på samma sätt som riktiga konton, cachning fungerar inte.

Nu hoppas jag bara att detta ska fungera som utlovat och att användare som betalat inte kommer drabbas av att inte kunna använda appen för det vore förstås förskräckligt. Om det händer får jag göra om.

Anledningen till att jag implementerat detta är för att jag inte vill att appen ska spridas hur som helst och var för lätt att installera och använda utan att betala.

Resultatet av 24 hour business camp

Snart kommer PoWorkout Stretch till App Store!

Läs gärna mer om vad som hände under de 24 timmarna av utvecklingen av Poworkout Stretch!

24 hour business camp var även denna gång fantastiskt trevligt och jag hoppas jag får vara med vid fler tillfällen! Hoppas att detta kommer arrangeras oftare! Tack alla arrangörer och deltagare! Vilken atmosfär, vilken inspiration!

 

Polymorphic one to many relationships in Hibernate

Sprang på detta tillkortakommande i Hibernate.

Om man har en klass som är en subclass till en abstract class. Om den abstrakta klassen har en koppling till en annan klass, då kan man inte göra en query som innehåller denna koppling och samtidigt få ut en resultatlista med objekt av subklassen.

Min lösning var att lägga in kopplingen även i subklassen, både i modellen och databasen. Det fungerar. Datan blir duplicerad men man kan ju i datamodellen se till att de båda värdena håller sig intakta.

Nedan är länkar till informativa artiklar i ämnet:

Hur man bygger en enkel app för Android och iPhone av en webbsajt

Om man har en webbsajt i anpassat mobilformat så kan man enkelt kapsla in den i en Androidapp. Det är vad jag har gjort med min Android-app för recepten.se

recepten.se
Recepten.se mobilapp

Enklare än så blir det inte. 🙂

På motsvarande sätt kan man göra för iPhone, MEN Apple godkänner oftast inte appar som bara kapslar in en webbsajt. De faller på punkt 12.3 i App Store Review Guidelines (som man måste vara inloggad på Apple för att kunna läsa verkar det som). Nedan är ett utdrag:

2. Scraping and aggregation

  • 12.1

    Applications that scrape any information from Apple sites (for example from apple.com, iTunes Store, App Store, iTunes Connect, Apple Developer Programs, etc) or create rankings using content from Apple sites and services will be rejected

  • 12.2

    Applications may use approved Apple RSS feeds such as the iTunes Store RSS feed

  • 12.3

    Apps that are simply web clippings, content aggregators, or a collection of links, may be rejected

Och där har ni anledningen till att recepten.se inte har någon app för iPhone i App Store än så länge! 🙂

Naturligtvis kan man ifrågasätta nyttan med en sådan app och jag förstår att Apple inte godkänner dessa rakt av.

 

Glöm inte f:view

Nu har jag äntligen kommit på varför inte Twitterflödet visats på poworkout.com när man surfar med Chrome.

Lösningen är att inte glömma f:view! Detta gäller både JSF 1 och 2.

Så här ska strukturen se ut.

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:view contentType="text/html">
<h:head>
</h:head>
<h:body>
</h:body>
</f:view>
</html>

Utan f:view så tolkar webbläsare som använder webkit (Chrome, Safari) innehållet som application/xhtml och då renderas inte allt som det ska.

Så glöm inte f:view contentType=”text/html” när du bygger webbsajter i JSF (Java Server Faces).

urlrewrite redirect url-parametrar

Jag använder tuckey.org urlrewritefilter på mina sajter. Jag satt igår och brottades med varför inte url-parametrarna följde med när filtret redirectade. Alltså susnet.se/xyz?id=1&type=test blev susnet.se/xyz efter att filtret gjort sitt.

Lösningen? Attributet use-query-string på urlrewrite-elementet! Default är alltså att klippa bort dessa parametrar.

use-query-string
(optional)
false (default) The query string will not be appended to the url that the ”from” element matches against.
true The query string will be appended to the url that the ”from” element matches against.

Så nu fungerar allt som det ska! 🙂

Spela upp ljud i iPhone

Idag har jag implementerat ljud de tre sista sekundrarna i iPhone-appen PoWorkout och tänkte dela med mig av lite kod:

Så här spelar man upp ett ljud som man själv laddar ner. wav går bra.


+(void) playSound {

//Get the filename of the sound file:
NSString *path = [NSString stringWithFormat:@"%@%@",
[[NSBundle mainBundle] resourcePath],
@"/sound.wav"];

//declare a system sound id
SystemSoundID soundID;

//Get a URL for the sound file
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];

//Use audio sevices to create the sound
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);

//Use audio services to play the sound
AudioServicesPlaySystemSound(soundID);
}

Om man istället vill spela upp ett ljud som redan finns i iPhonen så kan man använda följande kod

// Play one of the predefined sounds
NSString *path = @"/System/Library/Audio/UISounds/dtmf-1.caf";

Här finns en lista på alla ljudfiler.

Det är osäkert om man får använda de inbyggda ljuden i iPhone eller om det är emot Apples regler.

Om man vill att iPhonen ska vibrera behövs endast följande kod:

AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);

Om man vill detektera ifall användaren har iPhonen i ”Silent mode”, alltså ljudet avstängt så kan jag rekommendera att kolla här.