App Today Extension開發註意事項

来源:http://www.cnblogs.com/ALongWay/archive/2016/11/16/6070680.html
-Advertisement-
Play Games

從iOS 8起,就有了App Extension。Extension的種類至今也擴充到了19種,應用也很廣泛,值得重點關註起來。 Extension幾乎可以看做一個內嵌的獨立App,擁有獨立的BundleID、證書、概要配置文件、進程空間、沙盒等等。只是需要打包在App內,類似於寄生在宿主App內, ...


從iOS 8起,就有了App Extension。Extension的種類至今也擴充到了19種,應用也很廣泛,值得重點關註起來。

Extension幾乎可以看做一個內嵌的獨立App,擁有獨立的BundleID、證書、概要配置文件、進程空間、沙盒等等。只是需要打包在App內,類似於寄生在宿主App內,捆綁安裝。不過一旦安裝應用後,擴展可以由系統獨立調用,執行擴展內的代碼邏輯。

這篇只記錄之前開發Today Extension的過程中,值得註意的事項。其實大多都是通用的。

 

1.創建Extension和證書管理

在已創建的項目中,新建File->New->Target->Today Extension,確定名稱後,就可以在工程文件的Targets列表中,看到新建的extension。

在General欄可以看到,Extension有獨立的Identity內容,Bundle Identifier一般具有宿主應用的Bundle Identifier首碼。如果使用Xcode8的自動管理證書,並登錄了開發者賬號,可以在開發者中心看到自動創建的該AppID。

接著為該AppID創建Provisioning files即可。

 

2.MainInterface.storyboard和主要的類

新創建的Extension與App的主Target分別在不同的文件目錄下,彼此隔離。主界面、Info.plist和本地化文件等都是單獨管理的,所以可創建並修改InfoPlist.strings的本地化文件中CFBundleDisplayName欄位,單獨為擴展命名,如果不修改,將預設使用宿主App的顯示名稱。

擴展和宿主App是隔離的,不能使用彼此的類、框架、資源,如果想使用宿主的類庫或者資源文件等,最直接的辦法就是拷貝到當前Target或者增加需要Link的框架。不過,查看Extension的Build Settings,Prefix Header可以填寫宿主App的Prefix Header,並使用其引用頭文件中的巨集定義。

擴展預設使用了MainInterface.storyboard,並綁定了一個類TodayViewController,並已經創建了一個Hello World視圖,我們可以直接使用並修改。但是如果不想使用storyboard或者需要修改啟動類,可以將Info.plist文件中NSExtension字典的NSExtensionMainInterface項去掉,增加NSExtensionPrincipalClass項,value則為指定啟動類的類名,例如TodayViewController。

 

3.生命周期

擴展的視圖控制器與宿主的視圖控制器一樣,具有常見的生命周期方法。例如當第一次在下拉的“今日”列表中顯示本應用擴展,則會執行viewDidLoad方法,然後依次執行其他方法;消失和再次出現,則會調用disappear和appear系列方法;即將被銷毀時候,調用dealloc方法。

 

4.Today Extension的size

iOS10以後,重新規定了Today Extension的size。寬度是固定(例如在iPhone6上是359),所以無法改變;但是高度方面,提供了兩種模式:

NCWidgetDisplayModeCompact:固定高度,則為110

NCWidgetDisplayModeExpanded:可以變化的高度,區間為110~616

使用如下代碼可以修改模式:

  if ([[UIDevice currentDevice].systemVersion floatValue] >= 10) {       

    self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;

    }

我們可以在NCWidgetProviding協議的如下代理方法中,取到size的最大範圍:

- (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize NS_AVAILABLE_IOS(10_0);

用如下方法確定邊距:

- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets NS_DEPRECATED_IOS(8_0, 10_0, "This method will not be called on widgets linked against iOS versions 10.0 and later.");

 

如果需要修改Widget展示的背景高度,可以修改屬性:self.preferredContentSize 

 

5.數據共用

既然擴展與宿主App是隔離的,那麼數據共用就需要使用App Groups了。

在App主Target的Capabilities欄,找到App Groups項,開啟功能,並點擊“+”符號添加一個共用的數據容器名稱,例如group.xxx。然後會發現主Target和擴展Target目錄中都生成了一個entitlements類型文件,記錄了一個App Groups項。

這個共用的容器,就是存放擴展和宿主App共用的數據的空間。

為了正常編譯,還需要前往開發者中心,編輯主應用和擴展的AppID,開啟支持App Groups功能,類似於開啟推送功能。

配置完成後,就是使用了。不管是採用UserDefaults、Archive、CoreData、FMDB、LevelDB等哪種數據存儲或操作方式,只需要將路徑指向共用的容器路徑就可以。

例如使用UserDefaults方式:

   NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.xxx"];

    [defaults setObject:@"xxxxx" forKey:@"phoneNum"];

 

只是打開了指定的UserDefaults對象,使用的實例方法為initWithSuiteName。

其他方式同理。

 

6.類庫和資源共用

前面提到,擴展需要使用宿主Target的類庫和資源,可以直接拷貝到擴展Target目錄下,但是這樣做會增加應用體積。

另一個方法,就是創建framework動態鏈接庫。新建File->New->Target->Framework,得到一個新的Target,與系統的框架類似,我們可以自由添加類文件封裝功能,只暴露public頭文件供調用。在Build Phases欄的Headers項中,將Project組的頭文件拖動到Public組即可。

framework也有Bundle ID,但是不需要關註,並且不需要配置證書。

需要註意的是,新建的動態鏈接庫,一般會自動創建同名的頭文件,可以直接在其中引用需要暴露的自定義類頭文件。但是如果刪除了該頭文件,可能會有如下警告:

warning: no umbrella header found for target 'OrderFoodTodayKit', module map will not be generated

 

另外一個需要特別註意的地方,因為我們創建的動態鏈接庫是需要提供給擴展使用的,而擴展不支持部分Api,所以該framework中就需要除去擴展不支持的部分Api。在framework的General欄的Deployment Info中,勾選Allow app extension API only。這樣的話,如果在framework中使用了擴展不支持的Api,編譯會報錯。

 

7.Today Extension調起宿主App

如果需要從Today Extension中調起宿主App,可以使用宿主App的Url Scheme方式:

    [self.extensionContext openURL:[NSURL URLWithString:@"xxxx://xxxx"] completionHandler:nil];

 

以上就是開發過程中,需要註意的事項記錄。

完整的開發教程,推薦查閱:http://www.cocoachina.com/ios/20141023/10027.html


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

-Advertisement-
Play Games
更多相關文章
  • 今天學了跨域,迫不及待想跟大家分享!不妥之處希望大家指正。 首先來明確一下“跨域”這個概念。 跨域指的是,到外域去取數據。那什麼是“外域”呢?我們先來瞭解同域。同域指的是,同協議、同功能變數名稱、同埠。如果兩個URL,協議相同,功能變數名稱相同,埠號相同,那麼這兩個URL就屬於同域。那麼外域就是,協議不同,或者 ...
  • 先上代碼: 代碼挺簡單的,但是這一點代碼也有可能達不到預期效果。 一開始,在readWrite()函數中,我用的是註釋掉的那些代碼,沒有用紅色部分代碼,結果點擊“讀寫”按鈕後,還是不可編輯。於是就改成了紅色部分代碼,結果再點擊“讀寫”按鈕就可以編輯了。 總結了一下,當達不到預期效果時,可以使用以下幾 ...
  • 關於列表中checkbox選中,全選設置 以上代碼主要處理 1.在列表中如果選中行則選中這行的checkbox,如果再次點擊則取消選中 2.在列表中包含全選checkbox 下麵我自己加入的一段全選和反選的代碼: ...
  • 一、前言: 有時候,我們需要對一些字元串中的字元進行位置變化處理。如 “2016-11-16” 需要調整為 “16/11/2016”。我們知道有很多方法可以使用,比如split()拆分成數組後在進行拼接,也可以使用正則表達式的分組機制來進行處理。下麵我們就將這種方法進行實例對比: 二、split() ...
  • 第一步:到官網下載第三方包,拷貝到自己的項目中 https://github.com/Maxwin-z/XListView-Android 第二步:xml文件 第三步:java代碼 ...
  • 嗨!各位,小編又和大家分享知識啦,在昨天的博客筆記中小編給大家講解瞭如何去配置Android工具以及SDK中的一些配置,那在今天的學習小編會帶給大家哪些Android知識呢?首先我們看一下今天的學習目錄吧。 知識一:瞭解Android項目目錄結構 知識二:Android的配置文件(清單文件) 知識三 ...
  • 這篇博客是關於如何搭建eclipse的android開發環境, 與網上的其他博客不同,我的方法比他們簡單的多,所 以推薦給大家。 搭建eclipse的android開發環境步驟: 1.配置JDK(Java Development Kit,Java開發工具包) (因為android是基於Java語言開 ...
  • 在Android王國中,Service是一個勞動模範,總是默默的在後臺運行,無怨無悔,且總是乾最臟最累的活,比如下載文件,傾聽音樂,網路操作等這些耗時的操作,所以我們請尊重的叫他一聲:"勞模,您辛苦了". 帶著這份好尊重,我又重新研讀了API的文檔,發現老外寫東西還是很靠譜的,人家在文檔中告訴你Se ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...