1???? 機制原理
1.1???? 概念
1单芜、app extension
????????app extension:extension是iOS8新開放的一種對幾個固定系統(tǒng)區(qū)域的擴展機制,extension并不是一個獨立的app,它有一個包含在app bundle中的獨立bundle剖毯,extension的bundle后綴名是.appex圾笨。當(dāng)然它有好多類型,如下圖官方文檔上介紹的那天逊谋,今天我們主要講解的就是Today中的擂达,又叫做widget。
2胶滋、containing app
????????包含extension的app就是containning app板鬓,因為extension不能單獨存在,所以必須得依附在一個正常的app里究恤,這樣才能提交商店俭令。
3、host app
????????能夠調(diào)起extension的app被稱為host app丁溅,比如widget的host app就是Today唤蔗。
我們看下它們?nèi)咧g是如何工作的,如下圖:
2???? 實現(xiàn)
2.1???? 新建Target
????????接下來我們具體看如何完成一個簡單的DEMO窟赏,這樣你就更加了解了妓柜。
????????首先我們先新建一個工程,這一步就省略了涯穷,接下來我們增加一個target,選擇Today Extension棍掐,如下圖:
????????然后創(chuàng)建完,如下圖:
????????默認創(chuàng)建的storyboard里是hello world拷况,所以我們先run項目作煌,看看效果:
????????是不是很簡單,^_^赚瘦。粟誓。。
2.2???? 數(shù)據(jù)共享
????????那么接下來我們看下containing app跟extension如何共享數(shù)據(jù)起意,例如我containing app里的數(shù)據(jù)鹰服,我要在extension顯示。
2.2.1 添加app groups
????????在這之前揽咕,我們要先講下app groups悲酷,它主要用于同一group下的app共享同一份讀寫空間,以實現(xiàn)數(shù)據(jù)共享亲善。我們看下工程中如何開啟app groups设易,首先們選擇targets,然后選擇containing app蛹头,->Capabilities顿肺,打開app groups的開關(guān)戏溺,如下圖:
????????點下面的加號按鈕,新建一個group挟冠,例如:group.com.company.app于购,如下圖:
????????創(chuàng)建完后如下圖:? ??
????????同理,選擇targets為extension知染,同樣創(chuàng)建一個app groups肋僧,選擇跟containing app一樣的名字,就是containing app里的app groups跟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ù)代碼如下:NSUserDefaults?*shared?=?[[NSUserDefaults?alloc]?initWithSuiteName:groupID];??
?[shared?setObject:[NSNumber?numberWithInt:10]?forKey:@"number"];??
[shared?synchronize];??
????????取數(shù)據(jù)如下:
NSUserDefaults?*shared?=?[[NSUserDefaults?alloc]?initWithSuiteName:groupID];? ? ?
NSString?*string=[NSString?stringWithFormat:@"%@",[shared?objectForKey:@"number"]];? ? ?
_numberLabel.text=string;??
????????我們在containing app中存一個數(shù)據(jù)炕矮,然后在extension里取一個數(shù)據(jù),demo中我存了一個數(shù)字10者冤,然后我們看下效果:
2.2.2.2? 通過NSFileManager
????????還有一種方法是通過NSFileManager來實現(xiàn)肤视,存數(shù)據(jù)代碼如下:
NSError?*err?=?nil;? ? NSURL?*containerURL?=?[[NSFileManager?defaultManager]?containerURLForSecurityApplicationGroupIdentifier:groupID];??
containerURL?=?[containerURL?URLByAppendingPathComponent:@"Library/Caches/test"];? ??
NSString?*value?=@"123";? ? BOOL?result?=?[value?writeToURL:containerURL?atomically:YES?encoding:NSUTF8StringEncoding?error:&err];??
????取數(shù)據(jù)代碼如下:
NSError?*err?=?nil;??
NSURL?*containerURL?=?[[NSFileManager?defaultManager]?containerURLForSecurityApplicationGroupIdentifier:groupID];??
containerURL?=?[containerURL?URLByAppendingPathComponent:@"Library/Caches/test"];??
NSString?*value?=?[NSString?stringWithContentsOfURL:containerURL?encoding:NSUTF8StringEncoding?error:&err];??
2.2.2.3? 共享代碼
????????對于更復(fù)雜工程里加入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)建url type吗跋,如下圖:
????????在extension中趾盐,寫如下代碼:
[self.extensionContext?openURL:[NSURL?URLWithString:@"TestWight://"]?completionHandler:^(BOOL?success)?{??
????NSLog(@"open?url?result:%d",success);??
}];??
需要注意的地方是,extension中view的位置不是最左邊開始的小腊,而是默認從icon后開始的,所以如需修改久窟,代碼入下:
//?一般默認的View是從圖標(biāo)的右邊開始的...如果你想變換,就要實現(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版本太高了入问,比測試機版本高丹锹,導(dǎo)致存在版本兼容性問題,將版本值設(shè)為6.0或者7.0即可芬失。
3???? 參考鏈接
ios8新特性widget開發(fā)
http://blog.csdn.net/kuloveyouwei/article/details/44019815
iOS開發(fā)之構(gòu)建Widget