segítségével egyszerű megosztási kiterjesztés létrehozása az iOS 8 alkalmazásban

az iOS 8-ban bevezetett megosztási kiterjesztések egyszerű és kényelmes módot kínálnak a felhasználók számára a tartalom megosztására más entitásokkal, például közösségi megosztási webhelyekkel vagy feltöltési szolgáltatásokkal. Korábban a Tartalom megosztása általában az egyik alkalmazásról a másikra váltást jelentette, például a Safariban való szörfözés közben, ha meg akart osztani egy URL-t, akkor átmásolta, átváltott arra az alkalmazásra, amelyet menteni vagy megosztani kívánt, végrehajtotta a műveletet, majd folytatta a szörfözést a Safariban. A share kiterjesztésekkel a felhasználók mostantól közvetlenül az általuk használt alkalmazásból oszthatják meg a tartalmat az Ön szolgáltatásával, legyen az Safari, fotók vagy más alkalmazások. Ez nem korlátozódik a rendszeralkalmazásokra. Bármely egyéni alkalmazás, amely bemutatja az UIActivityViewController osztály egy példányát, láthatja a megosztási kiterjesztést, ha úgy építette fel a kiterjesztést, hogy képes legyen kezelni az alkalmazás által biztosított fájltípust.

létrehozunk egy megosztási kiterjesztést, amely fotókat oszt meg egy közösségi oldalon. A dolgok egyszerűbbé tétele érdekében az Imgur-t használjuk erre, mivel lehetővé teszi a felhasználók számára, hogy névtelenül töltsenek fel képeket (anélkül, hogy a képeket egy fiókhoz kapcsolnák).

csakúgy, mint bármely más kiterjesztés, a részvénykiterjesztés sem lehet önálló alkalmazás; konténeralkalmazással kell együtt járnia. Létrehoztam egy kezdő projektet, amely a konténer alkalmazásunk lesz. Töltse le, hogy kövesse.

hogyan működik a Demo alkalmazás

az alkalmazás egy egyszerű imgurshare nevű alkalmazás, amelyet a felhasználó használhat képek feltöltésére az Imgur-ba. Megadom az utasításokat, hogy hamarosan készen álljon a futtatásra, de először hadd adjak áttekintést az alkalmazásról.

gyökér nézete egy táblázat nézet, amely felsorolja azokat a címeket, amelyeket az Imgur-ba feltöltött képeknek adunk.

kép feltöltéséhez érintse meg a + gombot a navigációs sávban, és megjelenik egy nézet, amely lehetővé teszi a kép kiválasztását, a kép címének megadását és az Imgur-ba történő feltöltést.

a kép feltöltése után, amikor visszatér a táblázat nézetbe, megjelenik a feltöltött kép címe. Amikor kiválaszt egy elemet a táblázat nézetben, megjelenik a feltöltött kép és annak linkje az Imgur-on. Annak érdekében, hogy egyszerű legyen, nem tartalmaztam a szerkesztési és törlési funkciókat.

a nézet navigációs sávján található egy URL másolása gomb, amellyel a kép URL-jét a vágólapra másolhatja. Kipróbálhatja az URL másolásával, a Safari megnyitásával és a link beillesztésével. Látni fogja a feltöltött képet az Imgur oldalon.

első lépések

az alkalmazás áttekintése az útból, most beállíthatjuk. Van néhány dolog, amit meg kell tennie, hogy működjön. Először is szüksége lesz egy Ügyfélazonosítóra az Imgur-tól az API használatához, másodszor pedig be kell állítania egy Alkalmazáscsoportot. Az alkalmazáscsoportok engedélyezéséhez fejlesztői fiókra van szükség. Annak érdekében, hogy egy kiterjesztés megossza az adatokat a tároló alkalmazásával, be kell állítania egy Alkalmazáscsoportot. Ez lehetővé teszi a hozzáférést a bővítmény és a tárolóalkalmazás közötti megosztott tárolóhoz.

két okból szeretnénk, ha a bővítmény hozzáférne a megosztott tárolóhoz: először is, csakúgy, mint a konténer alkalmazás, a kiterjesztésen keresztül feltöltött minden kép mentésre kerül, és megtekinthetővé válik a konténer alkalmazáson keresztül, másodszor pedig egy háttér munkamenetet használunk a feltöltéshez, amely megköveteli, hogy a képet először a feltöltés előtt mentse el, így ideiglenes képet mentünk a megosztott tárolóba, amelyet a háttérfeltöltési feladat során használnak. A háttérfeltöltést azért használjuk, mert a felhasználók általában a bővítményekben végzett feladatuk befejezése után azonnal visszatérnek a host alkalmazásba, tehát ha a feltöltés potenciálisan hosszadalmas, azt akarjuk, hogy a kiterjesztés megszűnésekor is befejeződjön.

az Imgur Ügyfélazonosító megszerzéséhez jelentkezzen be imgur.com vagy regisztráljon egy fiókot a imgur.com/register. miután bejelentkezett, kattintson a felhasználónevére a képernyő jobb felső sarkában, majd válassza a lehetőséget Beállítások.

Ezután válassza az alkalmazások lehetőséget a jobb oldali menüből.

válassza a saját létrehozása lehetőséget a használt alkalmazások alatt.

kattintson az alkalmazás regisztrálása elemre a bal oldali menüben, majd válassza az alkalmazás regisztrálása lehetőséget az ábrán látható módon.

a jelentkezési lapon írja be, amit csak akar az alkalmazás nevéhez. Az engedély típusához válassza az OAuth 2 engedélyezés visszahívási URL nélkül lehetőséget, írja be e-mail címét az e-mail mezőbe, majd írja be, amit szeretne a leíráshoz. Írja be a biztonsági szöveget a mezőbe, és küldje el az űrlapot.

a sikeres benyújtás után megjelenik az ügyfél azonosítója és az ügyfél titka.

másolja az ügyfélazonosítót, és nyissa meg az UploadImageService szolgáltatást.swift (keresse meg az ImgurKit csoportban), majd illessze be a bemutatott utasításba.

1
privát let imgurClientId = “IMGUR_CLIENT_ID”

az alkalmazáscsoport konfigurálásához először módosítsa az alkalmazás Csomagazonosítóját. Válassza az ImgurShare lehetőséget a projekt Navigátorban, majd válassza ki az ImgurShare célt a célok listából. Az Általános lapon módosítsa a köteg azonosítóját a com-ról.appcoda.ImgurShare valami mást. Szüksége van egy másik azonosítóra, mert az alkalmazáscsoporthoz használt azonosítónak meg kell egyeznie a Csomagazonosítóval, és egyedinek kell lennie.

ezután lépjen a képességek fülre, és kapcsolja be az alkalmazáscsoportok kapcsolót. Adjon hozzá egy új csoportot, és nevezze el group. com .. ImgurShare. az én esetemben van group. com. appcoda. ImgurShare.

a

megosztási kiterjesztés létrehozása nyissa meg az Addimageviewcontrollert.a shareimage (imageTitle:, imageToUpload:) függvényben módosítsa a tároló Azonosítóját, hogy megfeleljen a létrehozott csoportnak.

1
config.sharedContainerIdentifier = “group. com. appcoda. ImgurShare”

nyissa meg az ImageService alkalmazást.ugyanezt tegye a tempContainerURL(image:, name:) függvény következő utasításánál is.

tegye ugyanezt az utasítás látható a getFileUrl() függvény ugyanabban az osztályban.

most már futtathatja és tesztelheti az alkalmazást.

ezután létrehozzuk a Megosztás kiterjesztést. Válassza ki az ImgurShare projektet a Project Navigatorban, majd lépjen a szerkesztőbe > Cél hozzáadása > iOS > alkalmazásbővítmény > kiterjesztés megosztása

a következő képernyőn Állítsa be a termék nevét ImgurUpload értékre,a fennmaradó mezőket pedig hagyja alapértelmezetten. Kattintson a Befejezés gombra, és aktiválja az ImgurUpload sémát

ezután konfigurálja az Alkalmazáscsoportot az ImgurUpload célhoz. Válassza ki az ImgurShare projektet a Project Navigatorban, majd válassza ki az ImgurUpload célt. A képességek lapon kapcsolja be az alkalmazáscsoportok kapcsolót, és válassza ki azt a csoportot, amelyet korábban létrehozott az ImgurShare célhoz.

annak érdekében, hogy lehetővé tegye a kódmegosztást az extension és a container alkalmazás között, a kódot egy keretbe helyeztem. Össze kell kapcsolnunk az ImgurUpload célponttal.

ha az ImgurUpload cél van kiválasztva, az Általános lapon kattintson a + gombra a csatolt keretrendszerek és könyvtárak részben. Válassza Az ImgurKit Lehetőséget.keretrendszer a listából, majd kattintson a Hozzáadás gombra.

ezzel a beállítással nézzük meg a kiterjesztés létrehozásakor generált fájlokat. Bontsa ki az ImgurUpload csoportot, és megjelenik egy storyboard fájl, egy jogosultsági fájl, egy nézetvezérlő és egy plist fájl a támogató fájlok csoport alatt. A jogosultságok fájl kiterjesztése, csakúgy, mint a tároló alkalmazás, jön létre, amikor konfigurálja alkalmazáscsoportokat. Az alkalmazáscsoport részleteit tartalmazza. Csakúgy, mint az Action Extensions esetében, használhat egy JavaScript fájlt is, hogy tartalmat szerezzen a Safari weboldalairól. Nem fogjuk használni ezt a mi kiterjesztés, de egy ötlet, hogyan kell használni a JavaScript fájlokat, hogy az adatokat a fogadó app a kiterjesztés nézet vezérlő, akkor olvassa el az előző cikket tettünk Action Extensions. A folyamat és a beállítás meglehetősen hasonló.

használhatja a storyboard fájlt egyéni felület létrehozásához (vagy kódban), de a megosztási kiterjesztések alapértelmezett összeállítási nézetet tartalmaznak, amelyet használni fogunk. Ez a felület hasonló a komponálás nézet kapsz, ha megoszt valamit a Twitter vagy a Facebook.

meg kell adnunk a bővítményünk által támogatott tartalom típusát az aktiválási szabály beállításával a plist fájlban. Nyissa Meg Az Információt.plist és bontsa ki az NSExtension kulcsot. Ezután bontsa ki az NSExtensionAttributes kulcsot az NSExtensionActivationRule eléréséhez. Alapértelmezés szerint ez a TRUEPREDICATE értékre van állítva, ami azt jelenti, hogy a bővítmény mindig elérhető lesz, amikor a felhasználó meg akarja osztani a tartalmat. Ezt módosítania kell, és konkrétabbá kell tennie, ha azt szeretné, hogy alkalmazását az App Store jóváhagyja. Módosítsa a típusát szótárra, és adjon hozzá egy új kulcs-érték párot. Állítsa be a kulcs nevét NSExtensionActivationSupportsImagewithmaxcount értékre, írja be a számot és az értéket 1-re. Ez azt határozza meg, hogy a kiterjesztés egyszerre egyetlen kép megosztását támogatja.

a ShareViewController osztályt tekintve a következő metóduscsonkokat találja.

  • isContentValid() – itt érvényesíti a felhasználói bevitelt. Érvényesíti a szövegbevitelt, valamint a megosztandó tartalmat, és igaz értéket ad vissza, ha az érvényesítés sikeres. Az írás nézetben a Post gomb le lesz tiltva, amíg a true vissza nem kerül.
  • didSelectPost() – ezt akkor hívják meg, amikor a felhasználó megérinti a Post gombot, és itt tölti fel a megosztott tartalmat. A feltöltés ütemezése után fel kell hívnia a completeRequestReturningItems(, completionHandler:) parancsot, hogy a gazdagép alkalmazás letilthassa felhasználói felületét. Amikor a feltöltési kérelem megtörtént, meghívja a befejezéskezelőt, amelyet az előző említett függvényhívásba továbbítottak.
  • configurationItems() – a megosztás kiterjesztés alapértelmezett írási nézete lehetővé teszi, hogy a nézet alján megjelenjen a Táblázat nézet celláinak használatával. Ehhez vissza kell adnia az SLComposeSheetConfigurationItem objektumok tömbjét, ha vannak konfigurációk a felhasználó számára. Ellenkező esetben adjon vissza egy üres tömböt.

adja hozzá a következő importálást a ShareViewController osztályhoz.

1
2

ImgurKit importálása
mobilszolgáltatások importálása

adja hozzá a következő változót az osztályhoz. Ez megtartja a felhasználó által kiválasztott képet.

1
var selectedImage: UIImage?

ezután felülbíráljuk a viewDidLoad() függvényt, hogy kibontsuk a képet az extensionContext melléklet elemeiből. Amikor a felhasználó közzétesz egy képet, azt más metaadatokkal együtt csomagolja, és az extensionContext objektumon keresztül továbbítja a bővítménynek. Adja hozzá a következőket az osztályhoz.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

func viewDidLoad () felülbírálása {
super.viewDidLoad()
let content = extensionContext!.inputItems as NSExtensionItem
let contentType = kUTTypeImage as String
for attachment in content.attachments as {
if attachment.hasItemConformingToTypeIdentifier(contentType) {
attachment.loadItemForTypeIdentifier(contentType, options: nil) { data, error in
if error == nil {
let url = data as NSURL
if let imageData = NSData(contentsOfURL: url) {
self.selectedImage = UIImage (adatok: imageData)
}
} else {
let alert = UIAlertController (cím: “hiba”, üzenet:” Hiba a kép betöltésekor”, preferredStyle: .Alert)
hagyja action = UIAlertAction (cím: “hiba”, stílus: .Mégse) {_in
önmaga.dississviewcontrolleranimated (igaz, Befejezés: nulla)
}
riadó.addAction (akció)
önmaga.presentViewController (alert, animated: true, completion: nulla)
}
}
}
}
}

itt kibontjuk a melléklet elemet az NSItemProvider objektumból, majd ellenőrizzük, hogy a melléklet megfelel-e a kUTTypeImage típusnak. a kUTTypeImage egy rendszer által definiált karakterlánc-állandó a MobileCoreServices keretrendszerben meghatározott alapvető egységes típusazonosítókhoz. A melléklet típusainak azonosítására használjuk.

a kép az NSItemProvider osztályba van csomagolva, ezért először be kell töltenünk a loadItemForTypeIdentifier () segítségével. Ha ez sikeres, akkor a képet a tárolás url-jéről töltjük be (az NSItemProvider-ből kibontva a képeket a lemezre menti). Ezután beállítjuk a selectedimage változót a képpel. Beládáz egy hiba, a felhasználó megjelenik egy figyelmeztető jelzés.

ezután módosítsa az isContentValid() függvényt az ábrán látható módon.

1
2
3
4
5
6
7
8
9

felülbírálása func isContentValid () – > Bool {
ha hagyja img = selectedImage{
ha !tartalomszöveg.isEmpty {
vissza igaz
}
}
vissza hamis
}

ez az ellenőrzés, hogy győződjön meg arról, hogy egy kép van kiválasztva, és a felhasználó írja be néhány bemenet előtt tudnak post.

módosítsa didSelectPost() az alábbiak szerint.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

felülbírálása func didSelectPost () {
hagyja defaultSession = UploadImageService.sharedService.session
hagyja defaultSessionConfig = defaultSession.konfiguráció
hagyja defaultHeaders = defaultSessionConfig.HTTPAdditionalHeaders
hagyja config = NSURLSessionConfiguration.backgroundSessionConfigurationWithidentifier (“com.appcoda.ImgurShare.bkgrdsession”)
config.sharedContainerIdentifier = “group.com.appcoda.ImgurShare”
config.HTTPAdditionalHeaders = defaultHeaders
let session = NSURLSession(configuration: config, delegate: UploadImageService.sharedService, delegateQueue: NSOperationQueue.mainQueue())
let completion: (TempImage?, NSError?, NSURL?) -> () = { image, error, tempURL in
if error == nil {
if let imageURL = image?.link {
let image = Image(imgTitle: self.contentText, imgImage: self.kiválasztott kép!)
kép.url = imageURL
legyen imageService = ImageService.sharedService
imageService.addImage (kép)
imageService.saveImages()
}
ha hagyja konténer = tempURL {
var delError:NSError?
ha NSFileManager.defaultManager().isDeletableFileAtPath (konténer.ösvény!) {
legyen siker = NSFileManager.defaultManager().removeItemAtPath (konténer.ösvény!, hiba: & delError)
if (!siker) {
println (“hiba történt a fájl eltávolításakor az elérési úton: \ (hiba?.description)”)
}
}
}
} else {
println(“Error uploading image: \(error!)”)
if let container = tempURL {
var delError: NSError?
if NSFileManager.defaultManager().isDeletableFileAtPath(container.path!) {
let success = NSFileManager.defaultManager().removeItemAtPath(container.path!, error: &delError)
if(!success) {
println(“Error removing file at path: \(error?.leírás)”)
}
}
}
}
}
legyen title = contentText
UploadImageService.sharedService.uploadImage (selectedImage!, title: title, session: session, completion: completion)
self.extensionContext?.completerequestreturn elemek (, nulla)
}

cserélje ki az alábbi nyilatkozatban szereplő alkalmazáscsoport-azonosítót a sajátjára.

1
config.sharedContainerIdentifier = “group. com. appcoda. ImgurShare”

itt határozzuk meg a feltöltéshez használt háttér munkamenetet. Ezután meghatározzuk azt a befejezési blokkot, amelyet a kérés befejezésekor hívunk meg. A Befejezés blokkban ellenőrizzük, hogy a feltöltés sikeres volt-e, és ha igen, mentse el a képet (az itt mentett képek betöltődnek a konténer alkalmazás táblázatos nézetébe). Ezután töröljük az ideiglenes képet, amelyet a háttérkérelem során lemezre mentettünk. Ha a feltöltés sikertelen, akkor az ideiglenes képet is töröljük, és nem mentjük későbbi megtekintésre a tároló alkalmazásban. Csak azt akarjuk, hogy a konténer alkalmazás olyan képeket jelenítsen meg, amelyeket sikeresen feltöltöttek az Imgur-ba.

vegye figyelembe a contentText használatát. Ez a tulajdonság tárolja a felhasználó szövegbevitelét.

ezután meghívjuk az uploadImage() függvényt az ImgurKit keretrendszerben a feltöltéshez. Ez a módszer aszinkron, és azonnal visszatér. Amikor a feltöltés befejeződik vagy sikertelen, a befejezési blokk meghívásra kerül.

következő módosítás configurationtems() az ábrán látható módon. Üres tömböt adunk vissza, mivel nem adunk hozzá semmit a kiterjesztés írási nézetéhez.

1
2
3

felülbírálása func configurationItems () – >! {
visszatérés
}

tesztelés a Megosztás kiterjesztése

most már futtathatja az alkalmazást. Győződjön meg arról, hogy az ImgurUpload séma van kiválasztva. Amikor a rendszer kéri, hogy válasszon egy futtatandó alkalmazást, válassza a Fotók lehetőséget. A futás után válasszon ki egy fényképet, majd érintse meg a megosztás gombot. Az első futtatáskor hozzá kell adnia a kiterjesztést a megosztási laphoz. Válassza a több gombot a többi megosztási ikon jobb oldalán, kapcsolja be a bővítmény kapcsolóját, majd válassza a Kész lehetőséget.

visszatérve a megosztási lapra, láthatja a kiterjesztés ikonját a többi megosztási ikon mellett. Válassza ki a kiterjesztést, írjon be egy szöveget, majd érintse meg a Post elemet.

a kép feltöltésre kerül az Imgur-ba, majd mentésre kerül a konténer alkalmazásba. Ennek megerősítéséhez keresse meg a kezdőképernyőt, és nyissa meg az ImgurShare alkalmazást. Látni fogja a képhez megadott címet, valamint magát a képet a részletes nézetben.

ha kilép a konténer alkalmazásból, és egy másik kép megosztásához navigál vissza a Fotók alkalmazásba, majd visszatér a konténer alkalmazásba, észre fogja venni, hogy a táblázat nem frissül automatikusan a hozzáadott elemmel. Ha kiválaszt egy táblázat sort, majd visszatér a táblázat nézetbe, a táblázat frissül. Újra kell töltenünk a táblázat adatait, amikor az alkalmazás visszatér az előtérbe. Ehhez először adja hozzá a következő funkciót az ImagesTableViewController osztályhoz.

1
2
3

func frissíthető () {
tableView.reloadData()
}

aztán az AppDelegate-ben.swift, adja hozzá a következőket az applicationWillEnterForeground () függvényhez.

1
2

legyen vc = ImagesTableViewController ()
vc.frissíthető()

Most, amikor feltölt egy képet a bővítményen keresztül, és visszahozza a tároló alkalmazást az előtérbe, a táblázat frissül.

Összegzés

ezzel lezárul ez a Megosztás kiterjesztés bemutató. Remélem, hogy az útmutató hasznos lesz bárki számára, aki megosztási kiterjesztést szeretne létrehozni. A projekt fájljait itt töltheti le.

Megjegyzés: Ha fájlt oszt meg a kiterjesztésen keresztül, hibaüzenetet észlel a hibakeresőben: “nem sikerült örökölni a CoreMedia engedélyeit az xxxx-től”. Úgy tűnik, hogy ez egy gyakori hiba, és találkoztam vele, amikor a Today, Share és action kiterjesztésekkel dolgoztam. A kiterjesztés a hiba ellenére is jól működik. A keresés körül, úgy tűnik, hogy gyakori, és ebben a Stackoverflow bejegyzésben valaki azt mondja, hogy a kiterjesztés jól működik, és az Apple jóváhagyta a hiba ellenére. Így, lehet, hogy egy Xcode hiba. Nem tudom biztosan. A gondolatait a megjegyzésben hagyhatja.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.