1. 程式人生 > >iOS Extension(應用擴充套件)-----Widget開發(附Demo)

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基本上介紹完了