Lär dig hur du klarar av den sociala rammens kraft med detta inlägg, taget från kapitel 11 i Mobiletuts + boken Avkodning av iOS 6 SDK!
Introduktionen av Twitter-ramverket i IOS 5 var det första steget mot integrering av iOS med populära sociala nätverk. I IOS 6 introducerade Apple den sociala ramen. Det sociala ramverket ersätter inte bara Twitter-ramen, det utökar också sin funktionalitet genom att lägga till stöd för både Facebook och Sina Weibo.
Trots att Twitter-ramverket har avlägsnats från iOS 6 är det lyckligtvis en trivial uppgift att migrera befintlig kod från Twitter-ramen till den sociala ramen. API: erna i den sociala ramen nämner inte specifika sociala nätverk. Nätverkskomponenten har abstraherats bort, vilket gör att stöd för nya sociala nätverk i framtiden blir en smärtfri uppgift. Bottom line: den goda nyheten för utvecklare är att det är enkelt att komma igång med sociala ramar, särskilt om du redan är bekant med Twitter-ramarna.
I det här kapitlet ska jag ge dig en översikt över den sociala ramen och vad den har att erbjuda, och jag ska visa dig vilka alternativ du vill när du vill lägga till en social komponent i dina applikationer. Medan detta kapitel endast kommer att omfatta grunderna i den sociala ramen, kommer nästa kapitel att tala om en mer noggrann integration av din ansökan med den sociala ramen. Som en extra bonus diskuterar jag även UIActivityViewController-klassen. Detta är ett annat tillskott till UIKit som gör det lätt att dela innehåll!
Innan iOS 6 var det inte så lätt att dela innehåll. Om du någonsin har integrerat Facebook med ett iOS-program, så har du nästan säkert kollat in i ett antal hinder längs vägen. I IOS 6 har dock ett antal betydande förbättringar gjorts. När det gäller iOS 6 är integration med sociala nätverk nu bakat i operativsystemet, vilket gör social delning väldigt lättare för SDK-utvecklare.
I skrivande stund stöder den sociala ramen integration med Facebook, Sina Weibo och Twitter. Stöd till Twitter är den uppenbara orsaken till avskrivningen av Twitter-ramen. Sina Weibo kan vara den udda ankan i rad för några av er. Sina Weibo är en oerhört populär mikrobloggtjänstplattform i Kina, en av de mest folkrika nationerna på jorden, så det är inte så konstigt att se dess integration i IOS.
Med ovanstående i åtanke, vilka alternativ har du när en av dina applikationer behöver integreras med Facebook, Twitter eller Sina Weibo? Den sociala ramen erbjuder två alternativ, med hjälp av (1) SLComposeViewController
klass eller (2) SLRequest
klass. Om du har arbetat med Twitter-ramverket i iOS 5 så kommer dessa klassnamn säkert att ringa en klocka.
I det här kapitlet kommer jag att zooma in på SLComposeViewController
klass. Det är en enkel att använda och elegant lösning för att låta dina användare dela innehåll med Twitter, Facebook och Sina Weibo. Låt oss ta en titt på den här nykomlingen.
SLComposeViewController
Det enklaste sättet att dela innehåll med ett av de sociala nätverk som stöds är att använda sig av SLComposeViewController
klass. Dess prefix, SL, indikerar att det är en del av den sociala ramen. De SLComposeViewController
klassen motsvarar TWTweetComposeViewController
klass av Twitter-ramen. Den viktigaste skillnaden är det SLComposeViewController
är inte knuten till något särskilt socialt nätverk.
Skapa en instans av SLComposeViewController
är lika lätt som att ringa composeViewControllerForServiceType:
på klassen och passerar tjänstetypen, det vill säga det sociala nätverket du riktar in. Vid skrivetiden finns det tre alternativ, SLServiceTypeTwitter
, SLServiceTypeFacebook
, och SLServiceTypeSinaWeibo
.
Du kan konfigurera SLComposeViewController
Exempel genom att ställa in den ursprungliga texten eller lägga till en bild eller länk. Konfigurera SLComposeViewController
Exempel är ett valfritt steg eftersom användaren kommer att kunna ändra innehållet i meddelandet innan det skickas till måltjänsten.
Innan du presenterar komponentvynskontrollen för användaren är det bra att ställa in sin slutföringshanterare (SLComposeViewControllerCompletionHandler
). Det senare är ett block som utförs när begäran till tjänsten är klar, framgångsrikt eller misslyckat. Blokken tar en parameter, resultatet av förfrågan. Detta kan vara användbart om du vill informera användaren om förfrågan lyckades eller inte.
Presentera SLComposeViewController
till användaren görs genom att skicka ett meddelande till presentViewController: animerad:
precis som du gör med någon annan (modal) bildskärmskontroll. Som jag nämnde tidigare kan användaren ändå redigera meddelandet, geotag meddelandet eller lägga till en bild eller länk. Alternativen samt användargränssnittet för SLComposeViewController
Exempel beror på vilken tjänst som riktas. Om användaren skickar ett meddelande till Facebook, till exempel, den modala vyn av SLComposeViewController
Exempel är utsmyckad med det välkända purpurfärgade färgschemat.
De SLComposeViewController
klassen har en annan klass metod som är värt att nämna, isAvailableForServiceType:
. TWTweetComposeViewController har ett liknande klassmetodnamn, canSendTweet
. Med den här metoden kan din ansökan fråga operativsystemet om den tjänst du vill rikta till är tillgänglig. Som med composeViewControllerForServiceType
, klassmetoden kommer att acceptera en tjänstetyp som indikerar vilken tjänst som riktas in. Även om isAvailableForServiceType:
returnerar a JA
eller NEJ
, operativsystemet utför ett antal kontroller för dig bakom kulisserna. Det kommer att verifiera huruvida det sociala nätverket är nåbart och det är viktigare att det kontrollerar om användaren har installerat ett giltigt konto för måldjänsten. Låt oss titta närmare på användarkonton och hur de hanteras av operativsystemet.
Den sociala ramen antar ett koncept som kallas single-sign-on (SSO), och det är viktigt att förstå konsekvenserna av detta designbeslut. Enkelt sagt är det inte längre nödvändigt för varje tredjepartsapplikation att autentisera sig med måltjänsten, operativsystemet tar nu hand om detta för dig och avslöjar ett antal slutpunkter för utvecklare genom den sociala ramen. Som du kanske har gissat betyder det att en central plats för att lagra användarens konton är nödvändig. Det centrala läget är naturligtvis inställningsapplikationen för iOS och tillåter användare att hantera deras sociala nätverkets detaljer från Inställningar gör delning av innehåll från appar på ett mycket effektivare sätt.
Medan applikationen iOS 6 Settings endast ger möjlighet att hantera ett Facebook-konto kan användarna styra flera Twitter-konton. Genom att lagra användarens konton på en central plats behöver tredjeparts applikationsutvecklare inte längre hantera denna känsliga data själva.
UIActivityViewController
UIActivityViewController
är ett underbart tillägg till UIKit. Det gör delning av innehåll en bris. Som klassnamnet innebär, UIActivityViewController
är en underklass av UIViewController
. UIActivityViewController
gör delning av innehåll trivialt genom att ge användaren en mängd alternativ att välja mellan. Användaren kan dela innehåll via e-post, Twitter eller bara klistra in en URL till utklippstavlan. Det finns många alternativ att välja mellan, och slutpunkterna är inte begränsade till de tre sociala nätverk som stöds av den sociala ramen. Som den UIActivityViewController
Namnet innebär att klassen är en del av UIKit, inte den sociala ramen. Det är med andra ord inte nödvändigt att länka ditt projekt mot den sociala ramen om du bara vill använda UIActivityViewController
klass.
Även om UIActivityViewController
är inte en del av den sociala ramen, jag har valt att inkludera den i det här kapitlet eftersom den delar en del med den sociala ramen. Faktum är att du kommer märka på ett par minuter det UIActivityViewController
delar ganska lite funktionalitet med SLComposeViewController. För att bättre förstå UIActivityViewController
, du kan jämföra det med ett postkontor. Ett postkontor tar ditt meddelande och ser till att det levereras till adressen (tjänsten eller slutpunkten) som anges av dig.
Vissa av er kanske märker att det liknar det välkända open source-biblioteket ShareKit. UIActivityViewController
är mycket kraftfullare, eftersom det integreras sömlöst med operativsystemet och dess tjänster. Men som med ShareKit kan utvecklare lägga till egna ändpunkter till arrayen av slutpunkter som UIActivityViewController
integreras med och visar till användaren.
Använder sig av UIActivityViewController
är lika enkelt som att använda SLComposeViewController. Den angivna initialiseraren av UIActivityViewController
tar två parametrar, (1) aktivitetsobjekt och (2) applikationsaktiviteter. Båda argumenten måste vara instanser av NSArray. Den första parametern är en rad dataobjekt du vill dela med. Arrayen kan innehålla en eller flera textutdrag eller bara en enda bild. Den typ av innehåll som du kan dela beror inte bara på vilken typ av data din ansökan kan ge, utan också vilken typ av data slutpunkten accepterar. De UIActivityViewController
klassen kommer att se till att dataobjekten behandlas korrekt beroende på vilken tjänst eller slutpunkt användaren väljer.
Den andra parametern, applikationsaktiviteter, är en rad tjänster eller slutpunkter som UIActivityViewController
kommer att presentera för användaren. Tjänster inkluderar e-post, Twitter, Facebook, utskrift eller kopiering av något till urklippet. Som jag nämnde tidigare har utvecklare möjlighet att lägga till tjänster också. Om applikationsaktiviteter är inställda på noll, kommer operativsystemet att använda standarduppsättningen av applikationsaktiviteter.
Efter att ha presenterat UIActivityViewController
exempel till användaren, UIActivityViewController
kommer att ta hand om resten. Om du till exempel har lagt till Twitter som en ansökningsaktivitet, UIActivityViewController
kommer först att kontrollera om Twitter är tillgängligt och om användaren har installerat ett Twitter-konto på sin enhet innan den presenteras som ett alternativ till slutanvändaren. UIActivityViewController
sparar dig mycket huvudvärk, och det tar bara några få linjer kod att integrera med en applikation.
För att illustrera hur lätt det är att använda UIActivityViewController
och SLComposeViewController
, Vi ska bygga en enkel shoebox-applikation för att dela foton. Applikationen tillåter användare att snapa en bild, lägga till en bildtext och dela den med vänner och familj. Proverapplikationen visar hur lätt det är att dynamiskt dela innehåll i iOS 6.
Börja med att skapa ett nytt projekt i Xcode. Välj Enkel visningsprogram mall från listan med mallar (figur 3). Namn din ansökan Sharetastic, ange ett företagsnamn och identifierare, sätt iPhone för enhetsfamiljen och kolla Använd automatisk referensräkning. Avmarkera de övriga kryssrutorna för det här projektet (figur 4). Ange var du vill spara projektet och klicka på Skapa knapp.
Eftersom vår ansökan kommer att utnyttja den sociala ramen måste vi lägga till den i vårt projekt. Välj projektet i Project Navigator och välj målet till höger (figur 5). Välj Bygga faser fliken högst upp, öppna Länk binär med bibliotek lådan, klicka på plusknappen och välj Social.framework från listan (figur 5). Vårt projekt är nu framgångsrikt kopplat till den sociala ramen.
Glöm inte att lägga till ett importdeklaration högst upp i vår bildhanterarens huvudfiler för att importera rubrikerna i den sociala ramen till ditt projekt.
#importera#importera
Innan vi skapar användargränssnittet för vår applikation måste vi lägga till nödvändiga uttag och åtgärder till huvudfliken i vår vykontroll. Totalt fyra försäljningsställen måste läggas till, a UITextField
för att ange bildtexten, a UIImageView
visar den snurrade bilden och två UIButton
instanser. Om du trycker på den första knappen skickas bilden och bildtexten till användarens Facebook-konto. Genom att trycka på den andra knappen visas en förekomst av UIActivityViewController
, presentera användaren med ett antal alternativ för att dela bilden och bildtexten. Som du kanske har gissat är varje knapp knuten till en IBAction
. Kodestycket nedan visar hur huvudfliken i vår vykontroll ska se ut:
#importera#importera @interface RPViewController: UIViewController @property (svag, ickeatomisk) IBOutlet UITextField * captionTextField; @property (svag, ickeatomisk) IBOutlet UIImageView * imageView; @property (svag, icke-atomisk) IBOutlet UIButton * facebookButton; @property (svag, icke-atomisk) IBOutlet UIButton * shareButton; - (IBAction) facebook: (id) avsändare; - (IBAction) share: (id) avsändare; @slutet
Det är dags att gå över till vår bildkontrollans XIB-fil. För att hålla sakerna enkla använder vi inte de nya iOS 6 Autolayout-funktionerna i det här kapitlet. Med vykontrollens XIB-fil vald, öppna Filinspektör till höger och avmarkera Använd Autolayout checkbox.
Med den visade kontrollenhetens XIB-fil vald, börjar du med att dra ett textfält i vyens kontrollvyn och placera det längst upp i vyn (figur 6). Konfigurera textfältet genom att öppna Attribut Inspector och ändra platshållarens text till Ange bildtext. Med det markerade textfältet öppnar du Anslutningsinspektör och anslut textfältets delegera utlopp till Filens ägare objekt till vänster. Det innebär att visningscontrollern kommer att fungera som textfältets delegat. Anledningen till det kommer att bli tydligt på bara några minuter. Se till att du också har anslutit captionTextField
utlopp till textfältobjektet på skärmen.
Dra en förekomst av UIImageView
från biblioteket till vystyrningens vy och placera det under textfältet (figur 6). Ändra dess dimensioner till 280 poäng med 280 poäng. Öppna Attribut Inspector än en gång och ändra bildvyns läge (innehållsläge
) egendom till Aspect Fit och se till att kolla Användarinteraktion aktiverad. Sistnämnda är viktigt eftersom vi snart kommer att lägga till en nyckelfunktionsgenkännare till bildvisningen. Om vi inte aktiverar användarinteraktion för bildvyn, fungerar inte knapptrycksigenkännaren. Glöm inte att ansluta bildkontrollens uttag med vår bildvy. Det enklaste sättet att göra detta är genom att trycka på Ctrl
tangent, dra från bildvyn till filens Ägareobjekt och välj lämpligt uttag.
För att slutföra programmets användargränssnitt, lägg till två UIButton
instanser till vår vy kontrollörens syn och placera dem under bildvyn (figur 6). Ge den övre knappen en titel på Facebook och den nedersta knappen en titel på Dela med sig. Anslut de återstående uttagen som jag beskrev ovan. Dessutom kopplar du in de två handlingarna i vår vykontrollör genom att trycka på Ctrl-tangenten, dra från objektets Ägare-objekt till varje knapp och sedan välja motsvarande åtgärd. Användargränssnittet är klart. Nu är det dags att börja skriva några koden för att få allt att fungera!
Det finns ytterligare en sak som vi måste lägga till i vår bildkontrollans huvudfil. Eftersom vi ska använda oss av UIImagePickerController
För att snäppa bilder måste vår visningsstyrare överensstämma med både UINavigationControllerDelegate
och UIImagePickerControllerDelegate
protokoll. Dessutom, som jag nämnde för några minuter sedan, fungerar vår visningsansvarig också som delegat i textfältet för textning. Detta innebär att visningsstyraren måste överensstämma med UITextFieldDelegate
protokoll också. Ta en titt på den uppdaterade headerfilen i vår visningskontroller för att förtydliga.
#importera#importera @interface RPViewController: UIViewController @property (svag, ickeatomisk) IBOutlet UITextField * captionTextField; @property (svag, ickeatomisk) IBOutlet UIImageView * imageView; @property (svag, icke-atomisk) IBOutlet UIButton * facebookButton; @property (svag, icke-atomisk) IBOutlet UIButton * shareButton; - (IBAction) facebook: (id) avsändare; - (IBAction) share: (id) avsändare; @slutet
Enligt vår uppfattning kontrollörens implementeringsfil börjar vi genom att utvidga klassdefinitionen och lägga till en privat egendom. Det är bra att inte exponera varje egenskap i en klass genom att förklara dem i huvudfilen, och på ett sätt görs det genom att utvidga klassdefinitionen i implementeringsfilen. Efter första importredovisningen och före @genomförande
Direktivet, lägg till följande kodbit för att deklarera en ny privat egendom. Egenskapen kommer att innehålla en hänvisning till den bild som användaren snaps med enhetens kamera.
@interface RPViewController () @property (stark, ickeatomisk) UIImage * bild; @slutet
En trevlig egenskap hos Xcode 4.4+ är att du inte längre behöver syntetisera fastighetsaccessorer. Detta görs för dig bakom kulisserna och det följer Apples namnkonventioner. I vårt exempel kommer en instansvariabel att skapas med ett namn på _bild
och accessors för vår bildegenskap syntetiseras automatiskt för oss.
Jag gillar alltid att börja genom att implementera visningsens livscykel för en vyskontroller. Dessutom föredrar jag också att behålla viewDidLoad
metod kort genom att lägga till några hjälpar metoder. En metod som jag nästan alltid skapar är setupView
, som tar hand om att ställa in och konfigurera visningskontrollens synvinkel. Låt oss ta en titt på viewDidLoad
och setupView
metoder för att få en uppfattning om vad jag menar.
- (void) viewDidLoad [super viewDidLoad]; // Inställningsvy [self setupView]; - (void) setupView // Lägg till Gesture Recognizer UITapGestureRecognizer * tgr = [[UITapGestureRecognizer alloc] initWithTarget: självåtgärd: @selector (takeImage :)]; [self.imageView addGestureRecognizer: tgr]; // Uppdatera Visa [self updateView];
Som du kan se, är setupView
Metoden är inte komplex. Vi lägger till en knappbehållare igen i bildvisningen så att användaren kan snäppa en bild genom att trycka på bildvyn i vårt användargränssnitt. Vi initierar först en knappbehållare igen och lägger sedan till den i vår bildvy. Knappgenomgången skickar meddelandet snapImage:
till vår visningskontroller när användaren knackar på bildvyn. Vi tar en titt på snapImage:
metod på bara en sekund.
I slutet av setupView
metod, vi anropar metoden updateView. Återigen, det här är en hjälpmetod som jag använder mycket ofta eftersom det tillåter mig att gruppera logiken i samband med uppdateringen av vyn. Låt oss ta en snabb titt på updateView
metod.
- (void) updateView BOOL sharingEnabled = self.image? JA NEJ; float sharingAlpha = sharingEnabled? 1,0: 0,5; self.facebookButton.enabled = sharingEnabled; self.facebookButton.alpha = sharingAlpha; self.shareButton.enabled = sharingEnabled; self.shareButton.alpha = sharingAlpha;
Som metodnamnet innebär, uppdaterar metoden helt enkelt vyn och dess undervisningar. Vi börjar med att verifiera om en bild är tillgänglig genom att kontrollera om vår bildegenskap är inställd. Om vi har en bild att arbeta med, aktiverar vi Facebook och dela knappar och sätter deras alfavärden till 1,0. Om en bild inte är tillgänglig, har användaren ännu inte tagit en, vi inaktiverar båda knapparna och gör dem lite transparenta för att indikera för användaren att knapparna är inaktiverade.
Genom att utnyttja UIImagePickerController
, snäppande bilder är en enkel och enkel process. Låt oss börja med att undersöka snapImage:
metod som åberopas av tryckbehållarens igenkänning när användaren knackar på bildvyn. Först en förekomst av UIImagePickerController
initieras och dess delegat är inställd på sig själv, det vill säga vår vyskontroller. Därefter frågar vi operativsystemet om en kamera är tillgänglig genom att ringa isSourceTypeAvailable
på UIImagePickerController
klass och passerar den UIImagePickerControllerSourceTypeCamera
som argumentet. Baserat på returvärdet ställer vi in källkoden för vår UIImagePickerController
exempel. Som en felsäker är källtypen inställd på UIImagePickerControllerSourceTypePhotoLibrary
om ingen kamera är tillgänglig av någon anledning. Det innebär att användaren kan välja en bild från enhetens bildbibliotek. Slutligen presenteras bildplockarstyrenheten för användaren.
- (void) takeImage: (UITapGestureRecognizer *) tgr // Initiera bildväljare Controller UIImagePickerController * ip = [[UIImagePickerController allokera] init]; // Ställ in delegat [ip setDelegate: self]; om ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) // Ange källtyp till kamera [ip setSourceType: UIImagePickerControllerSourceTypeCamera]; else // Ange källtyp till fotobiblioteket [ip setSourceType: UIImagePickerControllerSourceTypePhotoLibrary]; // Present View Controller [self presentViewController: ip animerad: JA slutförd: noll];
Kan du gissa vad nästa steg är? Vi måste genomföra metoderna för UIImagePickerControllerDelegate
protokoll. Protokollet har två metoder, imagePickerController: didFinishPickingMediaWithInfo:
och imagePickerControllerDidCancel:
. Låt mig gå dig igenom varje metod.
I imagePickerController: didFinishPickingMediaWithInfo:
, Vi börjar med att lagra en referens till den ursprungliga, oförädlade bilden. I de närmaste raderna av kod tilldelar vi den ursprungliga bilden till vår bildegenskap och uppdaterar vyn. Kom ihåg att detta kommer att möjliggöra Facebook och dela knappar. Slutligen avvisar vi bildväljarekontrollen.
- (void) imagePickerController: (UIImagePickerController *) plockare gjordeFinishPickingMediaWithInfo: (NSDictionary *) info UIImage * originalImage = [info objectForKey: UIImagePickerControllerOriginalImage]; om (originalImage) self.image = originalImage; // Uppdatera Visa [self updateView]; // Avvis Image Picker Controller [self dismissViewControllerAnimated: YES completion: nil];
Den andra delegatmetoden innehåller bara en rad kod. Om användaren knackar på avbrytningsknappen avvisas bildväljarekontrollen utan vidare ado.
- (void) imagePickerControllerDidCancel: (UIImagePickerController *) plockare // Avvis Image Picker Controller [self dismissViewControllerAnimated: YES completion: nil];
Innan man genomför Facebook:
och dela med sig:
åtgärder, jag vill ta en liten omväg. Varför har vi inte tilldelat den nyklippta bilden till bildvyns bildegenskap? Att tilldela den nyklippta bilden till bildegenskapen i vår bildvy är verkligen ett perfekt alternativ, men jag har tagit ett annat tillvägagångssätt. Sedan introduktionen av @synthesize
direktivet glömmer folk ofta hur användbara setter och getters kan vara. Låt mig förklara vad jag menar med ett exempel.
I vår programprogram har jag överskridit sätaren av vår bildkontrollans bildegenskap. Detta tillåter mig att (1) grupprelaterad kod på en plats och (2) uppdatera bildvisningen bara när bilden ändras. Det här kan verka som en detalj med mycket liten användning just nu, men det visar dig hur vi redan kan börja optimera vår kod på subtila sätt, vilket kommer att påverka kodläsbarhet och jämn prestanda. I det här exemplet kommer det inte att påverka vår applikations prestanda, men det är bra att använda bästa praxis när du passar dig.
Lägg till följande i implementeringsfilen nu:
- (void) setImage: (UIImage *) bild if (_image! = bild) _image = image; // Uppdatera bildvisning self.imageView.image = _image;
Innan vi kan börja dela bilder måste vi implementera en delegationsmetod för UITextFieldDelegate
protokollet, det vill säga, textFieldShouldReturn:
. I den här delegatmetoden avgår vi textfältet som första responder om användaren knackar på tangentbordets returknapp. Detta kommer att avvisa tangentbordet och avslöja delningsknapparna under det.
- (BOOL) textFieldShouldReturn: (UITextField *) textField // Avsluta första svaret [textField resignFirstResponder]; returnera JA;
Det är dags att få våra händer smutsiga med den sociala ramen och UIActivityViewController
. Låt oss börja med att genomföra Facebook:
metod. Det kommer att illustrera hur man använder SLComposeViewController
. Ta en titt på genomförandet nedan och låt oss bryta ner det steg för steg.
- (IBAction) facebook: (id) avsändare om ([SLComposeViewController isAvailableForServiceType: SLServiceTypeFacebook]) // Initialize Compose View Controller SLComposeViewController * vc = [SLComposeViewController composeViewControllerForServiceType: SLServiceTypeFacebook]; // Configure Compose View Controller [vc setInitialText: self.captionTextField.text]; [vc addImage: self.image]; // Present Compose View Controller [self presentViewController: vc animerad: JA slutförd: noll]; annars NSString * message = @ "Det verkar som om vi inte kan prata med Facebook just nu eller om du inte har lagt till ditt Facebook-konto på den här enheten. Gå till inställningsprogrammet för att lägga till ditt Facebook-konto på den här enheten."; UIAlertView * alertView = [[UIAlertView alloc] initWithTitle: @ "Oops" meddelande: meddelande delegat: nil cancelButtonTitle: @ "OK" otherButtonTitles: nil]; [alertView show];
Som jag nämnde tidigare är det nödvändigt att börja med att fråga operativsystemet om tjänsten vi riktar in är tillgänglig. Om isAvailableForServiceType:
avkastning NEJ
, Vi visar en varningsvy som berättar användaren vad problemet kan vara. Om tjänsten är tillgänglig, initierar vi dock en instans av SLComposeViewController
genom att åberopa klassmetoden composeViewControllerForServiceType:
. Argumentet vi övergår till klassmetoden är SLServiceTypeFacebook
, vilket tyder på att vi riktar oss till Facebook-plattformen.
Även om vår användare kan ändra meddelandet innan vi skickar det till Facebook fyller vi meddelandet med innehållet i texttextfältet och bifogar den snurrade bilden till meddelandet. Slutligen presenterar vi kompositionsregulatorn för användaren. Det är då upp till användaren att redigera, avbryta eller skicka meddelandet. Användaren är i kontroll. Detta är viktigt att komma ihåg speciellt med nästa kapitel i åtanke där användaren inte alltid vet vad vår applikation bakom kulisserna. I detta skede är vår ansökan redo för testning. Bygg och kör din applikation på en testenhet och prova själv!
Som jag nämnde tidigare är en av styrkorna i den sociala ramen hur lätt det är att ersätta ett socialt nätverk med ett annat genom att ändra tjänstetypen. Låt oss försöka genom att ersätta de två fallen av SLServiceTypeFacebook
med SLServiceTypeTwitter
. Med denna enkla förändring kan vi nu dela våra bilder med våra Twitter-anhängare.
Vår ansökan är inte helt klar än. Vi behöver fortfarande implementera dela med sig:
metod. I denna metod använder vi oss av UIActivityViewController
klass för att dela den knäppta bilden och tillhörande bildtext. Ta en titt på metodens genomförande nedan.
- (IBAction) share: (id) avsändare // Aktivitetsobjekt UIImage * image = self.image; NSString * caption = self.captionTextField.text; NSArray * activityItems = @ [bild, bildtext]; // Initiera aktivitetsvisningskontrollen UIActivityViewController * vc = [[UIActivityViewController allokera] initWithActivityItems: activityItems applicationActivities: nil]; // Nuvarande aktivitetsvisningskontroller [self presentViewController: vc animerad: JA slutförd: noll];
Vi lagrar först bilden och bildtexten i en array. Bilden och bildtexten är den så kallade activityItems
, vilka överförs som ett argument till den utsedda initieraren av UIActivityViewController
. Det är viktigt att först skicka bilden och sedan bildtexten. Kan du gissa varför?
Skönheten hos UIActivityViewController
klassen är att den vet hur man hanterar dataobjekten i aktivitetsobjektet. Detta blir tydligare när du testar delningsfunktionaliteten. Den andra parametern för initialiseringsmetoden är en grupp som innehåller de tjänster vi vill göra tillgängliga för användaren. Om du passerar noll
, operativsystemet visar användaren varje tjänst UIActivityViewController
har till sitt förfogande. Det är ofta bättre att bara visa de tjänster som är lämpliga för ett visst användningsfall.
Som jag nämnde i introduktionen, UIActivityViewController
kommer att kontrollera om varje tjänst finns bakom kulisserna. Namnet Application Services kan låta lite udda eller abstrakta, men det täcker ett brett utbud av serviceändpunkter, t.ex. e-post, textmeddelanden samt sociala nätverk och utskrift.
I slutet av vår dela med sig:
metod presenterar vi förekomsten av UIActivityViewController
till användaren. Bygg och kör din ansökan och prova själv.
UIActivityViewController
har två egenskaper, completionHandler
och excludedActivityTypes
. Genom att ställa in en slutföringshanterare kan du utföra ett block om användaren tappar avbrytningsknappen eller när delningsoperationen är klar. Som du kanske har gissat är slutföringshanteraren ett block (UIActivityViewControllerCompletionHandler
) och tar två parametrar, (1) aktivitetstypen och (2) en boolean som indikerar huruvida tjänsten utfördes eller ej. Det booleska värdet ställs också in på NEJ
om användaren avbryter eller avvisar UIActivityViewController
exempel.
SLComposeViewController
har en färdighetshandlare som fungerar mycket på samma sätt. Istället för två parametrar accepterar den endast resultatet av operationen.
Du borde nu ha en god förståelse för vad den sociala ramen kan erbjuda dig. Vi har tittat på SLComposeViewController
såväl som UIActivityViewController
. Båda klasserna är otroligt användbara och ändå lätta att använda. Delning av innehåll brukade vara besvärligt och smärtsamt, men dessa två klasser gör processen mycket enklare. Jag är mycket nöjd med införandet av den sociala ramen i IOS 6 samt med tillägg av