Widget專題
1 機制原理
1.1 概念
1、appextension
app extension:extension是iOS8新開放的一種對幾個固定系統(tǒng)區(qū)域的擴展機制谴返,extension并不是一個獨立的app,它有一個包含在app bundle中的獨立bundle中贝,extension的bundle后綴名是.appex。當然它有好多類型潭陪,如下圖官方文檔上介紹的那天雄妥,今天我們主要講解的就是Today中的,又叫做widget依溯。
2老厌、containing app
包含extension的app就是containningapp,因為extension不能單獨存在黎炉,所以必須得依附在一個正常的app里枝秤,這樣才能提交商店。
3慷嗜、host app
能夠調(diào)起extension的app被稱為hostapp淀弹,比如widget的host app就是Today。
我們看下它們?nèi)咧g是如何工作的庆械,如下圖:
作為一個ios開發(fā)者薇溃,遇到問題的時候,有一個學習的氛圍跟一個交流圈子特別重要,對自身有極大幫助缭乘,眾人拾柴火焰高 這是一個我的iOS交流群:711315161沐序,進群密碼iOS 分享BAT,阿里面試題、面試經(jīng)驗堕绩,討論技術策幼, 大家一起交流學習成長!希望幫助開發(fā)者少走彎路奴紧。
2 實現(xiàn)
2.1 新建Target
接下來我們具體看如何完成一個簡單的DEMO特姐,這樣你就更加了解了。
首先我們先新建一個工程黍氮,這一步就省略了唐含,接下來我們增加一個target,選擇TodayExtension,如下圖:
然后創(chuàng)建完沫浆,如下圖:
默認創(chuàng)建的storyboard里是helloworld觉壶,所以我們先run項目,看看效果:
是不是很簡單件缸,_铜靶。。他炊。
2.2 數(shù)據(jù)共享
那么接下來我們看下containing app跟extension如何共享數(shù)據(jù)争剿,例如我containing app里的數(shù)據(jù),我要在extension顯示痊末。
2.2.1 添加appgroups
在這之前蚕苇,我們要先講下app groups,它主要用于同一group下的app共享同一份讀寫空間凿叠,以實現(xiàn)數(shù)據(jù)共享涩笤。我們看下工程中如何開啟app groups嚼吞,首先們選擇targets,然后選擇containing app蹬碧,->Capabilities舱禽,打開appgroups的開關,如下圖:
點下面的加號按鈕恩沽,新建一個group誊稚,例如:group.com.company.app,如下圖:
創(chuàng)建完后如下圖:
同理罗心,選擇targets為extension里伯,同樣創(chuàng)建一個appgroups,選擇跟containing app一樣的名字渤闷,就是containing app里的appgroups跟extension里的app groups名字相同疾瓮,如下圖:
OK。飒箭。爷贫。app groups創(chuàng)建好后,我們就可以實現(xiàn)數(shù)據(jù)共享了补憾,
2.2.2 共享數(shù)據(jù)讀寫
2.2.2.1 通過NSUserDefaults
第一種方法是通過NSUserDefaults漫萄,存數(shù)據(jù)代碼如下:
1 **NSUserDefaults** *shared = [[NSUserDefaults alloc] initWithSuiteName:groupID];
2 [shared setObject:[NSNumber numberWithInt:10] forKey:@"number"];
3 [shared synchronize];
取數(shù)據(jù)如下:
1 **NSUserDefaults** *shared = [[NSUserDefaults alloc] initWithSuiteName:groupID];
2
3 **NSString** *string=[NSString stringWithFormat:@"%@",[shared objectForKey:@"number"]];
4
5 _numberLabel.text=string;
我們在containing app中存一個數(shù)據(jù),然后在extension里取一個數(shù)據(jù)盈匾,demo中我存了一個數(shù)字10腾务,然后我們看下效果:
2.2.2.2 通過NSFileManager
還有一種方法是通過NSFileManager來實現(xiàn),存數(shù)據(jù)代碼如下:
1 **NSError** *err =** nil**;
2 **NSURL** *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupID];
3 containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/test"];
4
5 **NSString** *value =@"123";
6
7 **BOOL** result = [value writeToURL:containerURL atomically:**YES** encoding:NSUTF8StringEncoding error:&err];
取數(shù)據(jù)代碼如下:
1 **NSError** *err =** nil**;
2 **NSURL** *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:groupID];
3 containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/test"];
4 **NSString** *value = [NSString stringWithContentsOfURL:containerURL encoding:NSUTF8StringEncoding error:&err];
2.2.2.3 共享代碼
對于更復雜工程里加入extension削饵,可能需要共享代碼岩瘦,你可能需要把一些公用的數(shù)據(jù)寫入自己的framework中,然后containing app跟extension中各存一個窿撬,以此來達到共用代碼启昧,至于具體的實現(xiàn),各位可以自己去嘗試嘗試_劈伴。密末。
2.3 點擊extension內(nèi)容回到containing app
我們再看下通過點擊extension里的內(nèi)容來回到containing app中,其實就是通過openurl跛璧,首先需要在containing app中創(chuàng)建urltype严里,如下圖:
在extension中,寫如下代碼:
[**self**.extensionContext openURL:[NSURL URLWithString:@"TestWight://"] completionHandler:^(**BOOL** success) {
NSLog(@"open url result:%d",success);
}];
需要注意的地方是追城,extension中view的位置不是最左邊開始的刹碾,而是默認從icon后開始的,所以如需修改座柱,代碼入下:
// 一般默認的View是從圖標的右邊開始的...如果你想變換,就要實現(xiàn)這個方法
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {
//UIEdgeInsets newMarginInsets = UIEdgeInsetsMake(defaultMarginInsets.top, defaultMarginInsets.left - 16, defaultMarginInsets.bottom, defaultMarginInsets.right);
//return newMarginInsets;
//return UIEdgeInsetsZero; // 完全靠到了左邊....
**return** UIEdgeInsetsMake(0.0, 16.0, 0, 0);
}
還有就是有時view里的控件看不見迷帜,所以需要添加這句話:
**self**.preferredContentSize = CGSizeMake(**self**.view.bounds.size.width, 100);
需要手動自己添加物舒,在下拉通知里的edit里,
2.4 常見使用問題
2.4.1 運行后Today中沒有widget
可能是新建的工程的Deployment Target版本太高了戏锹,比測試機版本高冠胯,導致存在版本兼容性問題,將版本值設為6.0或者7.0即可景用。
3 參考鏈接
ios8新特性widget開發(fā)
http://blog.csdn.net/kuloveyouwei/article/details/44019815
iOS開發(fā)之構建Widget