Lærer iOS som Android-utvikler

Som en veteran Android-utvikler har jeg alltid vært nysgjerrig på iOS-plattformen. Er Objektiv-C vanskelig å lære? Er det virkelig mye lettere å lage et vakkert brukergrensesnitt i iOS?

Jeg bestemte meg for at den beste måten er å skrive en app på begge plattformene og sammenligne. En app som jeg faktisk lanserer, så jeg opplever hele prosessen, fra koding til UI-design til distribusjon. Resultatet er Heart Collage, tilgjengelig i både Apple App Store og Google Play.

Her er tankene mine etter å ha lært iOS i to måneder.

Oppsettet

Jeg skrev en universell app i iOS 6, med autooppsett og storyboard. Jeg valgte iOS 6 for de nye funksjonalitetene som UICollectionView og UIActivityViewController. Autooppsett og storyboard slynget seg fra iOS 6-avgjørelsen. Siden jeg var på den nyeste versjonen, kan jeg like godt dra nytte av de nyeste verktøyene.

Læringskurve

De tre første ukene var smertefulle. Ikke bare jeg visste ingenting, men jeg manglet ordforrådet til å stille spørsmål. Jeg ville søke etter noe og finne fem Stack Overflow-tråder, som alle hørtes ut som relatert til det jeg trengte, men egentlig ikke. Det var veldig frustrerende.

Men ting endret seg den tredje uken. Da visste jeg hvilke klasser jeg brukte, så jeg forhåndsbetalte alle bildemanipulasjonssøk med UIImage, navigasjonssøk med UINavigationController. Jeg hadde også en viss grunnleggende forståelse av hvordan ting var organisert, og klarte å skumme og bedømme om en bestemt tråd var relevant.

Når jeg visste hvordan jeg skulle finne svar på internett, gikk utviklingshastigheten virkelig opp. Jeg følte at jeg faktisk kodet, i stedet for å gå inn i en vegg.

UI-redigering

Til å begynne med trodde jeg at jeg virkelig ville bli plaget av alle firkantete parentesene i Objekt-C, men jeg ble vant til syntaksen ganske raskt. Det som snublet meg opp var Interface Builder / Storyboard.

I både iOS og Android er det to måter å spesifisere layout: xml og kode. Forskjellen er at Android har lesbar xml. Ikke så mye i iOS.

Begge systemene bruker unike ID-er for å referere til de forskjellige komponentene. I Android definerer du IDen slik:

Byggesystemet samler alle ID-kodene og genererer unike ID-er i Java:

 offentlig statisk sluttklasse-id { 

offentlig statisk endelig int start_knapp = 0x7f08003b;

}

Hvis du vil se en visning i koden din, bruker du FindViewById:

 Knapp startButton = (Knapp) findViewById (R.id.start_button); 

I iOS genererer storyboard direkte de unike ID-ene i xml:

For å referere til en visning i koden din, definerer du først en IBOutlet i .h-filen din, går til storyboard, høyreklikker du drar visningen inn i visningskontrolleren. Dette forutsetter at du allerede har fortalt storyboard at dette vinduet er koblet til den visningskontrolleren, ellers vil ikke IBOutlet vises.

Det hele er fornuftig etter det faktum, men når jeg først begynte ville jeg dra og dra og dra og ikke kunne koble visningene. Noen ganger glemte jeg å spesifisere visningskontrolleren. Andre ganger glemte jeg å legge til IBOutlet. På sene kvelder glemte jeg det høyreklikk på dra, ikke bare dra.

Den vanskeligste delen er at jeg ikke kan sammenligne implementeringen min med prøvekode fordi det hele er visuelt. I Android ville jeg forskjellig hele prosjektet, koden og xml og alt, for å finne ut hva jeg savnet. XML produsert av Interface Builder / Storyboard er ikke diff-vennlig i det hele tatt.

Innebygde komponenter

Når jeg fikk tauene rundt UI-redigering, kunne jeg bygge de forskjellige skjermene for appen. Folk hevder at de innebygde komponentene i iOS er mye vakrere enn Android, men gapet har blitt betydelig redusert siden Ice Cream Sandwich. Visst, iOS UIPickerView er fremdeles mye deiligere å bruke enn Android Spinner, men de grunnleggende komponentene som knapper er ganske mye på nivå.

Det var en ting som var mye, mye lettere å bruke på iOS enn Android: forhåndsvisningen av kameraet. Heart Collage viser en firkantet kameraforhåndsvisning som du kan posere. I iOS kan jeg be om et forhåndsvisningsvindu i alle størrelsesforhold, og systemet beskjærer kameraet automatisk. I Android? Systemet strekker kameraet inn til sideforholdet til forhåndsvisningen. For å lage forhåndsvisning av et firkantet kamera måtte jeg gjøre forhåndsvisningsvinduet i samme størrelsesforhold som kameraets mating, og dekke opp noen deler slik at det ser ut til å være et firkant. Det var virkelig involvert. Hvem vil uansett ha en forvrengt kamerafôr? Beskjæring er den rette tingen å gjøre.

For resten finner jeg nesten alltid direkte korrespondanser: ImageView-kart til UIImageView, TextView-kart til UILabel, ListView er omtrent UITableView, og GridView ... vel GridView er interessant. Fram til iOS 5 er det ingen innebygd rutenettvisning. Du må bruke en UITableView og opprette cellen på hver rad selv. Jeg ble sjokkert da jeg hørte det. Antar jeg at jeg er bortskjemt med Android? Det har vi siden versjon 1! Heldigvis ble UICollectionView introdusert i iOS 6, og i motsetning til Android er det greit å målrette mot den nyeste OS-utgivelsen fordi de fleste brukere oppgraderer veldig raskt.

Dette bringer oss til den berømte fragmenteringsdebatten.

Fragmentering

Det er to typer fragmentering: OS-versjon og enhetsformfaktor.

OS-versjon

iOS er definitivt bedre posisjonert mot fragmentering av OS-versjoner, siden Apple er den eneste produsenten av alle iOS-enheter og de kontrollerer OTA-planen fullstendig.

Enhetsformfaktorer

Inntil nylig var enhetsformfaktoren ganske ensartet. Det er netthinne og ikke-netthinne, det er det. Ulike tetthet, samme aspektforhold. Samme sideforhold betyr at du fremdeles kan bruke et koordinatbasert layoutsystem og justere visningene dine i Interface Builder.

Alt var fersken frem til iPhone5. Plutselig er det et annet sideforhold, og Apple trengte noe kraftigere enn stivere og fjærer. Løsningen er autooppsett.

Auto-layout er en erklærende måte å spesifisere posisjonene til visningene dine. I stedet for å si, legg dette bildet 240 piksler fra toppen, sier du, senter loddrett. Systemet beregner xy-koordinatene basert på begrensningene dine, så det tilpasser seg godt til forskjellige formfaktorer.

Auto-layout høres bra ut på papiret, men det er virkelig klønete å bruke i praksis. I Interface Builder drar og slipper du fortsatt visningene, og XCode prøver å gjette intensjonen din. Det meste av tiden blir det galt, så jeg må fjerne de automatisk genererte begrensningene og lage mine egne. Jeg prøvde også å gjøre det i kode, men det er veldig ordalt og veldig enkelt å gjøre feil. Det visuelle formatet hjelper litt, men mesteparten av tiden vil jeg sentrere mine synspunkter, og det er ingen måte å spesifisere det i ASCII.

Dette er tiden da jeg virkelig savner Android. Systemet ble designet fra første dag for å håndtere flere formfaktorer, og du blir introdusert for konsepter som match_parent og wrap_content helt fra begynnelsen. Jeg erklærer utformingen min i xml, staver forholdet mellom visningene med menneskelige lesbare ID-er, og jeg kan enkelt bekrefte reglene mine når jeg trenger å legge til en visning. I iOS er jeg alltid i tvil når jeg slipper inn en ny visning. Hva gjorde det med de eksisterende visningene? Det er så kjedelig å klikke gjennom dem en etter en og undersøke alle begrensningene.

Kanskje det er en bedre måte. Men alle iOS-utviklervennene mine startet før iOS 6, før automatisk layout var tilgjengelig. De erklærer sine synspunkter i kode, beregner rammene for hånd og kjører i utgangspunktet sine egne layoutalgoritmer. Og det er ingen grunn til å konvertere når du har et system på plass, så jeg er på egen hånd på autooppsettfronten.

hensikter

En annen ting jeg savner med Android er intensjonssystemet. Både for navigasjon og integrering.

Navigasjon

For Heart Collage fanger jeg poseringene dine med kameraet, og erstatter deretter kameraaktiviteten med view collage-aktiviteten, og viser mosaikken. Dette er hva jeg gjør i Android:

 Intent intention = new Intent (dette, ViewCollageActivity.class); 

startActivity (hensikt);

bli ferdig();

Med andre ord legger jeg til visningskollasjeaktiviteten på aktivitetsbunken, og fjerner kameraaktiviteten ved å kalle finish ().

Det tok meg veldig lang tid å finne ut hvordan jeg skulle gjøre det i iOS. I storyboard skyver du mest av en ny visningskontroller på bunken ved å legge et segment til en knapp. Du kan også skyve et manuelt segment, og det er det jeg gjør etter at kameraet klikker på alle bildene. Den vanskelige delen er, hvordan spretter jeg den gamle visningskontrolleren? Hvis jeg skyver først, er den gamle visningskontrolleren ikke lenger på toppen av stabelen, så du kan ikke sprette den. Hvis jeg springer først, er den gamle visningskontrolleren ikke lenger på stabelen, og jeg har ikke lov til å be om et segment fra det.

Dette er øyeblikket da jeg tviler på om det var lurt å gå med storyboard. Det ser ut til å være designet for veldig enkle navigasjonsbehov, og til og med min firskjerms app er for komplisert til det. Jeg endte med å sprette et nivå høyere med et flagg for automatisk å videresende meg for å se på collagen. Litt av et hack, men jeg var for langt inn i storyboard til å ta ut og gjenskape alle visningene i xib. Spesielt siden jeg ikke har noen måte å kopiere og lime inn oppsettene på, så jeg må dra og slippe alt igjen.

Integrering

Etter at du har laget en Heart Collage, lar appen deg dele den med vennene dine. Dette er superenkelt på Android. Jeg oppretter bare en hensikt som sier at jeg vil dele et bilde, og systemet genererer automatisk listen over installerte apper som kan håndtere det. Det er en elegant måte å få en personlig og utvidbar opplevelse. Brukere kan dele kollasjene sine med alle apper de foretrekker, og jeg trenger ikke en gang å vite at de bruker den appen, enn si skaper et nytt integrasjonspunkt.

For deling gir iOS 6 en lignende funksjonalitet med UIActivityViewController. Jeg satte opp meldingen og bildet, og det får opp en liste over alternativer for deling. Den store forskjellen er at listen er kuratert av Apple, og ikke utvidbar av brukeren. Så alle vil se Sina Weibo som et alternativ, enten de bryr seg om det eller ikke.

Det er her Android virkelig skinner, den sømløse integrasjonen mellom apper, og som et resultat en veldig personlig opplevelse.

Fordeling

Betatesting

Endelig var appen min klar for betatesting. Jippi!

Her er trinnene for begge plattformene:

Android

  1. Sett sammen apk.
  2. Send det til noen venner.
  3. Det er ingen tredje trinn.

iOS

  1. Samle UUID fra venner.
  2. Lag klargjøringsprofil fra iOS dev portal.
  3. Legg til UUID for hver nye testenhet.
  4. Last ned reservasjonsprofil fra iOS dev portal.
  5. Sett sammen ipa.
  6. Profil for e-postlevering og ipa.

Den mest smertefulle delen er at jeg må legge til hver testenhet manuelt på tilbudsportalen, og deretter laste den ned til min lokale disk for å kompilere ipa. Så kjedelig.

Men om jeg vet nøyaktig hvem som kan kjøre appen min, og jeg trenger ikke bekymre meg for lekkasjer. Når du har sendt ut en apk for Android, har du ingen anelse om hvor den vil gå. Og det er egentlig ikke en god måte å begrense distribusjonen på.

Utgivelse

Og nå, det siste øyeblikket - utgivelse for å lagre. Ingen angst for Android i det hele tatt. Bare last opp, vent en times tid, så er den live. For iOS er det gjennomgangsprosessen.

Jeg vil gi ut Heart Collage før Valentinsdagen, så jeg sendte inn i slutten av januar. Det skulle være god tid, men det potensielle avslaget stresset meg. Jeg var så lettet da appen fikk godkjent første forsøk, på seks dager. Jubel!

Kjennelse

Jeg har stort sett påpekt forskjellen mellom iOS og Android, men på slutten av dagen er de mer likt enn forskjellige når det gjelder teknologi, i det minste. Dommen er fremdeles ute på pengene. Stemmer det at iOS-brukere er mer villige til å betale for apper? Hvilken plattform vil gi mer inntekter? Det vil være drivkraften for min beslutning om å bruke tid på iOS kontra Android, og tallene er fremdeles ute. Vil Heart Collage få flere nedlastinger på iOS eller Android? Vi får se.

Dette gjesteposten av Chiu-Ki Chan dukket opp opprinnelig på bloggen sin Square Island. Hun er en tidligere programvareingeniør for Google som nå driver sitt eget mobilutviklingsselskap.

© Copyright 2020 | mobilegn.com