Code, Code, Revolution!
Unlike much of the work I’ve publish here which is proof of concept or “building blocks” for applications, this is the complete source for a real application that you can download on AppStore for free. If you want to check out the application you can get it through iTunes/AppStore. The source can be downloaded at the end of this post, as usual.
Mitt Saldo, or “My Balance” if translated, is an iPhone application for the swedish banks Swedbank, Nordea, ICA Banken and Handelsbanken. All of these banks has already released their own official iPhone apps or web based apps some time ago and I’ve personally used Swedbanks application a lot. These “applications” however are nothing more than browser wrappers and provide no or little additional functionality compared to their iPhone adapted web based internet banks. In fact, most of them have just thrown in a UIWebControl and pointed the start url to their internet banks. This has obviously been a successful stunt and rightfully so, it’s not obvious to everyone that you can create a shortcut to their sites directly through iPhones Safari browser.
The main reason for creating Mitt Saldo is that I personally found the process of checking the balance on my credit card account way time consuming. I’m one of those that still worry about getting my credit card information stolen through various internet sites or skimmers so I keep a minimal amount of money on that account. Instead I transfer money to the account whenever needed, this could be 2-3 times per week depending obviously on what I’m purchasing. The big hustle with checking the balance is that you have to enter your credentials every time. Thankfully Nordea, Handelsbanken, ICA Banken and Swedbank have a simplified credentials solution where no additional smart cards or hardware is involved, unlike some other swedish banks who obviously doesn’t understand that the basic idea of using a phone is that it should be simple and reasonably fast.
Mitt Saldo use screen scraping techniques that enable users to store their credentials in the application instead and let the application authenticate with the existing web based internet bank.
It appears that both Nordea and Swedbank use the same platform for their internet banks because the authentication scheme is identical. Handelsbankens authentication scheme differs and is more sophisticated than Nordea and Swedbank. ICA Banken utilize Microsoft ASP.NET which requires some extra work for post-backs to work.
Authentication for these two banks is more or less identical and very simple. There’s a login form, post credentials to that form, get a cookie back as proof of a successful authentication. There’s only one mechanism thrown in to complicate things. The login-form contains a hidden field named “_csrf_token” with a value that is generated every time the page is fetched using GET. Try it yourself: https://mobilbank.swedbank.se/banking/swedbank/login.html. To authenticate with Swedbank/Nordea you need to perform the following:
That’s all! Both Nordea and Swedbank use XHTML-markup which is ideal for parsing out the interesting bits of information. However, Swedbanks pages doesn’t validate (shame on you)!.
As I was completing Mitt Saldo, Handelsbanken released their iPhone adapted webbank and I was expecting them to release a similar web-based iPhone app as the rest of the banks shortly after. My lovely girlfriend is a Handelsbanken customer so I decided to add support for Handelsbanken as well. It turned out that Handelsbanken made an effort with their application and released a real Cocoa-app. Kudos to them! Their application use a hidden web service API which I havn’t been able to (ab)use, unfortunately. Perhaps I can provide more details on that later. Instead Mitt Saldo use their existing iPhone-adapted web based application. The authentication scheme is much more sophisticated than Nordea/Swedbanks solution which made it quite a challenge to implement.
All requests to m.handelsbanken.se is redirected this way unless valid cookies are also passed along with the requests.
Handelsbanken has additional mechanisms for validating cookies against user-agent identifier. If you get ahold of the cookies using one user-agent string and try to use them in another request with a different user agent string the cookies are rejected with a redirect to europe.ipx.com as a result. This is important because UIWebView has a different user agent string depending on iOS version and NSURLRequest defaults user-agent to the name of your application. To be able to use the cookies retrieved using NSURLRequest in UIWebView you must make sure the NSURLRequest pass the exact same user-agent string as UIWebView for the specific phone.
Very smart, Handelsbanken!
A bit more work than Swedbank/Nordea and much slower since we need to request additional pages to get what we want, but nothing is impossible!
ICA Banken was actually first in Sweden with an iPhone adapted web based internet bank, kudos! They have not released an application that work as a shortcut (like Swedbank/Nordea), unless they are really developing a real application they should! ICA Banken doesn’t present any sophisticated mechanisms to make screen-scraping harder the two challenges are:
Authentication starts here: https://iphone.icabanken.se/login/login.aspx, it’s a straight forward page with two input fields named:
pnr_phone (SSN/Personnummer)
pwd_phone (password)
But as mentioned above, this is an ASP.NET solution. ASP.NET works differently than most platform because they utilize hidden fields to pass information between the server and the browser. It’s not possible to do a straight “POST”-request to the login page and just pass the parameters pnr_phone and pwd_phone, the hidden field values must be supplied as well. This is solved by making an initial GET-request to the login page and then parse all hidden fields and use them for the actual login post.
No XHTML, no UTF8?
Because the pages are not XHTML compilant and also not UTF8 encoded some special care must be taken to parse the returning pages. NSXMLParser doesn’t like the amp-signs (&) and they are not needed for the application anyways so I just remove them. To remove them I need the returned data in the form of NSString, this is acomplised by “initWithData” and passing NSStringEncodingConversionAllowLossy instead of NSUTF8StringEncoding. After the &-signs are removed I convert the string back to UTF8-encoded NSData and parse it.
Transfering money is implemented using a standard UIWebView utilizing the existing functionality in each banks web based applications. This could of course be implemented using Cocoa instead of launching a browser but time is always a factor. To speed up the process of transfering money Mitt Saldo signs in automatically and the UIWebView uses the authentication cookies to directly access the transfer money page. NSURLRequest doesn’t automatically store cookies in the application cookie container but if cookies are placed in the cookie container UIWebView will automatically pick them up and use accordingly.
Mitt Saldo v1.0 complete source code
Code summary:
| Language | files | blank | comment | code |
| Objective-C | 37 | 2331 | 1193 | 7850 |
| C/C++ Header | 43 | 573 | 782 | 1069 |
| SUM | 80 | 2904 | 1975 | 8919 |
*NOTICE* There is one difference between the posted source code and the app on AppStore. The bug that prevents the correct UITextBox to scroll into a visible state in the settings view is already fixed.
With this blog I try to provide useful tips and solutions for programming .NET, Objective-C and more. My name is Björn Sållarp, and I love writing code.
It's now available on AppStore. It's free and open source. Read more about the app here: Swedish / English
Marcus
October 19th, 2010 at 7:45 am
Toppen! Dock funkar ej applikationslåset om man inte dödar programmet helt. Om man multitaskar (som är standardförfarande) så får man inte fråga om upplåsning, utan kommer rakt in i appen.
Björn Sållarp
October 19th, 2010 at 8:07 am
@Marcus,
Det är designat så att om du multitaskar så dyker bara applikationslåset upp om appen har varit “nere” i 30 sekunder för att man ska slippa låset hela tiden. Om det inte fungerar så på din iPhone så berätta vilken iPhone-modell du har.
Janne
October 19th, 2010 at 12:13 pm
Jag får inte Swedbank att fungera med Mitt Saldo. Om jag skriver in 12 siffror i din applikation så säger den att jag har för många siffror. Swedbank kräver 12..
ICa-banken fungerar
Björn Sållarp
October 19th, 2010 at 12:19 pm
@Janne,
Jag kör med 10-siffror, och det fungerar, men jag är född 82. Vilket år är du född? Jag anger mitt personnummer: 8209250000
Janne
October 19th, 2010 at 12:49 pm
!941
Janne
October 19th, 2010 at 1:03 pm
Kan det bero på att jag har Swedbanks app installerad?
Björn Sållarp
October 19th, 2010 at 1:33 pm
Skumt. Att du har swedbanks app installerad spelar inte in alls. Jag ska kika lite när jag kommer hem om det kan bero på årtalet. Men du kan alltså inte logga in i deras app utan fullständigt årtal?
Janne
October 19th, 2010 at 1:59 pm
Nej, jag kan inte logga in med tio siffror.
Björn Sållarp
October 20th, 2010 at 8:53 am
@Janne,
Har du testat med 12-siffror även att appen varnar? Det du skriver in sparas, dialogen är bara en varning. Jag kan logga in mot Swedbank med: 19820925000 eller 8209250000.
Jag ska justera varningen i nästa version så den tar emot 10 eller 12 siffror utan varning.
Janne
October 20th, 2010 at 11:27 am
Appen varnar fel personnummer eller kod, sen kommer jag inte längre. Ja, det kommer upp-du har bara 3 försök också.
Björn Sållarp
October 20th, 2010 at 11:54 am
Ok. Problemet med att bygga en bank-app är att folk inte är så intresserade av att låna ut sin kontoinformation så man kan felsöka
.
Jag har funderat lite på att bygga en felrapporteringsfunktion där användaren kan maila det som returneras från banken till sig själv om det blir fel som sedan kan skickas till mig. Då kan användaren själv kontrollera att man inte lämnar från sig någon personlig information.
Tack så mycket för felrapporten. Jag kommer nog inte kunna lösa problemet som det ser ut nu utan att få tag på ett konto där det inte fungerar men jag ska börja bygga på felrapporteringsfunktionen i helgen så kanske jag kan köra ut en ny release och det skulle förhoppningsvis hjälpa till att lösa problemet. För jag antar att du inte själv har OSX och XCode så du kan tanka ner källkoden och testa/felsöka?
// Björn
Janne
October 20th, 2010 at 12:56 pm
Jag kan inte testa eller felsöka
Kjell
October 21st, 2010 at 5:48 pm
Bra och användbar app!
Jag har ICA-banken och det fungerar utmärkt i din app, men eftersom jag även har Skandiabanken och använder deras egen app vore det inte dumt att i Mitt Saldo även kunna komma åt den….. och få all info i EN app!
/Kjell
Björn Sållarp
October 21st, 2010 at 6:38 pm
@Kjell,
Kul att du gillar appen. Är det inte så att skandiabanken kräver engångskoder för sin bank? Jag skulle gärna ha stöd för skandiabanken men känner tyvärr ingen som är kund hos dem vilket gör det omöjligt att supportera tyvärr. Om de har förenklad inloggning så kan jag iof bli kund hos dem
. Men då vill jag veta att de har en inloggning där man kan ange ett fast lösenord.
// Björn
Kjell
October 21st, 2010 at 7:19 pm
Jodå, du har rätt vad gäller den “vanliga” kraftfulla inloggningen. Först inloggning via Bank-ID och se´n en fortsättning med engångskoder per papperslista alt SMS-kod.
Dom har dock en enklare inloggning på sin app “SKANDIA”, där det räcker med pnr+pinkod. Kolla på deras app
/Kjell
Peter
November 23rd, 2010 at 7:20 pm
Kan du inte lägga till så man kan kolla saldo på sitt ICA-kort, hittar ingen iphone app till det? Körde android innan och där fanns det en som hette “mitt ica-kort”
Johan
January 14th, 2011 at 7:35 pm
Det vore trevligt om appen kunde visa Coop-visa saldo också.
Coop har en app där man kan se sitt saldo, men som med alla bank-appar är det riktigt bökigt.
PhonePro » "Mitt Saldo"
January 23rd, 2011 at 10:37 am
[...] trevligt initiativ, som du kan läsa mer om här! MER INFORMATION Both comments and trackbacks are currently [...]
Magnus
February 12th, 2011 at 6:12 pm
Hej.
Är förstås väldigt nöjd med din App för enkelhet är ju det bästa!
Men jag undrar om du kan ändra startsida i Mobilbanken. Jag har ICA-banken och vill oftast kolla översikten och ett visst konto för att se om betalningar kommit in. Men när jag väljer Mobilbanken kommer jag alltid till Överföring. Ännu trevligare är väl förstås om man kan välja startsida i inställningarna.
Robert Werling
March 3rd, 2011 at 7:37 pm
Hej, tack för en välanvänd app. Jag vet inte om det finns fler med samma I-landsproblem som jag. Jag har 4 barn, vilket snart betyder 4 bankkonton+ mitt eget. Det vore guld om man kunde välja om samma bank flera ggr för att kunna få en samlad blick på våra konton.
Wille Enblad
April 9th, 2011 at 10:10 pm
jag får inte den nedladde koden att fungera. det står att base sdk missing.
Björn Sållarp
April 9th, 2011 at 10:21 pm
@Wille,
Det finns hur mycket som helst om du googlar på detta. Du måste välja bas SDK för kompilering i projektinställningarna. Hur exakt skiljer sig lite mellan XCode 3 och 4. Här är ett exempel: http://aralbalkan.com/3666. Men du kan som sagt hitta hur mycket som helst.
Lycka till!
// Björn
Wille
April 13th, 2011 at 4:29 pm
Hej Björna, kan du svara på frågor lite allmänt om programering. Kan du mejla mig så jag kan svara? Jag har några små frågor.!
Johan
July 15th, 2011 at 12:36 am
Tjena!
Försöker göra en liknande inloggning även den för Nordea. Däremot har jag lite problem med _csrf_token. Det enda som händer är att jag får “Omsändning av formulär är ej tillåtet av säkerhetsskäl. ” tillbaka. Antagligen för att jag gör en request (GET) när jag hämtar ut min _csrf_token och sedan en ny request (POST) (som har en annan _csrf_token antar jag) när jag sen ska posta lösen, anv och _csrf_token.
Tyvärr har jag inte Xcode eller osx så jag kan inte riktigt läsa din kod.
Har du något spontant tips?
Tack på förhand
Björn Sållarp
July 19th, 2011 at 11:48 am
@Johan,
Du måste göra en GET request först för att hämta csrf token du måste också se till att alla cookies och eventuellt andra dålda input fält med förifyllda värden skickas med i POST-requestet. Du måste inte ha X-code för att läsa koden så hämta ner den och titta. Det finns ganska mycke kommentarer som förhoppningsvis hjälper. Vilket språk jobbar du med?
// Björn
Johan
July 21st, 2011 at 5:50 pm
Hej igen,
Tack för ditt svar! Ja precis, csrf token hade jag och det fungerade perfekt med den biten. Refaktorerade lite i själva post koden och fick det att fungera. Tror att jag trollade bort min cookie någonstans på vägen tidigare. Tack för hjälpen!
Sitter med .Net och ska göra en liten hemekonomihjälpreda bara för skojs skull!
Tack för vägledningen igen.
Länsförsäkringar Bank – API hack & documentation | blog.sallarp.com
October 29th, 2011 at 8:06 pm
[...] been a year since I released the first and only swedish multi-bank app for iPhone. It’s been pretty successful with some ~45.000 downloads and it’s being downloaded at a [...]