rozšíření sdílení, představené v systému iOS 8, poskytuje uživatelům snadný a pohodlný způsob sdílení obsahu s jinými subjekty,jako jsou webové stránky pro sociální sdílení nebo služby nahrávání. Dříve sdílení obsahu obvykle znamenalo přechod z jedné aplikace do druhé, například při surfování v Safari, pokud byste chtěli sdílet adresu URL,zkopírovali byste ji, přepnuli do aplikace, kterou chcete uložit nebo sdílet, proveďte akci a poté pokračujte v surfování v Safari. S rozšířeními sdílení budou uživatelé nyní moci sdílet obsah s vaší službou přímo z aplikace, kterou používají, ať už jde o Safari, fotografie nebo jiné aplikace. To není omezeno na systémové aplikace. Každá vlastní aplikace, která představuje instanci třídy uiactivityviewcontroller bude moci vidět rozšíření sdílení, pokud jste vytvořili rozšíření tak, aby zvládla typ souboru poskytovaný touto aplikací.
chystáme se vytvořit rozšíření sdílení, které sdílí fotografie na sociální síť. Abychom to zjednodušili, použijeme k tomu Imgur, protože umožňuje uživatelům nahrávat obrázky anonymně(bez propojení obrázků s účtem).
stejně jako jakékoli jiné rozšíření, rozšíření sdílení nemůže být samostatná aplikace; musí být dodáván s kontejnerovou aplikací. Vytvořil jsem startovací projekt, který bude naší kontejnerovou aplikací. Stáhněte si ji následovat.
jak funguje Demo aplikace
aplikace je jednoduchá aplikace s názvem ImgurShare, kterou může uživatel použít k nahrávání obrázků do Imguru. Dám instrukce, jak ji připravit ke spuštění brzy, ale nejprve mi dovolte dát přehled o aplikaci.
jeho kořenový pohled je zobrazení tabulky, které uvádí tituly, které dáváme obrázkům nahraným do Imguru.
Chcete-li nahrát obrázek, klepněte na tlačítko + na navigačním panelu a zobrazí se vám pohled, který vám umožní vybrat obrázek, zadat název obrázku a nahrát na Imgur.
po nahrání obrázku, když se vrátíte zpět do zobrazení tabulky, bude uveden název nahraného obrázku. Když vyberete položku v zobrazení tabulky, zobrazí se nahraný obrázek a jeho odkaz na Imgur. Aby to bylo jednoduché, nezahrnul jsem funkce úprav a mazání.
na navigačním panelu tohoto zobrazení je tlačítko Kopírovat URL, které můžete použít ke zkopírování adresy URL obrázku do schránky. Můžete to vyzkoušet zkopírováním adresy URL, otevřením Safari a vložením do odkazu. Nahraný obrázek uvidíte na Imguru.
Začínáme
s přehledem aplikace z cesty ji nyní můžeme nastavit. Existuje několik věcí, které musíte udělat, aby si to běží. Za prvé, budete potřebovat ID klienta od Imguru, abyste mohli používat jejich API, a za druhé, budete muset nastavit skupinu aplikací. K povolení skupin aplikací potřebujete účet vývojáře. Aby rozšíření mohlo sdílet data s jeho kontejnerovou aplikací, musíte nakonfigurovat skupinu aplikací. To umožní přístup ke sdílenému kontejneru mezi aplikací rozšíření a kontejneru.
chceme, aby rozšíření mělo přístup ke sdílenému kontejneru ze dvou důvodů: za prvé, stejně jako aplikace kontejner, bude každý obrázek nahraný prostřednictvím rozšíření uložen a zpřístupněn pro prohlížení prostřednictvím aplikace kontejner a za druhé použijeme relaci na pozadí pro nahrávání, která vyžaduje, aby byl obrázek uložen nejprve před nahráním, takže uložíme dočasný obrázek do sdíleného kontejneru, který se používá v úloze nahrávání na pozadí. Používáme nahrávání na pozadí, protože uživatelé mají tendenci se vrátit do hostitelské aplikace ihned po dokončení úkolu v rozšířeních, takže pokud je nahrávání potenciálně zdlouhavé, chceme, aby bylo dokončeno, i když je rozšíření ukončeno.
Chcete-li získat ID klienta Imgur, přihlaste se do imgur.com nebo si Zaregistrujte účet na imgur.com/register. po přihlášení klikněte na své uživatelské jméno v pravém horním rohu obrazovky a vyberte Nastavení.
poté vyberte aplikace z nabídky vpravo.
v části použité Aplikace Vyberte možnost vytvořit si vlastní.
v nabídce vlevo klikněte na zaregistrovat aplikaci a vyberte zaregistrovat její aplikaci, jak je znázorněno.
do formuláře žádosti zadejte název aplikace, co chcete. Pro typ autorizace vyberte OAuth 2 autorizace bez adresy URL zpětného volání, zadejte svou e-mailovou adresu do e-mailu a zadejte, co chcete pro popis. Do pole zadejte bezpečnostní text a odešlete formulář.
po úspěšném odeslání se zobrazí vaše ID klienta a tajemství klienta.
zkopírujte ID klienta a otevřete UploadImageService.swift (najděte jej ve skupině ImgurKit) a vložte jej do zobrazeného příkazu.
1
|
private let imgurClientId = „IMGUR_CLIENT_ID“
|
Chcete-li nakonfigurovat skupinu aplikací, nejprve změňte identifikátor balíčku aplikace. V navigátoru projektu vyberte položku ImgurShare a ze seznamu cílů vyberte cíl ImgurShare. Na kartě Obecné změňte identifikátor svazku z com.appcoda.ImgurShare na něco jiného. Potřebujete jiný identifikátor, protože identifikátor, který používáte pro skupinu aplikací, musí odpovídat identifikátoru svazku a musí být jedinečný.
dále přejděte na kartu Možnosti a zapněte přepínač skupiny aplikací. Přidejte novou skupinu a pojmenujte ji group. com .. ImgurShare. pro můj případ mám group. com. appcoda. ImgurShare.
vytvoření rozšíření sdílení
otevřete AddImageViewController.soubor swift a ve funkci shareImage(imageTitle:, imageToUpload:) změňte identifikátor kontejneru tak, aby odpovídal vytvořené skupině.
1
|
config.sharedContainerIdentifier = „group. com. appcoda. ImgurShare“
|
Otevřete službu ImageService.swift a proveďte totéž pro následující příkaz ve funkci tempContainerURL (image:, name:).
proveďte totéž pro příkaz uvedený ve funkci getFileUrl () ve stejné třídě.
nyní můžete spustit a otestovat aplikaci.
dále vytvoříme rozšíření sdílení. Vyberte projekt ImgurShare v navigátoru projektu a přejděte do editoru > přidat cíl > iOS > rozšíření aplikace > rozšíření sdílení
na další obrazovce nastavte název produktu na Imgurnahrání a ponechte zbývající pole nastavena na výchozí. Klikněte na Dokončit a aktivujte schéma ImgurUpload
dále nakonfigurujte skupinu aplikací pro cíl ImgurUpload. V navigátoru projektu vyberte Projekt ImgurShare a poté vyberte cíl ImgurUpload. Na kartě Možnosti zapněte přepínač skupiny aplikací a vyberte skupinu, kterou jste dříve vytvořili pro cíl ImgurShare.
abych umožnil sdílení kódu mezi aplikací rozšíření a kontejneru, dal jsem kód do rámce. Musíme to spojit s cílem ImgurUpload.
s vybraným cílem ImgurUpload klikněte na kartu Obecné na tlačítko + v části propojené rámce a knihovny. Vyberte ImgurKit.rámec ze seznamu a klepněte na tlačítko Přidat.
s tímto nastavením se nyní podívejme na soubory generované při vytváření rozšíření. Rozbalte skupinu ImgurUpload a uvidíte soubor scénáře, soubor nároků, řadič zobrazení a soubor plist ve skupině podpůrné soubory. Soubor nároků v příponě, stejně jako v aplikaci kontejner, je generován při konfiguraci skupin aplikací. Obsahuje podrobnosti o vaší skupině aplikací. Stejně jako v akčních rozšířeních můžete použít Soubor JavaScript k získání obsahu z webových stránek v prohlížeči Safari. Nebudeme to používat v našem rozšíření, ale pro představu o tom, jak využít soubory JavaScript k získání dat z hostitelské aplikace do řadiče zobrazení rozšíření, se můžete podívat na předchozí článek, který jsme udělali o akčních rozšířeních. Proces a nastavení je docela podobné.
soubor storyboard můžete použít k vytvoření vlastního rozhraní (nebo to udělat v kódu), ale rozšíření sdílení přicházejí s výchozím zobrazením kompozice, které použijeme. Je to rozhraní je podobné zobrazení compose dostanete, když sdílíte něco na Twitter nebo Facebook.
musíme určit typ obsahu, který naše rozšíření podporuje nastavením jeho aktivačního pravidla v souboru plist. Otevřít Info.plist a rozbalte klíč NSExtension. Poté rozbalte klíč NSExtensionAttributes a dostanete se do NSExtensionActivationRule. Ve výchozím nastavení je toto nastaveno na TRUEPREDICATE, což znamená, že vaše rozšíření bude vždy k dispozici, když uživatel chce sdílet obsah. Musíte to změnit a upřesnit, pokud chcete, aby vaše aplikace byla schválena App Store. Změňte jeho typ na slovník a přidejte nový pár klíč-hodnota. Nastavte název klíče na NSExtensionActivationSupportsImagewithmaxcount, zadejte číslo a hodnotu na 1. To určuje, že rozšíření podporuje sdílení jednoho obrázku najednou.
při pohledu na třídu ShareViewController najdete následující pahýly metody.
- isContentValid () – zde je ověřen vstup uživatele. Ověřujete zadávání textu i obsah, který má být sdílen, a vrátíte true, pokud ověření projde. Tlačítko Post v zobrazení compose zůstane Deaktivováno, dokud se true nevrátí.
- didSelectPost () – toto se nazývá poté, co uživatel klepne na tlačítko Post a právě zde nahrajete sdílený obsah. Jakmile je nahrávání naplánováno, musíte zavolat completeRequestReturningItems (, completionHandler:), aby hostitelská aplikace mohla zrušit blokování uživatelského rozhraní. Po dokončení požadavku na nahrávání zavolá obslužnou rutinu dokončení, která byla předána do předchozího zmíněného volání funkce.
- configurationItems () – výchozí zobrazení compose rozšíření share umožňuje nastavit, co se objeví v dolní části zobrazení pomocí buněk zobrazení tabulky. Chcete-li tak učinit, musíte vrátit pole objektů SLComposeSheetConfigurationItem, pokud máte konfigurace, které má uživatel nastavit. V opačném případě vraťte prázdné pole.
přidejte následující importy do třídy ShareViewController.
1
2
|
import ImgurKit
import MobileCoreServices
|
přidejte do třídy následující proměnnou. To bude držet obrázek vybraný uživatelem.
1
|
var selectedImage: UIImage?
|
dále přepíšeme viewDidLoad () a extrahujeme obrázek z položek přílohy v extensionContext. Když uživatel zveřejní obrázek, je svázán s dalšími metadaty a předán rozšíření pomocí objektu extensionContext. Přidejte do třídy následující.
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
|
přepsat func viewDidLoad () {
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 (data: imageData)
}
} else {
nechť alert = UIAlertController ( titul: „chyba“, zpráva: „Chyba načítání obrazu“, preferredStyle: .Upozornění)
let action = UIAlertAction (titul: „chyba“, styl:.Zrušit) {_in
vlastní.dismissViewControllerAnimated (true, dokončení: nil)
}
poplach.addAction (akce)
vlastní.presentViewController (alert, animovaný: true, dokončení: nula)
}
}
}
}
}
|
zde extrahujeme položku přílohy v objektu NSItemProvider a poté zkontrolujte, zda příloha odpovídá typu kUTTypeImage. kUTTypeImage je systémově definovaná řetězcová konstanta pro základní identifikátory jednotného typu definované v rámci MobileCoreServices. Používáme jej k identifikaci typů příloh.
obrázek je zabalen do třídy NSItemProvider, takže jej nejprve musíme načíst pomocí loadItemForTypeIdentifier(). Pokud je to úspěšné, načteme obrázek z adresy url, kde je uložen (při extrahování z NSItemProvider se obrázky ukládají na disk). Potom nastavíme vybranou proměnnou obrázek s obrázkem. V případě chyby se uživateli zobrazí upozornění.
dále upravte funkci isContentValid (), jak je znázorněno.
1
2
3
4
5
6
7
8
9
|
přepsat func isContentValid () – > Bool {
if let img = selectedImage{
if !obsah.isEmpty {
návrat true
}
}
návrat false
}
|
tato kontrola se ujistěte, že je vybrán obrázek a uživatel zadá nějaký vstup před tím, než může zveřejnit.
upravte didSelectPost() následovně.
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
|
přepsat func didSelectPost () {
nechť defaultSession = UploadImageService.sdílená služba.session
nechť defaultSessionConfig = defaultSession.konfigurace
nechť defaulttheaders = defaultSessionConfig.HTTPAdditionalHeaders
nechť 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.vybrané obrázky!)
obrázek.url = imageURL
nechť imageService = ImageService.sharedService
imageService.addImage (obrázek)
imageService.saveImages()
}
Pokud let container = tempURL {
var delError: NSError?
pokud NSFileManager.defaultManager ().isDeletableFileAtPath (kontejner.cesta!) {
nechť úspěch = NSFileManager.defaultManager ().removeItemAtPath (kontejner.cesta!, chyba: &delError)
if(!úspěch) {
println („chyba při odebrání souboru na cestě: \(chyba?.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?.popis)“)
}
}
}
}
}
nechť title = contentText
UploadImageService.sdílená služba.uploadImage (selectedImage!, název: název, relace: relace, dokončení: dokončení)
já.extensionContext?.completeRequestReturningItems (, nil)
}
|
nahraďte identifikátor skupiny aplikací v níže uvedeném prohlášení vlastním.
1
|
config.sharedContainerIdentifier = „group. com. appcoda. ImgurShare“
|
zde definujeme relaci pozadí, kterou použijeme pro nahrávání. Poté definujeme blok dokončení, který bude vyvolán po dokončení požadavku. V bloku dokončení zkontrolujeme, zda bylo nahrávání úspěšné, a pokud ano, uložte obrázek (obrázky uložené zde budou načteny do tabulky aplikace kontejneru). Poté odstraníme dočasný obrázek, který byl uložen na disk během požadavku na pozadí. Pokud se nahrávání nezdařilo, odstraníme také dočasný obrázek a neukládáme jej pro pozdější prohlížení v aplikaci kontejner. Chceme pouze, aby aplikace kontejner zobrazovala obrázky, které byly úspěšně nahrány do Imguru.
Všimněte si použití contentText. Tato vlastnost drží textový vstup od uživatele.
poté zavoláme funkci uploadImage () v rámci ImgurKit, abychom provedli nahrávání. Tato metoda je asynchronní a okamžitě se vrátí. Po dokončení nebo selhání nahrávání bude vyvolán blok dokončení.
další upravit configurationItems (), jak je znázorněno. Vracíme prázdné pole, protože nebudeme přidávat nic do zobrazení compose rozšíření.
1
2
3
|
přepsat func configurationItems () – > ! {
návrat
}
|
nyní můžete spustit aplikaci. Ujistěte se, že je vybráno schéma ImgurUpload. Po zobrazení výzvy k výběru aplikace, kterou chcete spustit, vyberte fotografie. Po spuštění vyberte fotografii a klepněte na tlačítko Sdílet. Při prvním spuštění budete muset přidat rozšíření do listu sdílení. Vyberte tlačítko Více napravo od ostatních ikon sdílení a zapněte přepínač pro rozšíření a poté vyberte Hotovo.
zpět na listu sdílení uvidíte ikonu rozšíření vedle ostatních ikon sdílení. Vyberte příponu, zadejte nějaký text a klepněte na příspěvek.
obrázek bude nahrán do Imguru a uložen do aplikace kontejner. Chcete-li to potvrdit, přejděte na domovskou obrazovku a otevřete ImgurShare. V zobrazení podrobností uvidíte název, který jste zadali pro obrázek, a samotný obrázek.
pokud opustíte aplikaci kontejner a přejdete zpět do aplikace Fotografie a sdílíte další obrázek a vrátíte se zpět do aplikace kontejner, všimnete si, že se tabulka automaticky neaktualizuje s přidanou položkou. Pokud vyberete řádek tabulky a poté se vrátíte zpět do zobrazení tabulky, Tabulka bude aktualizována. Když se aplikace vrátí zpět do popředí, musíme znovu načíst data tabulky. Nejprve přidejte následující funkci do třídy ImagesTableViewController.
1
2
3
|
func refreshTable () {
tableView.reloadData()
}
|
pak v AppDelegate.swift, přidejte do funkce applicationWillEnterForeground () následující.
1
2
|
nechť vc = ImagesTableViewController ()
vc.obnovitelné()
|
nyní, kdykoli nahrajete obrázek pomocí rozšíření a přivedete aplikaci kontejner zpět do popředí, bude tabulka aktualizována.
shrnutí
který uzavírá tento kurz rozšíření sdílení. Doufám, že průvodce přijde vhod každému, kdo chce vytvořit rozšíření sdílení. Soubory projektu si můžete stáhnout zde.
Poznámka: Při sdílení souboru pomocí přípony si všimnete chybové zprávy v debuggeru „Nepodařilo se zdědit oprávnění CoreMedia od xxxx“. Zdá se, že se jedná o běžnou chybu a setkal jsem se s ní při práci s rozšířeními Today, Share a action. Rozšíření stále funguje i přes chybu. Hledání kolem, zdá se, že je běžné a v tomto příspěvku Stackoverflow někdo říká, že jejich rozšíření funguje dobře a bylo schváleno společností Apple navzdory chybě. Takže to může být chyba Xcode. Nejsem si jistý. Své myšlenky můžete nechat v komentáři.