iOS Extension(應用擴充套件)-----Widget開發(附Demo)
extension是iOS8新開放的一種對幾個固定系統區域的擴充套件機制,它可以在一定程度上彌補iOS的沙盒機制對應用間通訊的限制。
extension的出現,為使用者提供了在其它應用中使用我們應用提供的服務的便捷方式,比如使用者可以在Today Extension中檢視應用展示的簡略資訊,而不用再進到我們的應用中,同樣可以快捷操作app的功能,這將是一種全新的使用者體驗。
現在新建一個專案,命名為TodayWidth(tip:英文寫錯了本來是想建立TodayWidget /捂臉) 不過也不影響什麼就是看著彆扭點
在此基礎上,想要使用Today Extension,我們需要建立一個新的target,File-->New-->Target-->Today Extention,如圖
選中iOS->TodayExtension 點選Next 我們命名為TodayWidget 在彈出框中選擇Activate,啟用這個scheme 如圖
啟用之後,專案中就會多出一個TodayWidget的擴充套件如圖 忽略部分等會 會講解 因為專案是我剛才做完的
到這裡一個簡單的通知中心擴充套件已經完成了
但是如何在擴充套件和宿主App之間共享資料
因為這是個簡單的測試App,所以我也沒有用到CoreData,sqlite之類的資料庫,而是直接使用的NSUserDefaults來儲存,這個也是我後面要介紹的如何共享資料。
擴充套件與宿主App之間共享資料有兩種方式:
1.通過NSUserDefaults,這也是我現在介紹的方式
2.通過一個擴充套件與App都可以訪問的共享容器來存放檔案,資料(CoreData,Sqlite等都可以存放在這個共享的容器中)
首先我們需要建立一個App Group,選中專案的Target ->Capabilities -> App Groups,開啟,選擇+號,填入group的名稱(複製這個名稱,因為後面要用到),因為我已經建立好了 所以我這邊還是演示了下 如下圖 Tips:Targets下的工程和Extension都需要建立App Group
然後專案中就會多出兩個檔案如圖
我寫的是首頁展示儲存的內容 如圖吧 點選+好 進入簡單介面 首頁展示的就是輸入框儲存的內容
我們新增一條資料之後,我們將這條資料儲存到共享的NSUserDefaults中去
- (void)saveClick{
_textF.text = [_textF.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if (_textF.text.length){
NSArray *arr = [[[NSUserDefaults alloc] initWithSuiteName:@"group.com.msd.app"] valueForKey:@"TextF"];
NSMutableArray *widgetArray = [NSMutableArray array];
for (int i=0; i<arr.count; i++) {
[widgetArray addObject:arr[i]];
}
[widgetArray addObject:_textF.text];
// NSUserDefaults *def = [[NSUserDefaults alloc]initWithSuiteName:@"group.com.msd.app"];
// [def setValue:widgetArray forKey:@"TextF"];
// [def synchronize];
[[[NSUserDefaults alloc]initWithSuiteName:@"group.com.msd.app"]setValue:widgetArray forKey:@"TextF"];
[self.navigationController popViewControllerAnimated:YES];
}
}
- (void)saveClick{
_textF.text = [_textF.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
if (_textF.text.length){
NSArray *arr = [[[NSUserDefaults alloc] initWithSuiteName:@"group.com.msd.app"] valueForKey:@"TextF"];
NSMutableArray *widgetArray = [NSMutableArray array];
for (int i=0; i<arr.count; i++) {
[widgetArray addObject:arr[i]];
}
[widgetArray addObject:_textF.text];
// NSUserDefaults *def = [[NSUserDefaults alloc]initWithSuiteName:@"group.com.msd.app"];
// [def setValue:widgetArray forKey:@"TextF"];
// [def synchronize];
[[[NSUserDefaults alloc]initWithSuiteName:@"group.com.msd.app"]setValue:widgetArray forKey:@"TextF"];
[self.navigationController popViewControllerAnimated:YES];
}
}
這樣就已經將資料存在一個可共享的地方,宿主App和擴充套件都是從一個地方取資料,現在我們在App中新增一條資料,然後就可以下拉開啟通知中心查看了
如何在擴充套件和宿主App之間共享程式碼(framwork建立)
上面的一條blog已經介紹的很清楚 blog名為:iOS 封裝生成.framework
建立的ShareTable.framework匯入時Add to targets都選中
如果只選中1個的話,沒選中的就用不了標頭檔案 編譯爆紅 可以通過下面的方法解決 點選.framework庫
widget基本上介紹完了