Intro to iPhone development

  • 1,529 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,529
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
78
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide
  • Splashscreen som er oppe mens vi venter på at alle setter seg ned.



    Start opp firefox i bakgrunnen.
    Skru av lyden og telefonen.



    Det hær fåredraget handler om utvikling for iphone.
    VI kommer innom en del ulike teknologier i løpet av de neste 40 minuttan.



    På sluttn av foredraget har vi litt tid till spørsmål.
  • Litt om megselv.
    Tobias K Torrissen
    Jobbet med programmering og systemutvikling i 11 år,
    Cand.Scient fra UIO
    Kommer fra Oslo
    CTO og konsulent
    Jobbet mye med store mellomvaresystemer.
  • Here
  • Sold over 12 million devices world wide.
    Second largest smartphone vendor in the world
    7th largest phone vendor in the world



    1 000 000 000 (billon) downloads from the appstore.
    25 000 apps available throug appstore in 9 months.
  • top-of-the-line hjemmepc var for 7-8 år siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppløsning på 480x320 pixels
    GPU:en trengs For å kunne støtte Open GL ES



    Alt i alt: En kjempespennende maskin å jobbe med!!



    appstore, en genial distribusjonsmekanisme for 3:e parts applikasjoner
  • top-of-the-line hjemmepc var for 7-8 år siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppløsning på 480x320 pixels
    GPU:en trengs For å kunne støtte Open GL ES



    Alt i alt: En kjempespennende maskin å jobbe med!!



    appstore, en genial distribusjonsmekanisme for 3:e parts applikasjoner
  • top-of-the-line hjemmepc var for 7-8 år siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppløsning på 480x320 pixels
    GPU:en trengs For å kunne støtte Open GL ES



    Alt i alt: En kjempespennende maskin å jobbe med!!



    appstore, en genial distribusjonsmekanisme for 3:e parts applikasjoner
  • top-of-the-line hjemmepc var for 7-8 år siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppløsning på 480x320 pixels
    GPU:en trengs For å kunne støtte Open GL ES



    Alt i alt: En kjempespennende maskin å jobbe med!!



    appstore, en genial distribusjonsmekanisme for 3:e parts applikasjoner
  • top-of-the-line hjemmepc var for 7-8 år siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppløsning på 480x320 pixels
    GPU:en trengs For å kunne støtte Open GL ES



    Alt i alt: En kjempespennende maskin å jobbe med!!



    appstore, en genial distribusjonsmekanisme for 3:e parts applikasjoner
  • top-of-the-line hjemmepc var for 7-8 år siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppløsning på 480x320 pixels
    GPU:en trengs For å kunne støtte Open GL ES



    Alt i alt: En kjempespennende maskin å jobbe med!!



    appstore, en genial distribusjonsmekanisme for 3:e parts applikasjoner
  • top-of-the-line hjemmepc var for 7-8 år siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppløsning på 480x320 pixels
    GPU:en trengs For å kunne støtte Open GL ES



    Alt i alt: En kjempespennende maskin å jobbe med!!



    appstore, en genial distribusjonsmekanisme for 3:e parts applikasjoner
  • top-of-the-line hjemmepc var for 7-8 år siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppløsning på 480x320 pixels
    GPU:en trengs For å kunne støtte Open GL ES



    Alt i alt: En kjempespennende maskin å jobbe med!!



    appstore, en genial distribusjonsmekanisme for 3:e parts applikasjoner
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • This is me, when I
  • La oss se litt nærmere på appen. [kjør film]
    Snakk deg gjennom applikasjonen. (Ikke fortell hvilke tjenester som blir brukt)
  • Før vi går konkret til verks er det greit å se hvilke delproblemer vi identifiserte. Hva var det vi måtte få på plass.
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch måtte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten måtte vi jo på en eller annen måte ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch måtte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten måtte vi jo på en eller annen måte ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch måtte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten måtte vi jo på en eller annen måte ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch måtte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten måtte vi jo på en eller annen måte ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch måtte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten måtte vi jo på en eller annen måte ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch måtte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten måtte vi jo på en eller annen måte ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch måtte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten måtte vi jo på en eller annen måte ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Tobias:
    Nå skal vi gå gjennom hvordan denne applikasjonen er bygget opp.
  • vi benytter oss av 2 velkjente webtjenester:
    google maps som gir oss en adresse gitt en posisjon.
    trafikanten ger oss ruta hjem og informasjon om når linjene går, (i realtid)
    I tillegg bruke vi lokaliseringsfunktionen i iPhone for å få posisjonering (klikk)
    noen av disse webtjenestene mangler gode programatiske API:er
    VI bruker Yahoo pipes for å få ut dataen vi ønsker i XML format.
    La oss gå litt nærmere in på hver enkelt komponent
  • vi benytter oss av 2 velkjente webtjenester:
    google maps som gir oss en adresse gitt en posisjon.
    trafikanten ger oss ruta hjem og informasjon om når linjene går, (i realtid)
    I tillegg bruke vi lokaliseringsfunktionen i iPhone for å få posisjonering (klikk)
    noen av disse webtjenestene mangler gode programatiske API:er
    VI bruker Yahoo pipes for å få ut dataen vi ønsker i XML format.
    La oss gå litt nærmere in på hver enkelt komponent
  • vi benytter oss av 2 velkjente webtjenester:
    google maps som gir oss en adresse gitt en posisjon.
    trafikanten ger oss ruta hjem og informasjon om når linjene går, (i realtid)
    I tillegg bruke vi lokaliseringsfunktionen i iPhone for å få posisjonering (klikk)
    noen av disse webtjenestene mangler gode programatiske API:er
    VI bruker Yahoo pipes for å få ut dataen vi ønsker i XML format.
    La oss gå litt nærmere in på hver enkelt komponent
  • vi benytter oss av 2 velkjente webtjenester:
    google maps som gir oss en adresse gitt en posisjon.
    trafikanten ger oss ruta hjem og informasjon om når linjene går, (i realtid)
    I tillegg bruke vi lokaliseringsfunktionen i iPhone for å få posisjonering (klikk)
    noen av disse webtjenestene mangler gode programatiske API:er
    VI bruker Yahoo pipes for å få ut dataen vi ønsker i XML format.
    La oss gå litt nærmere in på hver enkelt komponent
  • Tobias:
    Lansert 6 mars 2008
    Samme sdk som utviklerne på apple jobber med
    Programmering I Objective C (Klassisk C med noen utvidelser for å støtte objektorientering)
    SDK:en består av (klikk)
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    en rekke bibliotek
    La oss se litt på utviklings miljøet.
  • Tobias
    SDK:n innehåller et relativt sofistikert utviklingsmiljø



    Xcode er det samme utviklingsmiljøet som man jobber med når man lager native osx applikasjoner
    Apple har naturlig nokk valgt gjenbruke miljøet for utvikling av iphone applikasjoner
  • Tobias
    Dette kan jo virke litt kaosarted, men xcode er ett moderne IDE med flusst av tjenester.
    Når du blir vant med xcode, så virker det mye greiere en ved første øyekast.



    La oss se litt på de ulike features:ene
    (klick)
    Code Highlight
    SYntax coloring
    Code completion
  • Tobias
    Integrated dokumentasjon som er kontext avhengig.
  • Tobias
    INtegrert subversion for versionshantering av prosjektfiler (fungerer bra)
    Subversion, CVS
  • Tobias
    oversiktlig prosjekthentering
  • Gå fort over til neste!!
  • Roger: Mulighet å bruke en rekke standard gui komponenter som vi kjenner igjen fra de innebygde applikasjonene på iphone
  • Roger: Skaper grensesnittet gjennom drag n drop
  • Roger: Gode muligheter for å definere layout for hver enkelt komponent
  • Roger: Gui:et kobles med drag n drop til en klasse som agerer gui-driver
  • Roger:
    Denne er gull vert når du utvikler iphone appen din
    lar deg teste og eventuellt debugge koden din i ett simulert iphone miljø
    når alt kommer til allt så viser det seg att det finns ganske store forskjeller mellom simulatorn og selve iphonen, så du må belage deg på å debugge mot iphonen også
  • Roger: En virtuell instanse av iphonen till å prøve koden din på, uten noe ventetid.
  • Roger:
    Mulighet til å aktivere breakpoints i koden slik at du kan kjøre step-by-step debugging av ditt program.
    Her har man også mulighet til å granske objekt.
    Gre oversikt over ulike tråder
  • Roger: Egen innebygged GDB terminal
  • Roger: Mulighet til å granske minnet
  • Roger:
    Når man har funnet alle buggene som gjør at programmet crasher, så må man finne andre brister.
    Dette har apple gjort veldig lett for oss gjennom instruments.

    avansert profileringsverkøy
    viser minneslekasjer (tru meg de finns)
    code hot spots
    object allocations
    etc
  • Roger:
    klikk
    forslag til ulike målinger
  • Her har vi en kjøring vi har gjort på vår app.
    Minneallokering
    minnelekasjer
    netverksaktivitet
    bruk av internminne
    bruk av cpu



    Du har mulighet till å spare ett eget oppsett av målere
    DU har også mulighet til å spare en kjøring
  • Categories are extentions to classes without subclassing.
    It can also be used to distribute a class implementation over several source files.
  • Categories are extentions to classes without subclassing.
    It can also be used to distribute a class implementation over several source files.
  • Categories are extentions to classes without subclassing.
    It can also be used to distribute a class implementation over several source files.
  • Categories are extentions to classes without subclassing.
    It can also be used to distribute a class implementation over several source files.
  • Categories are extentions to classes without subclassing.
    It can also be used to distribute a class implementation over several source files.
  • Categories are extentions to classes without subclassing.
    It can also be used to distribute a class implementation over several source files.
  • Categories are extentions to classes without subclassing.
    It can also be used to distribute a class implementation over several source files.
  • access is not show here. Default is protected



    @private
    @public
    @protected
  • When countere reaches 0, dealloc is called.
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch måtte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten måtte vi jo på en eller annen måte ha skaffet oss oversikt over rutetider og sanntidsinformasjon



    Vi har defor valgt i bruke en teknikk / konsept som heter mashups. [KLIKK]
  • Vi begynner med lokaliseringen.
    Hvor er jeg?
    Rammeverket som kan gi oss svaret heter Core Location (click)
    Kanske den heteste tjenesten på iphonen, etterlengtet blant utviklere for mobile platformer
  • Core Location bruker flere ulike teknologier
    Wifi hotspots:
    wifi-hotspots vet posisjon og rekkevidde
    Basestasjoner:
    Telefonen din er knyttet til en basestasjon, basestasjonen vet sin egen posisjon å rekkevidde.
    A-GPS:
    vangli GPS er for tregt og strømkrevende på grund av krevende beregninger.
    For at dette skal virke må man være tilknyttet en basestasjon som støtter A-GPS.
    AGPS flytter de tyngste beregningene ut till basestasjonene



    Core lokation er grejt å jobbe med, la oss se litt på hvordan vi får ut posisjonen i vårt program
  • Core Location bruker flere ulike teknologier
    Wifi hotspots:
    wifi-hotspots vet posisjon og rekkevidde
    Basestasjoner:
    Telefonen din er knyttet til en basestasjon, basestasjonen vet sin egen posisjon å rekkevidde.
    A-GPS:
    vangli GPS er for tregt og strømkrevende på grund av krevende beregninger.
    For at dette skal virke må man være tilknyttet en basestasjon som støtter A-GPS.
    AGPS flytter de tyngste beregningene ut till basestasjonene



    Core lokation er grejt å jobbe med, la oss se litt på hvordan vi får ut posisjonen i vårt program
  • Core Location bruker flere ulike teknologier
    Wifi hotspots:
    wifi-hotspots vet posisjon og rekkevidde
    Basestasjoner:
    Telefonen din er knyttet til en basestasjon, basestasjonen vet sin egen posisjon å rekkevidde.
    A-GPS:
    vangli GPS er for tregt og strømkrevende på grund av krevende beregninger.
    For at dette skal virke må man være tilknyttet en basestasjon som støtter A-GPS.
    AGPS flytter de tyngste beregningene ut till basestasjonene



    Core lokation er grejt å jobbe med, la oss se litt på hvordan vi får ut posisjonen i vårt program
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige målte posisjon, accuracy, højde over havet etc.
  • So, the iPhone SDK provides only one XML parser
    It is event driven. When ever you for instance reach a tag, an event will fire and you can act accordingly
    You can not go back in the document.



    OpenSOurce alternatives are available if you need to have the whole document in memory.
  • This is the domain object for travel info, basicly the information we are interested in.
  • Here is the implementation. Basicly nothing else than the free up the memory and the generation of properties.
  • Apple ID registrering på apple.
    iPhone developer - tilgang til SDK osv
    iPhone developer program - tilgang til appstore
  • Apple ID registrering på apple.
    iPhone developer - tilgang til SDK osv
    iPhone developer program - tilgang til appstore
  • Apple ID registrering på apple.
    iPhone developer - tilgang til SDK osv
    iPhone developer program - tilgang til appstore
  • Apple ID registrering på apple.
    iPhone developer - tilgang til SDK osv
    iPhone developer program - tilgang til appstore
  • You have to have a mac.



    When the phone fis
    Apple har løsnet litt i det siste.



    Simulator vs Emulator



    Late som vs kopiere. (Android er java... Eksakt kopi er mulig)
  • You have to have a mac.



    When the phone fis
    Apple har løsnet litt i det siste.



    Simulator vs Emulator



    Late som vs kopiere. (Android er java... Eksakt kopi er mulig)
  • You have to have a mac.



    When the phone fis
    Apple har løsnet litt i det siste.



    Simulator vs Emulator



    Late som vs kopiere. (Android er java... Eksakt kopi er mulig)
  • You have to have a mac.



    When the phone fis
    Apple har løsnet litt i det siste.



    Simulator vs Emulator



    Late som vs kopiere. (Android er java... Eksakt kopi er mulig)
  • You have to have a mac.



    When the phone fis
    Apple har løsnet litt i det siste.



    Simulator vs Emulator



    Late som vs kopiere. (Android er java... Eksakt kopi er mulig)
  • You have to have a mac.



    When the phone fis
    Apple har løsnet litt i det siste.



    Simulator vs Emulator



    Late som vs kopiere. (Android er java... Eksakt kopi er mulig)
  • So, our software is not released. We just did it for fun. But some guys in a company called shortcuts have released an app that gives you location based realtime info. Try it out i you are in Oslo.
  • Bonjour is a service discovery protocol
  • Spørsmål?



    OCUnit - unittesting.

Transcript

  • 1. an introduction to iPhone development Tobias Torrissen Know IT Objectnet
  • 2. • Tobias Torrissen
  • 3. Agenda • About the iPhone • The problem: About the example application • About the development environment • Objective C • Common API-s • XML parsing API • Core Location
  • 4. iPhone 3GS
  • 5. • 3GS • Wi-Fi (802.11b/g) • Bluetooth • Accelorometer • 600 MHz • GPU • 256 MB DRAM • A-GPS
  • 6. The problem
  • 7. Usecase
  • 8. Usecase
  • 9. Usecase
  • 10. Usecase
  • 11. Usecase
  • 12. • Idea: let´s create an app that helps you find your way home. • [screencast]
  • 13. Challenges
  • 14. • Where am I? • What´s the address? • What is the route home? • When is the buss supposed to arrive • When does the buss actually arrive?
  • 15. • Where am I? • What´s the address? • What is the route home? • When is the buss supposed to arrive • When does the buss actually arrive?
  • 16. • Where am I? • What´s the address? • What is the route home? • When is the buss supposed to arrive • When does the buss actually arrive?
  • 17. Architecture
  • 18. positioning
  • 19. reverse geocoding positioning route info
  • 20. reverse geocoding positioning route info
  • 21. reverse geocoding positioning route info realtime info
  • 22. iPhone SDK
  • 23. • Core Location • Orientation • Acceleration • Core Animation • 3D Open GL ES • 2D Quarts • Audio playback • Video playback • Touch events • Integrated Webview • Contacts • Images • Camera • etc.
  • 24. Xcode
  • 25. Interface builder
  • 26. screenshot
  • 27. screenshot
  • 28. screenshot
  • 29. screenshot
  • 30. screenshot
  • 31. screenshot
  • 32. screenshot
  • 33. screenshot
  • 34. iPhone simulator
  • 35. Instruments
  • 36. Coding Objective C
  • 37. • Small extention to ANSI C • About ten new reserved words • Syntactical changes influenced by SmallTalk • Used primarily by Apple. • OpenStep standard • Dynamic typing • “Explicit” memory management
  • 38. [object method:parameters]
  • 39. Defining interfaces @interface ClassName : SuperClassName { int count; int data; NSString* aString; } @property(nonatomic, retain) NSString* aString; - (ClassName*) initWithSome: (NSString*) value; - (void) myObjectMethod:(NSString*)paramName; + (void) myClassMethod:(NSString*)paramName; - (void) placeDocumentInQueue:(NSString) document before:(int) document after:(int) document;
  • 40. Defining classes #import "ClassName.h" @implementation SomeClass @synthesize aString; - (ClassName*) initWithSome:(NSString) value{ self = [super init]; if (self) { [self setvalue: vale]; } } - (void) myObjectMethod:(NSString*)paramName { // do stuff } + (void) myClassMethod:(NSString*)paramName{ // do stuff } - (void) placeDocument:(NSString) document InQueue:(int) queueId Before:(int) documentId after:(int) documentId { // do even more! }
  • 41. Tricky stuff Delegates When you call a API class, you often send a reference to your self or some other class which will recieve callbacks on certain events Parameters Almost named parameters, but the order is significant. Memory allocation. retain - instance counter++ release - instance counter -- [NSAutoreleasePool] - Inserted objects gets released automaticlu
  • 42. A walkthrough of the example application
  • 43. • Where am I? • What´s the address? • What is the route home? • When does the buss actually arrive?
  • 44. • Create a project in xCode, create GUI • Write some code and connect the GUI to it • Use core location • Get some XML and parse the result
  • 45. Getting started
  • 46. •Create project •Add some controls •Run in simulator [screencast]
  • 47. do something...
  • 48. •Connect the controls and the code •Write a simple message in the text field
  • 49. •Connect the controls and the code •Write a simple message in the text field [screencast]
  • 50. Using Core Location
  • 51. •Wifi-hotspots
  • 52. •Wifi-hotspots •Base stations
  • 53. •Wifi-hotspots •Base stations •A-GPS
  • 54. Core Location Basestasjoner CLLocation Wifi-hotspots Manager A-GPS
  • 55. Core Location Basestasjoner Objective-C CLLocation Wifi-hotspots Class Manager A-GPS
  • 56. Core Location Basestasjoner Register the class Objective-C CLLocation Wifi-hotspots Class Manager A-GPS
  • 57. Core Location Basestasjoner Register the class Start positioning Objective-C CLLocation Wifi-hotspots Class Manager A-GPS
  • 58. Core Location Basestasjoner Register the class Start positioning Objective-C CLLocation Wifi-hotspots Class Manager A-GPS
  • 59. Core Location Basestasjoner Register the class Start positioning Objective-C New position found CLLocation Wifi-hotspots Class Manager A-GPS
  • 60. Core Location Basestasjoner Register the class Start positioning Objective-C New position found CLLocation Wifi-hotspots Class Manager A-GPS
  • 61. Core Location Basestasjoner Register the class Start positioning Objective-C New position found CLLocation Wifi-hotspots Class New position found Manager A-GPS
  • 62. Core Location Basestasjoner Register the class Start positioning Objective-C New position found CLLocation Wifi-hotspots Class New position found Manager A-GPS
  • 63. Core Location Basestasjoner Register the class Start positioning Objective-C New position found CLLocation Wifi-hotspots Class New position found Manager New position found A-GPS
  • 64. Core Location Basestasjoner Register the class Start positioning Objective-C New position found CLLocation Wifi-hotspots Class New position found Manager New position found Stop positioning A-GPS
  • 65. @interface LocationController : NSObject <CLLocationManagerDelegate> { CLLocationManager *locationManager; id delegate; } @property (nonatomic, retain) CLLocationManager *locationManager; @property (nonatomic, assign) id delegate; - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error; @end
  • 66. @implementation LocationController @synthesize locationManager, delegate; // Constructor. - (id) init { self = [super init]; if (self != nil) { self.locationManager = [[[CLLocationManager alloc] init] autorelease]; self.locationManager.delegate = self; // send loc updates to myself } return self; } // Called when the locationmanager finds a new update on posission - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { [self.delegate locationUpdate:newLocation]; } // Called if an error occurs. - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { [self.delegate locationError:error]; } // free the memory - (void)dealloc { [self.locationManager release]; [super dealloc]; } @end
  • 67. [..] locationController = [[LocationController alloc]init]; locationController.delegate = self; [..] [locationController.locationManager startUpdatingLocation]; [..] - (void)locationUpdate:(CLLocation *)location { myTextField.text = [location description]; [locationController.locationManager stopUpdatingLocation]; } - (void)locationError:(NSError *)error { myTextField.text = [error description]; }
  • 68. Parsing XML
  • 69. XML parsing Event based XML parsing: - (void)parser:(NSXMLParser *)parser didStartElement: (NSString *)elementName - (void)parser:(NSXMLParser *)parser foundCharacters: (NSString *)string - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName - (void)parserDidEndDocument:(NSXMLParser *)parser
  • 70. <DISMessages SubscriptionID="1"> <DISDeviation TimeStamp="2009-04-27T13:17:10.201+02:00"> <DISID>Stortinget</DISID> <LineID>3</LineID> <DestinationStop>Mortensrud</DestinationStop> <ScheduledDISArrivalTime>2009-04-27T13:40:30.000+02:00<ScheduledDISArrivalTime> <ExpectedDISArrivalTime>2009-04-27T13:40:55.000+02:00</ExpectedDISArrivalTime> </DISDeviation> <DISDeviation TimeStamp="2009-04-27T13:17:10.201+02:00"> <DISID>Stortinget</DISID> <LineID>4</LineID> <DestinationStop>Bergkrystallen</DestinationStop> <ScheduledDISArrivalTime>2009-04-27T13:42:30.000+02:00</ScheduledDISArrivalTime> <ExpectedDISArrivalTime>2009-04-27T13:45:55.000+02:00</ExpectedDISArrivalTime> </DISDeviation> </DISMessages>
  • 71. // // ArrivalInfo.h // rOOts2 // // Created by Tobias K Torrissen on 4/27/09. // Copyright 2009 __MyCompanyName__. All rights reserved. // #import <Foundation/Foundation.h> @interface ArrivalInfo : NSObject { NSString *DestinationStop; NSString *ExpectedDISArrivalTime; NSString *ScheduledDISArrivalTime; NSString *LineID; } @property(nonatomic, retain) NSString *ExpectedDISArrivalTime; @property(nonatomic, retain) NSString *ScheduledDISArrivalTime; @property(nonatomic, retain) NSString *LineID; @property(nonatomic, retain) NSString *DestinationStop; @end
  • 72. // // ArrivalInfo.m // rOOts2 // // Created by Tobias K Torrissen on 4/27/09. // Copyright 2009 __MyCompanyName__. All rights reserved. // #import "ArrivalInfo.h" @implementation ArrivalInfo @synthesize DestinationStop, ExpectedDISArrivalTime, ScheduledDISArrivalTime, LineID; - (void) dealloc { [DestinationStop release]; [ExpectedDISArrivalTime release]; [ScheduledDISArrivalTime release]; [LineID release]; [super dealloc]; } @end
  • 73. #import <Foundation/Foundation.h> #import "ArrivalInfo.h" #import "ROOts2AppDelegate.h" @interface RealTimeParser : NSObject { ArrivalInfo *currentArrivalInfo; NSMutableString *valueInProgress; rOOts2AppDelegate *delegate; } - (RealTimeParser *) initRealTimeParser; @end
  • 74. // called whenever an start element is reached. - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { if([elementName isEqual:@"DISMessage"]){ NSLog(@"start dataset"); currentArrivalInfo = [[ArrivalInfo alloc]init]; } } // save the actual value... - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if(!valueInProgress) valueInProgress = [[NSMutableString alloc] initWithString:string]; else [valueInProgress appendString:string]; } // when ever you reach a end document tag. - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { if([elementName isEqualToString:@"DISDeviation"]) { NSLog(@"Adding travel info to deligate"); [delegate.records addObject:currentArrivalInfo]; [currentArrivalInfo release]; currentArrivalInfo = nil; } else if ([elementName isNotEqualTo:@"DISMessages"]) { [currentArrivalInfo setValue:valueInProgress forKey:elementName]; NSLog(@"Adding key, value %@, %@ n", elementName, valueInProgress); } [valueInProgress release]; valueInProgress = nil; }
  • 75. NSURL *url = [[NSURL alloc] initWithString:@"http:// www.sis.trafikanten.no:8088/xmlrtpi/dis/request?DISID=SN $03011330"]; NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url]; RealTimeParser *parser = [[RealTimeParser alloc] initRealTimeParser]; [xmlParser setDelegate:parser]; BOOL success = [xmlParser parse]; if(success) NSLog(@"No Errors"); else NSLog(@"Error Error Error!!!");
  • 76. How to get into iPhone development
  • 77. • You need to register...
  • 78. • You need to register... • Apple ID
  • 79. • You need to register... • Apple ID • iPhone Developer
  • 80. • You need to register... • Apple ID • iPhone Developer • iPhone Developer Program
  • 81. • Personal • 99$ • can distribute through appstore
  • 82. • Personal • 99$ • can distribute through appstore • Enterprise • 299$ • can not distribute through appstore
  • 83. ?
  • 84. • well... ?
  • 85. • well... ? • The phone is amazing.
  • 86. • well... ? • The phone is amazing. • Xcode is OK
  • 87. • well... ? • The phone is amazing. • Xcode is OK • The politics are mindboggeling
  • 88. • well... ? • The phone is amazing. • Xcode is OK • The politics are mindboggeling • Look out for Android
  • 89. News in iPhone 3.0 • peer-to-peer connections over Bonjour; • an app interface for hardware accessories; • access to the iPod music library; • a new Maps API • long-awaited push notification support. • API for streaming audio and video directly over HTTP • control of the proximity sensor • audio recording features • a battery API
  • 90. Thank you!
  • 91. Networking
  • 92. NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc] init]; NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]]; [theRequest setURL:[NSURL URLWithString:@"http://service-test.1881.no/SearchService/v4_2/SearchService.asmx"]]; [theRequest setHTTPMethod:@"POST"]; [theRequest setValue: msgLength forHTTPHeaderField:@"Content-Length"]; [theRequest setValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [theRequest setValue: @"http://Opplysningen.WebService.SearchService/2006/10/MultiSearchSingleResult" forHTTPHeaderField:@"SOAPAction"]; [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; if(connection) { webData = [[NSMutableData data] retain]; } else { NSLog(@"ERROR with connection"); } [theRequest release]; } -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [webData setLength:0]; } -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data { [webData appendData: data]; } -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"ERROR with the connection"); [spinner stopAnimating]; [connection release]; [webData release]; [query release]; } -(void)connectionDidFinishLoading:(NSURLConnection *) connection { NSLog(@"DONE loading. Recieved BYTES: %d", [webData length]);
  • 93. NSString *soapMessage = [NSString stringWithFormat: @"<?xml version="1.0" encoding="utf-8"?>n" "<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/ XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">n" "<soap:Body>n" "<MultiSearchSingleResult xmlns="http://Opplysningen.WebService.SearchService/2006/10">n" "<MultiSearchRequest>n" "<GetAdvertisements>false</GetAdvertisements>n" "<ResponseType>None</ResponseType>n" "<PageSize>20</PageSize>n" "<Offset>0</Offset>n" "<SearchQuery>%@</SearchQuery>n" "<PartnerGuid>20ecc3d7-8057-4512-8aab-e3bf55470333</PartnerGuid>n" "<MultiSearchFilter>n" "<GetPersonSearch xmlns="http://Opplysningen.WebService.SearchService.DataTypes/2006/10">true</ GetPersonSearch>n" "<GetAddressSearch xmlns="http://Opplysningen.WebService.SearchService.DataTypes/2006/10">true</ GetAddressSearch>n" "<GetCompanySearch xmlns="http://Opplysningen.WebService.SearchService.DataTypes/2006/10">true</ GetCompanySearch>n" "<GetBusinessSearch xmlns="http://Opplysningen.WebService.SearchService.DataTypes/2006/10">true</ GetBusinessSearch>n" "</MultiSearchFilter>n" "<DetailLevel>Basic</DetailLevel>n" "<RequireMapCoordinates>false</RequireMapCoordinates>n" "</MultiSearchRequest>n" "</MultiSearchSingleResult>n" "</soap:Body>n" "</soap:Envelope>n", query];