an introduction
          to iPhone
        development


 Tobias Torrissen
Know IT Objectnet
• Tobias Torrissen
Agenda
•   About the iPhone

•   The problem: About the example application

•   About the development environment

•   Ob...
iPhone 3GS
• 3GS
• Wi-Fi (802.11b/g)
• Bluetooth
• Accelorometer
• 600 MHz
• GPU
• 256 MB DRAM
• A-GPS
The
problem
Usecase
Usecase
Usecase
Usecase
Usecase
• Idea: let´s create an app
  that helps you find your
  way home.
• [screencast]
Challenges
• Where am I?
 • What´s the address?
• What is the route home?
• When is the buss supposed
  to arrive
• When does the bus...
• Where am I?
 • What´s the address?
• What is the route home?
• When is the buss supposed
  to arrive
• When does the bus...
• Where am I?
 • What´s the address?
• What is the route home?
• When is the buss supposed
  to arrive
• When does the bus...
Architecture
positioning
reverse geocoding

positioning



              route info
reverse geocoding

positioning



              route info
reverse geocoding

positioning



                       route info


              realtime info
iPhone SDK
• Core Location
• Orientation
• Acceleration
• Core Animation
• 3D Open GL ES
• 2D Quarts
• Audio playback
• Video playbac...
Xcode
Interface builder
screenshot
screenshot
screenshot
screenshot
screenshot
screenshot
screenshot
screenshot
iPhone simulator
Instruments
Coding Objective C
•   Small extention to ANSI C

•   About ten new reserved words

•   Syntactical changes influenced by SmallTalk

•   Used ...
[object method:parameters]
Defining interfaces
@interface ClassName : SuperClassName
{
	 int	 	 	 count;
	 int	 	 	 data;
	 NSString*	 aString;
}

@pr...
Defining classes
#import "ClassName.h"

@implementation SomeClass

@synthesize aString;

-   (ClassName*) initWithSome:(NSS...
Tricky stuff
Delegates
When you call a API class, you often send a reference to your self or some
other class which will r...
A walkthrough of the
example application
• Where am I?
 • What´s the address?
• What is the route home?
• When does the buss actually
  arrive?
•   Create a project in xCode, create GUI

•   Write some code and connect the GUI to it

•   Use core location

•   Get s...
Getting started
•Create project
•Add some controls
•Run in simulator
[screencast]
do something...
•Connect the controls and
 the code
•Write a simple message in
 the text field
•Connect the controls and
 the code
•Write a simple message in
 the text field
[screencast]
Using Core Location
•Wifi-hotspots
•Wifi-hotspots

•Base stations
•Wifi-hotspots

•Base stations

•A-GPS
Core Location


                Basestasjoner




CLLocation
                Wifi-hotspots
Manager




                   A...
Core Location


                              Basestasjoner




Objective-C   CLLocation
                              Wifi...
Core Location


                                                   Basestasjoner




              Register the class




...
Core Location


                                                   Basestasjoner




              Register the class

   ...
Core Location


                                                   Basestasjoner




              Register the class

   ...
Core Location


                                                    Basestasjoner




              Register the class

  ...
Core Location


                                                    Basestasjoner




              Register the class

  ...
Core Location


                                                    Basestasjoner




              Register the class

  ...
Core Location


                                                    Basestasjoner




              Register the class

  ...
Core Location


                                                    Basestasjoner




              Register the class

  ...
Core Location


                                                    Basestasjoner




              Register the class

  ...
@interface LocationController : NSObject <CLLocationManagerDelegate> {
	 CLLocationManager *locationManager;
	 id delegate...
@implementation LocationController

@synthesize locationManager, delegate;

// Constructor.
- (id) init {
    self = [supe...
[..]

locationController = [[LocationController alloc]init];
locationController.delegate = self;

[..]

[locationControlle...
Parsing XML
XML parsing
Event based XML parsing:
- (void)parser:(NSXMLParser *)parser didStartElement:
(NSString *)elementName

- (voi...
<DISMessages SubscriptionID="1">

  <DISDeviation TimeStamp="2009-04-27T13:17:10.201+02:00">
    <DISID>Stortinget</DISID>...
//
//   ArrivalInfo.h
//   rOOts2
//
//   Created by Tobias K Torrissen on 4/27/09.
//   Copyright 2009 __MyCompanyName__....
//
//    ArrivalInfo.m
//    rOOts2
//
//    Created by Tobias K Torrissen on 4/27/09.
//    Copyright 2009 __MyCompanyNam...
#import <Foundation/Foundation.h>
#import "ArrivalInfo.h"
#import "ROOts2AppDelegate.h"



@interface RealTimeParser : NSO...
// called whenever an start element is reached.
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementNa...
NSURL *url = [[NSURL alloc] initWithString:@"http://
www.sis.trafikanten.no:8088/xmlrtpi/dis/request?DISID=SN
$03011330"];...
How to get
 into iPhone
development
• You need to
  register...
• You need to
  register...
 •   Apple ID
• You need to
  register...
 •   Apple ID

 •   iPhone Developer
• You need to
  register...
 •   Apple ID

 •   iPhone Developer

 •   iPhone Developer
     Program
•   Personal
    •   99$

    •   can distribute through appstore
•   Personal
    •   99$

    •   can distribute through appstore

•   Enterprise
    •   299$

    •   can not distribute...
?
•   well...




?
•   well...




?
    •   The phone is
        amazing.
•   well...




?
    •   The phone is
        amazing.

    •   Xcode is OK
•   well...




?
    •   The phone is
        amazing.

    •   Xcode is OK

    •   The politics are
        mindboggeli...
•   well...




?
    •   The phone is
        amazing.

    •   Xcode is OK

    •   The politics are
        mindboggeli...
News in iPhone 3.0
•   peer-to-peer connections over Bonjour;

•   an app interface for hardware accessories;

•   access ...
Thank you!
Networking
NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc] init];
NSString *msgLength = [NSString stringWithFormat:@"%...
NSString *soapMessage = [NSString stringWithFormat:
 @"<?xml version="1.0" encoding="utf-8"?>n"
 "<soap:Envelope xmlns:xsi...
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Intro to iPhone development
Upcoming SlideShare
Loading in...5
×

Intro to iPhone development

1,600

Published on

Published in: Technology, News & Politics
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,600
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
79
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • Splashscreen som er oppe mens vi venter p&amp;#xE5; at alle setter seg ned.



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



    Det h&amp;#xE6;r f&amp;#xE5;redraget handler om utvikling for iphone.
    VI kommer innom en del ulike teknologier i l&amp;#xF8;pet av de neste 40 minuttan.



    P&amp;#xE5; sluttn av foredraget har vi litt tid till sp&amp;#xF8;rsm&amp;#xE5;l.
  • Litt om megselv.
    Tobias K Torrissen
    Jobbet med programmering og systemutvikling i 11 &amp;#xE5;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 &amp;#xE5;r siden
    Iphone sin skjerm er er ca 9 cm stor og har en oppl&amp;#xF8;sning p&amp;#xE5; 480x320 pixels
    GPU:en trengs For &amp;#xE5; kunne st&amp;#xF8;tte Open GL ES



    Alt i alt: En kjempespennende maskin &amp;#xE5; jobbe med!!



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



    Alt i alt: En kjempespennende maskin &amp;#xE5; jobbe med!!



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



    Alt i alt: En kjempespennende maskin &amp;#xE5; jobbe med!!



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



    Alt i alt: En kjempespennende maskin &amp;#xE5; jobbe med!!



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



    Alt i alt: En kjempespennende maskin &amp;#xE5; jobbe med!!



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



    Alt i alt: En kjempespennende maskin &amp;#xE5; jobbe med!!



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



    Alt i alt: En kjempespennende maskin &amp;#xE5; jobbe med!!



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



    Alt i alt: En kjempespennende maskin &amp;#xE5; 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&amp;#xE6;rmere p&amp;#xE5; appen. [kj&amp;#xF8;r film]
    Snakk deg gjennom applikasjonen. (Ikke fortell hvilke tjenester som blir brukt)
  • F&amp;#xF8;r vi g&amp;#xE5;r konkret til verks er det greit &amp;#xE5; se hvilke delproblemer vi identifiserte. Hva var det vi m&amp;#xE5;tte f&amp;#xE5; p&amp;#xE5; plass.
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch m&amp;#xE5;tte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten m&amp;#xE5;tte vi jo p&amp;#xE5; en eller annen m&amp;#xE5;te ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch m&amp;#xE5;tte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten m&amp;#xE5;tte vi jo p&amp;#xE5; en eller annen m&amp;#xE5;te ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch m&amp;#xE5;tte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten m&amp;#xE5;tte vi jo p&amp;#xE5; en eller annen m&amp;#xE5;te ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch m&amp;#xE5;tte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten m&amp;#xE5;tte vi jo p&amp;#xE5; en eller annen m&amp;#xE5;te ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch m&amp;#xE5;tte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten m&amp;#xE5;tte vi jo p&amp;#xE5; en eller annen m&amp;#xE5;te ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch m&amp;#xE5;tte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten m&amp;#xE5;tte vi jo p&amp;#xE5; en eller annen m&amp;#xE5;te ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Dette er ikke en enkelt system. Skulle vi ha implementert dette fra scratch m&amp;#xE5;tte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten m&amp;#xE5;tte vi jo p&amp;#xE5; en eller annen m&amp;#xE5;te ha skaffet oss oversikt over rutetider og sanntidsinformasjon
  • Tobias:
    N&amp;#xE5; skal vi g&amp;#xE5; 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&amp;#xE5;r linjene g&amp;#xE5;r, (i realtid)
    I tillegg bruke vi lokaliseringsfunktionen i iPhone for &amp;#xE5; f&amp;#xE5; posisjonering (klikk)
    noen av disse webtjenestene mangler gode programatiske API:er
    VI bruker Yahoo pipes for &amp;#xE5; f&amp;#xE5; ut dataen vi &amp;#xF8;nsker i XML format.
    La oss g&amp;#xE5; litt n&amp;#xE6;rmere in p&amp;#xE5; 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&amp;#xE5;r linjene g&amp;#xE5;r, (i realtid)
    I tillegg bruke vi lokaliseringsfunktionen i iPhone for &amp;#xE5; f&amp;#xE5; posisjonering (klikk)
    noen av disse webtjenestene mangler gode programatiske API:er
    VI bruker Yahoo pipes for &amp;#xE5; f&amp;#xE5; ut dataen vi &amp;#xF8;nsker i XML format.
    La oss g&amp;#xE5; litt n&amp;#xE6;rmere in p&amp;#xE5; 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&amp;#xE5;r linjene g&amp;#xE5;r, (i realtid)
    I tillegg bruke vi lokaliseringsfunktionen i iPhone for &amp;#xE5; f&amp;#xE5; posisjonering (klikk)
    noen av disse webtjenestene mangler gode programatiske API:er
    VI bruker Yahoo pipes for &amp;#xE5; f&amp;#xE5; ut dataen vi &amp;#xF8;nsker i XML format.
    La oss g&amp;#xE5; litt n&amp;#xE6;rmere in p&amp;#xE5; 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&amp;#xE5;r linjene g&amp;#xE5;r, (i realtid)
    I tillegg bruke vi lokaliseringsfunktionen i iPhone for &amp;#xE5; f&amp;#xE5; posisjonering (klikk)
    noen av disse webtjenestene mangler gode programatiske API:er
    VI bruker Yahoo pipes for &amp;#xE5; f&amp;#xE5; ut dataen vi &amp;#xF8;nsker i XML format.
    La oss g&amp;#xE5; litt n&amp;#xE6;rmere in p&amp;#xE5; hver enkelt komponent
  • Tobias:
    Lansert 6 mars 2008
    Samme sdk som utviklerne p&amp;#xE5; apple jobber med
    Programmering I Objective C (Klassisk C med noen utvidelser for &amp;#xE5; st&amp;#xF8;tte objektorientering)
    SDK:en best&amp;#xE5;r av (klikk)
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    en rekke bibliotek
    La oss se litt p&amp;#xE5; utviklings milj&amp;#xF8;et.
  • Tobias
    SDK:n inneh&amp;#xE5;ller et relativt sofistikert utviklingsmilj&amp;#xF8;



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



    La oss se litt p&amp;#xE5; 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&amp;#xE5; fort over til neste!!
  • Roger: Mulighet &amp;#xE5; bruke en rekke standard gui komponenter som vi kjenner igjen fra de innebygde applikasjonene p&amp;#xE5; iphone
  • Roger: Skaper grensesnittet gjennom drag n drop
  • Roger: Gode muligheter for &amp;#xE5; 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&amp;#xE5;r du utvikler iphone appen din
    lar deg teste og eventuellt debugge koden din i ett simulert iphone milj&amp;#xF8;
    n&amp;#xE5;r alt kommer til allt s&amp;#xE5; viser det seg att det finns ganske store forskjeller mellom simulatorn og selve iphonen, s&amp;#xE5; du m&amp;#xE5; belage deg p&amp;#xE5; &amp;#xE5; debugge mot iphonen ogs&amp;#xE5;
  • Roger: En virtuell instanse av iphonen till &amp;#xE5; pr&amp;#xF8;ve koden din p&amp;#xE5;, uten noe ventetid.
  • Roger:
    Mulighet til &amp;#xE5; aktivere breakpoints i koden slik at du kan kj&amp;#xF8;re step-by-step debugging av ditt program.
    Her har man ogs&amp;#xE5; mulighet til &amp;#xE5; granske objekt.
    Gre oversikt over ulike tr&amp;#xE5;der
  • Roger: Egen innebygged GDB terminal
  • Roger: Mulighet til &amp;#xE5; granske minnet
  • Roger:
    N&amp;#xE5;r man har funnet alle buggene som gj&amp;#xF8;r at programmet crasher, s&amp;#xE5; m&amp;#xE5; man finne andre brister.
    Dette har apple gjort veldig lett for oss gjennom instruments.

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



    Du har mulighet till &amp;#xE5; spare ett eget oppsett av m&amp;#xE5;lere
    DU har ogs&amp;#xE5; mulighet til &amp;#xE5; spare en kj&amp;#xF8;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&amp;#xE5;tte vi ha laget oss et internt adresseregister som mapper fra koordinater til adresser og dessuten m&amp;#xE5;tte vi jo p&amp;#xE5; en eller annen m&amp;#xE5;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&amp;#xE5; 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 &amp;#xE5; rekkevidde.
    A-GPS:
    vangli GPS er for tregt og str&amp;#xF8;mkrevende p&amp;#xE5; grund av krevende beregninger.
    For at dette skal virke m&amp;#xE5; man v&amp;#xE6;re tilknyttet en basestasjon som st&amp;#xF8;tter A-GPS.
    AGPS flytter de tyngste beregningene ut till basestasjonene



    Core lokation er grejt &amp;#xE5; jobbe med, la oss se litt p&amp;#xE5; hvordan vi f&amp;#xE5;r ut posisjonen i v&amp;#xE5;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 &amp;#xE5; rekkevidde.
    A-GPS:
    vangli GPS er for tregt og str&amp;#xF8;mkrevende p&amp;#xE5; grund av krevende beregninger.
    For at dette skal virke m&amp;#xE5; man v&amp;#xE6;re tilknyttet en basestasjon som st&amp;#xF8;tter A-GPS.
    AGPS flytter de tyngste beregningene ut till basestasjonene



    Core lokation er grejt &amp;#xE5; jobbe med, la oss se litt p&amp;#xE5; hvordan vi f&amp;#xE5;r ut posisjonen i v&amp;#xE5;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 &amp;#xE5; rekkevidde.
    A-GPS:
    vangli GPS er for tregt og str&amp;#xF8;mkrevende p&amp;#xE5; grund av krevende beregninger.
    For at dette skal virke m&amp;#xE5; man v&amp;#xE6;re tilknyttet en basestasjon som st&amp;#xF8;tter A-GPS.
    AGPS flytter de tyngste beregningene ut till basestasjonene



    Core lokation er grejt &amp;#xE5; jobbe med, la oss se litt p&amp;#xE5; hvordan vi f&amp;#xE5;r ut posisjonen i v&amp;#xE5;rt program
  • Roger
    Core location er ett stort rammeverk
    CLLocationManager er interfacet
    (klikk klikk klikk)
    Kan nevne at:
    Posisjoner inneholder, nuverende posisjon, forrige m&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5;lte posisjon, accuracy, h&amp;#xF8;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&amp;#xE5; apple.
    iPhone developer - tilgang til SDK osv
    iPhone developer program - tilgang til appstore
  • Apple ID registrering p&amp;#xE5; apple.
    iPhone developer - tilgang til SDK osv
    iPhone developer program - tilgang til appstore
  • Apple ID registrering p&amp;#xE5; apple.
    iPhone developer - tilgang til SDK osv
    iPhone developer program - tilgang til appstore
  • Apple ID registrering p&amp;#xE5; 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&amp;#xF8;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&amp;#xF8;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&amp;#xF8;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&amp;#xF8;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&amp;#xF8;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&amp;#xF8;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&amp;#xF8;rsm&amp;#xE5;l?



    OCUnit - unittesting.
  • Intro to iPhone development

    1. 1. an introduction to iPhone development Tobias Torrissen Know IT Objectnet
    2. 2. • Tobias Torrissen
    3. 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. 4. iPhone 3GS
    5. 5. • 3GS • Wi-Fi (802.11b/g) • Bluetooth • Accelorometer • 600 MHz • GPU • 256 MB DRAM • A-GPS
    6. 6. The problem
    7. 7. Usecase
    8. 8. Usecase
    9. 9. Usecase
    10. 10. Usecase
    11. 11. Usecase
    12. 12. • Idea: let´s create an app that helps you find your way home. • [screencast]
    13. 13. Challenges
    14. 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. 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. 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. 17. Architecture
    18. 18. positioning
    19. 19. reverse geocoding positioning route info
    20. 20. reverse geocoding positioning route info
    21. 21. reverse geocoding positioning route info realtime info
    22. 22. iPhone SDK
    23. 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. 24. Xcode
    25. 25. Interface builder
    26. 26. screenshot
    27. 27. screenshot
    28. 28. screenshot
    29. 29. screenshot
    30. 30. screenshot
    31. 31. screenshot
    32. 32. screenshot
    33. 33. screenshot
    34. 34. iPhone simulator
    35. 35. Instruments
    36. 36. Coding Objective C
    37. 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. 38. [object method:parameters]
    39. 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. 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. 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. 42. A walkthrough of the example application
    43. 43. • Where am I? • What´s the address? • What is the route home? • When does the buss actually arrive?
    44. 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. 45. Getting started
    46. 46. •Create project •Add some controls •Run in simulator [screencast]
    47. 47. do something...
    48. 48. •Connect the controls and the code •Write a simple message in the text field
    49. 49. •Connect the controls and the code •Write a simple message in the text field [screencast]
    50. 50. Using Core Location
    51. 51. •Wifi-hotspots
    52. 52. •Wifi-hotspots •Base stations
    53. 53. •Wifi-hotspots •Base stations •A-GPS
    54. 54. Core Location Basestasjoner CLLocation Wifi-hotspots Manager A-GPS
    55. 55. Core Location Basestasjoner Objective-C CLLocation Wifi-hotspots Class Manager A-GPS
    56. 56. Core Location Basestasjoner Register the class Objective-C CLLocation Wifi-hotspots Class Manager A-GPS
    57. 57. Core Location Basestasjoner Register the class Start positioning Objective-C CLLocation Wifi-hotspots Class Manager A-GPS
    58. 58. Core Location Basestasjoner Register the class Start positioning Objective-C CLLocation Wifi-hotspots Class Manager A-GPS
    59. 59. Core Location Basestasjoner Register the class Start positioning Objective-C New position found CLLocation Wifi-hotspots Class Manager A-GPS
    60. 60. Core Location Basestasjoner Register the class Start positioning Objective-C New position found CLLocation Wifi-hotspots Class Manager A-GPS
    61. 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. 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. 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. 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. 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. 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. 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. 68. Parsing XML
    69. 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. 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. 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. 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. 73. #import <Foundation/Foundation.h> #import "ArrivalInfo.h" #import "ROOts2AppDelegate.h" @interface RealTimeParser : NSObject { ArrivalInfo *currentArrivalInfo; NSMutableString *valueInProgress; rOOts2AppDelegate *delegate; } - (RealTimeParser *) initRealTimeParser; @end
    74. 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. 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. 76. How to get into iPhone development
    77. 77. • You need to register...
    78. 78. • You need to register... • Apple ID
    79. 79. • You need to register... • Apple ID • iPhone Developer
    80. 80. • You need to register... • Apple ID • iPhone Developer • iPhone Developer Program
    81. 81. • Personal • 99$ • can distribute through appstore
    82. 82. • Personal • 99$ • can distribute through appstore • Enterprise • 299$ • can not distribute through appstore
    83. 83. ?
    84. 84. • well... ?
    85. 85. • well... ? • The phone is amazing.
    86. 86. • well... ? • The phone is amazing. • Xcode is OK
    87. 87. • well... ? • The phone is amazing. • Xcode is OK • The politics are mindboggeling
    88. 88. • well... ? • The phone is amazing. • Xcode is OK • The politics are mindboggeling • Look out for Android
    89. 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. 90. Thank you!
    91. 91. Networking
    92. 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. 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];
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×