Guide: AppleScript i Xcode

Denne guiden introduserer deg for Apples utviklerverktøy Xcode. Steg for steg skal vi lage et enkelt program med AppleScript i Xcode. Det er en fordel med kjennskap til AppleScript, men ikke nødvendig.

Xcode er et kraftig verktøy, og for nye utviklere kan det virke fryktelig komplisert. Men som vi skal se skal det ikke så mye til for å sette seg inn i det. Med Developer Tools kan du designe programmet ditt, skrive koden, kompilere, debugge og mye mer.

Har du ikke installert Xcode finner du installeringsfiler på en DVDen som fulgte med maskinen din eller så kan du laste den ned fra Apples developer sider: http://developer.apple.com/tools/xcode/.

I denne guiden skal vi lage et enkelt Cocoa-program i AppleScript som henter de siste innleggene fra forumet på her på mac1.no og viser en link til disse. Link til kildekoden finner du på bunnen av denne artikkelen.

Når du har åpnet Xcode går du i «File»-menyen og velger «New Project» (Shift+Eple+N)

1) Xcode ber deg da spesifisere hva slags program du vil lage. Velg «AppleScript Application» og klikke på «Next».

2) Kall programmet f.eks. «Mac1_AS_Guide» og angi hvor du vil lagre prosjektet. Klikk «Finish».

Prosjektet ditt åpner seg nå i Xcode.

Kolonnen til venstre inneholder alle filene i prosjektet. Vi skal her forholde oss til to av disse: «Mac1_AS_Guide.applescript» som ligger i «Scripts»-mappa og «MainMenu.nib» som ligger i «Resources»-mappa.

«Mac1_AS_Guide.applescript»-fila er et vanlig applescript som du kanskje har arbeidet med tidligere i Script Editor eller Automator. «MainMenu.nib» er en Nib-fil. Denne fila inneholder programmets grafiske brukergrensesnitt og koblinger mellom de forskjellige elementene (knapper, tabeller osv.) og koden i scriptet.

Programmet vårt skal som sagt vise de siste innleggene i forumet på mac1.no. Til det tranger vi en tabell som viser innleggene og en knapp for å oppdatere innholdet. Dette lager vi i programmet Interface Builder som følger med Xcode.

3) Dobbeltklikk på fila «MainMenu.nib». Denne åpner seg da i Interface Builder.

I vinduet «MainMenu.nib» ser du alle elementene i Nib-fila: «File's Owner», «First Responder», «MainMenu» og «Window». I denne guiden skal vi kun forholde oss til den siste. «MainMenu» er programmets menylinje og «Window» er hovedvinduet i programmet.

I Interface Builder har du to viktige paletter: «Cocoa Controls» («Tools»-menyen / «Palettes» / «Show Palettes») og «Inspector» («Tools»-menyen / «Show Inspector»). «Cocoa Controls» inneholder alle de vanligste Cocoa-objektene på operativsystemet, slik som vinduer, knapper, slidere, tabeller, menyer, tekstfelt osv. Disse kan du klikke og dra inn i andre objekter, for eksempel inn i et vindu. «Inspector»-paletten viser deg egenskapene til objektet du har valgt.

Vi trenger en tabell i programmet for å vise de siste innleggene fra mac1.no.

4) I toolbaren til «Cocoa Controls»-paletten velger du «Cocoa Data Views»

Her finner du blant annet «NSTableView». Dra dette objektet inn i hovedvinduet. Du kan forandre størrelsen på objektet ved å dra i hjørnene.

Vi trenger også en knapp for å oppdatere innholdet.

5) Velg «Cocoa Controls and Indicators» i toolbaren til «Cocoa Controls»-paletten.

Her finner du et utall av knapper og indikatorer. Dra objektet «NSButton» inn i vinduet.

Når du markerer et objekt i vinduet vil du se at innholdet i inspectoren forandrer seg. Tabellen vår har to kolonner. Vi trenger bare en. Marker tabellen og sjekk inspectoren. Øverst er menyvalget «Attributes» valgt (Eple+1). Dette er en oversikt over egenskapene til tabellen.

6) I feltet «Coloumns» står det nå «2». Forandre dette til «1». (Vi skal kun ha ett synlig felt.) Du kan også gjøre kolonnen bredere ved å dra skillet til høyre. Det skal ikke være mulig å velge en tom rad i tabellen. For å forhindre dette fjerner du markeringen på «Empty Selection» i inspectoren. Det skal heller ikke være mulig å redigere innholdet i tabellen. For å forhindre dette markerer vi headeren til kolonnen og fjerner avmerkingen for «Editable» i inspectoren.

Vi må nå koble tabellen vår til applescriptet. Det gjør vi i inspectoren under menyvalget «Applescript». (Eple+8)
Merk: Tabellen vår ligger inni et NSScrollView. Klikker du en gang på den velges ScrollView, klikker du to ganger velges tabellen vår (NSTableView).

7) Dobbeltklikk på tabellen slik at det står «NSTableView Inspector» øverst i inspectoren. I Applescript-inspectoren vises nå øverst et navnefelt. Kall tabellen f.eks. «ForumTabell». Dette navnet skal vi bruke senere i applescriptet. Huk så av feltet «Nib» og «double clicked» og velg «Mac1_AS_Guide.applescript» nederst.

Det vi har gjort nå er å navngi tabellen og fortelle programmet at at scriptet «Mac1_AS_Guide.applescript» skal håndtere noe som heter «Awake From Nib» og dobbeltklikking for tabellen vår. Awake From Nib definerer hva som skal skje når tabellen i nib-fila blir lastet inn i programmet når dette startes. Dette koder vi i scriptet.

Knappen vår heter nå bare «Button». Det må vi forandre. Marker knappen og sjekk inspectoren. Velg menyvalget «Attributes» (Eple+1). Dette er en oversikt over tittel på knappen, eventuelt ikon, hurtigkommando, størrelse osv.

8) Forandre tittelen til «Oppdater». Det er mulig at du må gjøre knappen litt bredere for å få plass til tittelen. Velg så menyvalget «Applescript» (Eple+8). Kall knappen for «OppdaterKnapp» og huk av for «clicked». Velg «Mac1_AS_Guide.applescript» nederst.

Vinduet ditt ser nå cirka slik ut:

9) Lagre forandringene i nib-fila og klikk på knappen «Edit» nederst i inspectoren. Scriptet i Xcode-prosjektet vil da åpne seg igjen.

Programmet har nå satt inn en liten kode-snutt i scriptet vårt etter at vi forandret på nib-fila:
Kode:
on awake from nib theObject
(*Add your script here.*)
end awake from nib

on clicked theObject
(*Add your script here.*)
end clicked

on double clicked theObject
(*Add your script here.*)
end double clicked

«theObject» inneholder en referanse til objektet. I vårt tilfelle er det enten et TableView som heter «ForumTabell» eller en NSButton som heter «OppdaterKnapp». I scriptet kommer vi til å henvise til tabellen ofte. Det er derfor lurt å lage en global variabel som henviser til tabellen. Globale variabler kalles i applescript en property. Vi definerer disse øverst i scriptet.

Skriv inn følgende kode:
Kode:
property global_tabell : missing value

Vi kan nå sette variablene «global_tabell» til tabellen i awake from nib:
Kode:
on awake from nib theObject
set global_tabell to theObject
log "awake from nib. global_tabell definert."
end awake from nib

Merk: Vi har kun satt ett object i Interface Builder til awake from nib. Bruker vi flere må vi skrive kode som skiller mellom de forskjellige objektenen i on awake from nib.

Kommandoen «log» skriver en kommentar i Run Log og er en fin måte å sjekke hva programmet gjør på.

Vi må nå lage et data objekt som kan holde på og vise innholdet i tabellen. on awake from nib er et fint sted å gjøre dette. Vi definerer en data kilde med to kolonner, en for tittelen og en for adressen. Kun tittel-kolonnen er synlig i programmet.
Kode:

on awake from nib theObject
set global_tabell to theObject
-- Lag ny data source:
set DataKilden to make new data source at end of data sources with properties {name:"TabellData"}
-- Lag en kolonne:
make new data column at the end of data columns of DataKilden with properties {name:"Tittel", sort order:descending, sort type:alphabetical, sort case sensitivity:case insensitive}
make new data column at the end of data columns of DataKilden with properties {name:"Adresse", sort order:descending, sort type:alphabetical, sort case sensitivity:case insensitive}
-- Koble data sourcen til tabellen:
set data source of theObject to DataKilden
OppdaterTabell()
end awake from nib

Vi må nå lage funksjoner for å hente innhold fra mac1.no og sette dette inn i tabellen. Dette gjør vi med tre funksjoner: OppdaterTabell(), HentUrl(), BehandleInnhold() og SettInnData().

Funksjonen OppdaterTabell() skal bruke funksjonen HentUrl() for å laste ned innholdet, behandle dette med BehandleInnhold() og bruke SettInnData() for å sette innholdet inn i tabellen.

Funksjonen OppdaterTabell() kan se slik ut:
Kode:
on OppdaterTabell()
-- Tøm tabellen:
delete every data row of data source of global_tabell
-- Definer en variabel til innholdet og hent det:
set innholdet to HentUrl("https://mac1.no/")
-- Behandle innholdet:
BehandleInnhold(innholdet)
end OppdaterTabell

HentUrl(): For å hente innhold fra nettet kan vi bruke Unix-programmet curl. For å kjøre shell-scripts via applescript kan vi bruke kommandoen «do shell script()».

Kode:
on HentUrl(adresse)
set ShellScriptet to "curl '" & adresse & "'"
set Resultatet to do shell script (ShellScriptet)
-- Variabelen Resultatet inneholder nå HTML-koden til url'en Adresse.
return Resultatet
end HentUrl

Vi må nå filtrere bort alt det vi ikke er interessert i og skille ut tittelen og adressen til hver post. Det gjør vi i BehandleInnhold():

Kode:
on BehandleInnhold(innholdet)
-- Variabelen Innholdet inneholder hele nettsiden.
-- Vi er kun interessert i forum-biten. Den befinner seg mellom taggene '<div class=\"blockcontent\"><div class=\"item-list\"><ul>' og '</ul></div></div>'
-- Dette er litt risikabelt, hvis mac1.no forandrer på strukturen vil ikke programmet funke!
set AppleScript's text item delimiters to "<div class=\"blockcontent\"><div class=\"item-list\"><ul>"
set AlleForumposter to text item 2 of innholdet
set AppleScript's text item delimiters to "</ul></div></div>"
set AlleForumposter to text item 1 of AlleForumposter
set AppleScript's text item delimiters to "<li>"
set AlleForumposter to text items of AlleForumposter
-- Variabelen AlleForumposter inneholder nå en liste med alle postene i.
-- Vi går nå igjennom hver enkelt og skiller ut tittelen og adressen.
repeat with i from 2 to (count of AlleForumposter)
set HelePosten to (item i of AlleForumposter)
set AppleScript's text item delimiters to "<a href=\""
set DennePosten to text item 2 of (item i of AlleForumposter)
set AppleScript's text item delimiters to "\"> <"
set DenneUrl to "https://mac1.no" & text item 1 of (DennePosten)
set AppleScript's text item delimiters to "title=\""
set DenneTittel to text item 2 of (HelePosten)
set AppleScript's text item delimiters to "\">"
set DenneTittel to text item 1 of (DenneTittel)
-- Sett inn innholdet i tabellen.
SettInnData(DenneTittel, DenneUrl)
end repeat
end BehandleInnhold

Funksjonen SettInnData() mottar tittel og url for hver post og skal sette dette inn i tabellen:

Kode:
on SettInnData(Tittel, adresse)
-- Lag en ny rad i tabellen og sett inn innholdet:
set tabell_rad to make new data row at the end of data rows of data source of global_tabell
set contents of data cell "Tittel" of tabell_rad to Tittel
set contents of data cell "Adresse" of tabell_rad to adresse
end SettInnData

Det siste som gjenstår er å behandle dobbeltklikk i tabellen og bruk av «Oppdater»-knappen. Når brukeren klikker «Oppdater» skal programmet gjøre det det gjør under oppstart, nemlig å hente de siste innleggene fra mac1.no og sette dem inn i tabellen. Funksjonen OppdaterTabell() gjør dette.

Kode:
on clicked theObject
OppdaterTabell()
end clicked

Ved dobbeltklikk henter vi ut adressen fra den valgte raden og åpner denne i en nettleser:

Kode:
on double clicked theObject
set DenneRaden to selected data row of theObject
set DenneUrl to content of data cell "Adresse" of DenneRaden
try
open location DenneUrl
end try
end double clicked

Det var det.

For å teste programmet må du kompilere og kjøre det. Det gjør du i menyen «Build» / «Build and Run» (Eple+R)

Det var det! Lurer du på noe så følger det med en omfattende dokumentasjon med Xcode. Gå i «Help»-menyen og velg «Documentation». Vil du bygge ut programmet er det bare fantasien din som setter grenser.

God koding :)

Mer info:
Xcode: http://developer.apple.com/tools/xcode/
do shell script: http://developer.apple.com/technotes/tn2002/tn2065.html
Apples brukerforum: http://search.lists.apple.com/

Edit:
Rettet link.

illuminated

morro.
Dette skal jeg teste ut!

"Vi har ansvar ikke bare for det vi gjør, men også det vi unnlater å gjøre."

Thonhaugen

:S

VMacca

Et lite kodeprosjekt på NORSK! Jeg må teste dette . Har litt erfaring med websidekoding, men har hatt lyst til å utvikle programmer helt siden jeg oppdaget mac og Xcode! =)

"Computers are like a bicycle for our minds."

Macbook Pro 15.4 inch,2.16GHz Core Duo,1GB-ram,100GB-hd,265MB-grafikk

Cryptography

Gøy. Får titte litt nermere på dette en dag.

smacmac

Kjempefin guide! Har lenge ønsket å lage noe sånnt, men har ikke fått det til når jeg har prøvd.

iEinar

Hei

Jeg klarer ikke få tak i xcode fra apple sine sider..Det kommer en feilmeldingen:
The requested application was not found on this server

hanssmed

finner ikke "editable" i inspectoren.. og hva er headeren? kommer meg ikke videre. ellers kjempebra!

hanssmed

ok fikk til! trenger ikke hjelp. ellers takk

bjarnearbeids bilde

bjarnearbeid

Visual Basic flashback! :D
No fikk eg lyst å lage meir ;)

Fikk error though:
[Session started at 2006-11-08 18:16:06 +0100.]
2006-11-08 18:16:07.585 Mac1_AS_Guide[6664] "awake from nib. global_tabell definert."
2006-11-08 18:16:07.592 Mac1_AS_Guide[6664] [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key dataSources.
2006-11-08 18:16:09.279 Mac1_AS_Guide[6664] "awake from nib. global_tabell definert."
[Session started at 2006-11-08 18:16:42 +0100.]
2006-11-08 18:16:43.294 Mac1_AS_Guide[6670] "awake from nib. global_tabell definert."
2006-11-08 18:16:43.302 Mac1_AS_Guide[6670] [ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key dataSources.
2006-11-08 18:16:45.407 Mac1_AS_Guide[6670] "awake from nib. global_tabell definert."

MacTobbe

Høres fett ut ;) må testes i kveld :)

cheers..

http://pspthemes.deviantart.com

nick

b0zie: Har du en variabel som heter "dataSources"?

Bruk loggen for å debugge. Forsøk å logge det programmet gjør, da kan du finne ut nøyaktig hvor feilen oppstår.

bjarnearbeids bilde

bjarnearbeid

Nei det har eg ikkje..
Programmet fungerte problemfritt, men fikk den error'en der under debugging :)

Larsaronen

Fin guide..
Noen oppdateringer som trengs kanskje.. ihvertfall stemte ikke alt overens med min xcode versjon..

får også feilmeldingen:

Applescript error!

curl: (1) Unsupported protocol: http (1)

How to fix?

  • Skriv ut artikkel
  • Abonner med RSS

Alt om iPad, iPhone og iOS

Nettradio i iTunes

Nettradio i iTunes
130 norske radiokanaler.
Få de mest populære norske, svenske og danske radiokanalene inn i en egen spilleliste i iTunes.
Oppdatert 13. mai