App Extensions篇之Share Extension

来源:http://www.cnblogs.com/zhanggui/archive/2017/07/05/7119572.html
-Advertisement-
Play Games

這裡主要是對App Extension的一些介紹以及詳細給大家介紹一下Share Extension,後期會添加其他的Extension介紹。 ...


轉載請註明出處:http://www.cnblogs.com/zhanggui/p/7119572.html

1.前言

這裡主要是對App Extension的一些介紹以及詳細給大家介紹一下Share Extension,後期會添加其他的Extension介紹。

2.開始

主要對App Extension和Share Extension進行介紹。請繼續往下看:

2.1: App Extension的介紹

 官方給的說法是:App Extension可以讓你擴展你的APP的自定義功能和內容,使用戶可以在與其他應用或者系統進行互動的時候去使用它。翻譯的不一定准確,這樣說可能會好理解:我們平時看到的Widget、微信和QQ的share等等,都是App Extension,下圖是一些例子:

其實就是我們經常看到的Widget,但是Widget只是Today Extension,除了Today Extension,還有很多。

一個支持擴展的系統區域叫做一個extension point(擴展點)。每個擴展點的擴展都有自己獨有的使用方法和API。你可以根據你的需求來選擇不同的擴展。官方API裡面提出了一個名詞叫:Host app,我們可以把它理解為宿主的App也就是提供應用擴展界面顯示或者功能的App。還有一個container app,我們可以把它理解為容器App,就像上圖的微信share extension,容器app就是微信。

擴展和app不同,擴展無法單獨上架AppStore。儘管你必須使用個app來包含並且分發你的extension,extension也是一個單獨的二進位文件,獨立於用於傳遞和分發的container app。

你可以通過File--->New --->Target來創建Extension,它和其他的target一樣,它和你的app project組合成為一個產品。一個app可以有一個擴展,也可以有多個擴展。最好的創建擴展的方式就是通過Xcode提供的Extension種類選擇自己需要的來創建,裡面包含了必要的API以及方法實現。

如果你想讓用戶去使用你的擴展,那麼就需要吧你的containing app發佈到AppStore,當用戶安裝了你的Containing app,擴展也就安裝了。不同的擴展啟動的方式也不一樣,例如Today Extension,你需要Widget來展示到你的通知中心。擴展也不要亂用,擴展的最佳用戶體驗從來都是希望用戶操作更精簡、更快速,並且專註於單個任務。

 

2.1.1: Extension的種類

我們可以在Xcode的File--->New--->Target裡面看到不同平臺的Extension,包括iOS、watchOS、tvOS、macOS等等。這裡主要介紹iOS,主要包括以下幾種Extensions:

1.Action Extension:動作擴展,在另一個應用程式的上下文中操作或者查看內容

2.Audio Unit Extension:音頻單元擴展

3.Broadcast UI Extension:廣播UI 擴展

4.Broadcast Upload Extension:廣播上傳擴展

5.Call Directory Extension:呼叫目錄擴展

6.Content Blocker Extension:內容攔截器擴展

7.Custom Keyboard Extension:鍵盤擴展,例如第三方的鍵盤,搜狗輸入法,百度輸入法等。

8.iMessage Extension:消息的擴展

9.Intents Extension:Intents擴展

10.Intents UI Extension:Intents UI擴展

11.Notification Content Extension:通知內容擴展

12.Notification Service Extension:通知服務擴展

13.Photo Editing Extension:圖片編輯擴展,在照片app中編輯照片或者視頻

14.Share Extension:分享擴展,發佈一個共用網站或者與其他應用共用內容。

15.Shared Links Extension:分享鏈接擴展

16.Spotlight Index Extension:Spotlight 索引擴展

17.Sticker Pack Extension:貼紙包擴展

18.Today Extension:Today擴展,可以快速獲取更新或者在通知中心的近日視圖中執行一項快速任務。

等等。也可直接在這裡參見更多extension。

2.1.2: App Extensions的生命周期

先上圖,估計你已經看到了好多次這張圖,恭喜你這次又看到了,因為這個是蘋果官方提供的圖片。

 

 

1.用戶選擇要使用的App extension

2.系統啟動App Extension

3.App Extension 代碼運行

4.運行完之後系統kill掉App Extension

這就是App Extension的生命周期,舉個例子:

一個Share Extension,在圖庫裡面你選擇了一張圖片,然後點擊分享,選擇你的Share Extension(第一步),此時系統會啟動你的Share Extension(第二步)。然後你將選擇的圖片分享到指定的程式(例如微信的發送給朋友)(第三步)。接下來分享頁面關閉,系統kill掉了Share Extension。

2.1.3: App Extension的通信方式

App Extension主要的通信是和他的host app(例如微信的Share Extension和微信),來自host app的請求和extension的response。下圖你應該也很熟悉(app 擴展直接和host app溝通):

 

 

 

這個展示的就是正在運行的App Extension、host app和containing app之間的關係。可以看出:Containing App和app Extension並沒有直接的溝通。甚至有的時候Containing app可以不運行,而App Extension直接運行。Containing app和Host app沒有任何的溝通。

在一個典型的request/response中,系統打開代表host app(圖庫)的extension(微信分享的share extension),把host app提供的數據(圖片和選擇的好友)輸送到extension的context,然後extension展示界面,提供一些功能任務(例如微信的分享到朋友)。

還有一種是app extension可以直接和他的containing app溝通:

例如Today Widget,可以直接告訴系統打開他的Containing app,只需要調用NSExtensionContext的openURL:CompletionHandler:方法即可。

2.1.4: 在App Extension中不可以做的事情

一個app extension不能有以下情況:

1.訪問sharedApplication對象。因此不能使用任何該對象的防範

2.使用任何標記NS_EXTENSION_UNAVAILABLE巨集的API,或者類似的巨集,或者不可用framework裡面的API,例如HealthKit framework不能用於app extensions

3.iOS設備訪問相機或者麥克風(iMessage app可以訪問這些資源,只要在Info.plist裡面進行配置使用描述即可)

4.運行一個長時間的後臺任務(根據不同平臺而異)

5.使用AirDrop接收數據

 2.2: Share Extension的簡單使用

這裡我們以Share Extension為例進行介紹。

2.2.1: 選擇正確的Extension Point開始開發 

當你創建app extension的時候,可以直接使用Xcode自帶的模板創建你需要的Extension。點擊File--->New--->Target:

從這裡選擇符合你需求的Extension,當你創建完畢後,你的項目工程目錄就會多一個文件夾:

可以發現多了一個.swift、.storyboard和一個Info.plist。接下來你也會在Scheme里發現一個Extension,而且多了一個以.appex為尾碼的Bundle

這裡需要註意:

一個app extension必須在architectures build settings 裡面包含arm64(ios)或者x86_64(OS X),否則containing app上架的時候將會被拒絕。Xcode預設的Standard architecture包含了64-bit的architecture。

An app extension target must include the arm64 (iOS) or x86_64 architecture (OS X) in its Architectures build settings or it will be rejected by the App Store. Xcode includes the appropriate 64-bit architecture with its “Standard architectures” setting when you create a new app extension target.

If your containing app target links to an embedded framework, the app must also include 64-bit architecture or it will be rejected by the App Store.

 2.2.2: 來看看預設的App Extension模板

從上面的項目工程目錄看,每個extension都包含了一個plist文件、一個視圖控制器類和一個預設的user interface,這些都是被extension point定義的。我們先來看一下Info.plist裡面的東西:

再看看項目工程的Info.plist:

兩者可以進行一個對比,可以看出:

1、CFBundlePackageType不一樣,項目是APPL,而Extension的是XPC!

2、比較明顯的就是App Extension裡面多了一個NSExtension的字典。 

在Info.plist中,該文件必須包含NSExtension鍵和擴展點指定的鍵和值的字典。這裡的ExtensionPointIdentifier是com.apple.share-services,因為我創建的是Share Extension。

這裡註意,如果你的app extension的Info.plist裡面包含了UIBackgroundModes key那麼將無法通過AppStore的審核。 

 

2.2.3:調試App Extension 

調試App Extension很簡單,你要做的就是選擇(scheme)擴展,然後點擊Run, 就會彈出一個彈框讓你選擇Host app,選擇Host app之後便可以運行調試。比如你調試Share Extension,你可以選擇照片,然後讓照片當Host app,然後運行之後就會打開照片,選擇分享就會看到你的app擴展,然後進行debug斷點處理等。

2.3:Share Extension Demo

先看一下我自己做的分享Demo效果:
 

然後在containing app裡面查看分享的圖片:如上圖的第三張圖。先看一下這裡預設創建的Share Extension的視圖控制器:

 

class ShareViewController: SLComposeServiceViewController {

    override func isContentValid() -> Bool {
        // Do validation of contentText and/or NSExtensionContext attachments here
        return true
    }

    override func didSelectPost() {
        // This is called after the user selects Post. Do the upload of contentText and/or NSExtensionContext attachments.
    
        // Inform the host that we're done, so it un-blocks its UI. Note: Alternatively you could call super's -didSelectPost, which will similarly complete the extension context.
        self.extensionContext!.completeRequest(returningItems: [], completionHandler: nil)
    }

    override func configurationItems() -> [Any]! {
        // To add configuration options via table cells at the bottom of the sheet, return an array of SLComposeSheetConfigurationItem here.
        return []
    }

}

 

裡面主要有三個方法:

isContentValid是用來判斷內容是否可用的,這裡可以做一些校驗,比如我們分享的內容是否符合要分享的要求,如果返回false,那麼在上圖的Post按鈕就無法點擊了。因為一旦返回false,則說明分享內容不符合要求,也就無法Post了。

configuration是一個配置數組,它可以配置多個列表,例如微信分享的[發送給朋友,分享到朋友圈,收藏]:

 

 didSelectPost是你點擊發送之後處理的事件,比如微信的點擊收藏,可以調用微信的api,然後進行收藏。預設的註釋也說明瞭本方法的作用:

當用戶選中post之後調用。是對內容或者NSExtensionContext附件的上傳。我這裡使用App Group的方式進行app Extension和containing app進行交互。先將內容存儲到UserDefaults,然後再在containing app裡面取出圖片展示到containing app裡面。

這裡我把圖片存儲到了UserDefaults,然後在Containing app裡面獲取:

 suite的name是app group的名稱。具體可參見Github源碼里的ShareExtension。 

總結

App Extension的出現使App的使用更加方便,比如系統的天氣widget,還有類似微信(QQ)的分享,完全可以實現不打開containing app而直接使用share extension分享。

 在後續的時間里,將會不定期進行更新,給讀者介紹其他的Extension,如有任何疑問,隨時留言溝通。

參考資料

1、App Extension Programming Guide 

2、深入App Extensions for iOS8

3、Information property List Key Reference

4、App Extension Programming Guide---Share


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • content-box:padding和border不被包含在定義的width和height之內。對象的實際寬度等於設置的width值和border、padding之和,即 ( Element width = width + border + padding )此屬性表現為標準模式下的盒模型。bor ...
  • 1. 簡介 本次demo中一共封裝了兩個組件:ImageEditButton 和 ImageEditContainer。其中ImageEditContainer 是在 ImageEditButton,兩個組件可單獨使用。 在demo中,實現了 圖片選擇(拍照+本地),裁剪,壓縮,保存本地 以及對已選 ...
  • 1、錯誤信息:[Vue warn]: Property or method "object" is not defined on the instance but referenced during render. Make sure to declare reactive data propert ...
  • 一,效果圖。 二,代碼。 ViewController.h ViewController.m ...
  • 1.Android開發環境 Android常用的開發環境包括兩個:Eclipse + ADT 和Android Studio,Android Studio作為google官方推出的開發環境自然有得天獨厚的優勢,所以推薦使用Android Studio進行開發。關於安裝我就不介紹了。 以後有空我會總結 ...
  • 1.許可權被分為了普通和危險兩種 2.打電話的Demo ...
  • 平臺 Ubuntu14.04 64 現象 在AndrodStudio中點擊模擬器的啟動按鈕後,模擬器界面彈出後,又立刻閃退。 解決 一、查看模擬器的信息 從上面可以看到模擬器的存放路徑以及名稱: 路徑:/home/pengdonglin/.android/avd/4_WVGA_Nexus_S_API ...
  • 大家好,今天想與大家一起分享的是Activity。我們平時接觸的最多的就是Activity了,作為四大組件中最為重要的老大,Activity究竟是如何啟動的呢?這篇文章將會從源碼的角度為大家進行全方位的解析,為了方便大家理解整個的過程,我會用流程圖的方式將整個過程串起來,希望對大家有所幫助。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...