前言:
- 自從iOS8API中開放iOS Today 擴(kuò)展之后 很多朋友都在研究一下出來裝個(gè)X例嘱,說實(shí)話這個(gè)東西做出來是挺炫的啄刹,感覺很高大上,但是經(jīng)過我查閱資料正經(jīng)研究這個(gè)東西的時(shí)候感覺很簡單,沒有大家想的那么高端州胳,廢話不多說上操作。
先來張效果圖:
- 第一步:創(chuàng)建 iOS Today 擴(kuò)展(見圖)
- 如上體創(chuàng)建完成之后會(huì)在工程目錄多一個(gè)TodayViewController文件夾
應(yīng)為我們這個(gè)教程截圖是我已經(jīng)做好的工程所以文件夾正常的StoryBoard文件我已經(jīng)刪除選用純代碼開發(fā)逸月。
純代碼需要配置info.plist的倆項(xiàng)參數(shù):
移除NSExtensionMainStoryboard 鍵栓撞,并添加NSExtensionPrincipalClass 鍵,使用view controller的名字作為值碗硬。
第二步:開發(fā)這個(gè)玩意
-
UI樣式
如果你看一下官方對于今日插件的UI指南瓤湘,有兩點(diǎn)值得注意:
1、盡量不要使用背景肛响,默認(rèn)的毛玻璃效果很好岭粤,也比較統(tǒng)一;
2特笋、盡量保持默認(rèn)的縮進(jìn)剃浇,即左邊會(huì)空幾個(gè)像素巾兆。
- 如果想改變默認(rèn)縮進(jìn),在TodayViewController里面實(shí)現(xiàn)以下方法虎囚,縮進(jìn)就沒有了:
-(UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets: (UIEdgeInsets)defaultMarginInsets{
return UIEdgeInsetsZero;
}
與宿主App進(jìn)行交互-擴(kuò)展App跳轉(zhuǎn)主App
TodayViewController.m類實(shí)現(xiàn)代碼
//點(diǎn)擊按鈕跳轉(zhuǎn)頁面 -(void)BUttonClick:(UIButton *)Bt{
UIButton* button = (UIButton*)Bt;
if (button.tag == 0) {
[self.extensionContext openURL:[NSURL URLWithString:@"跳轉(zhuǎn)鏈接"] completionHandler:^(BOOL success) {
NSLog(@"open url result:%d",success);
}];
}
else if(button.tag == 1) {
[self.extensionContext openURL:[NSURL URLWithString:@"跳轉(zhuǎn)鏈接"] completionHandler:^(BOOL success) {
NSLog(@"open url result:%d",success);
}];
}
else if(button.tag == 2) {
[self.extensionContext openURL:[NSURL URLWithString:@"跳轉(zhuǎn)鏈接"] completionHandler:^(BOOL success) {
NSLog(@"open url result:%d",success);
}];
}
}
配置跳轉(zhuǎn)鏈接協(xié)議
- 跳轉(zhuǎn)鏈接示例:iOSWidgetApp://為跳轉(zhuǎn)頁面做標(biāo)識(shí)
AppDelegate.m類實(shí)現(xiàn)代碼
跳轉(zhuǎn)鏈接與TodayViewController.m類跳轉(zhuǎn)鏈接相對應(yīng)
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
UINavigationController * nav = (UINavigationController*)[customTabBarController.viewControllers objectAtIndex:0];
if ([ctrlString isEqual:@"跳轉(zhuǎn)鏈接"]) {
跳轉(zhuǎn)操作
}if ([ctrlString isEqual:@"跳轉(zhuǎn)鏈接"]) {
跳轉(zhuǎn)操作
}if ([ctrlString isEqual:@"跳轉(zhuǎn)鏈接"]) {
跳轉(zhuǎn)操作
}
return NO;
}
數(shù)據(jù)共享(主App和擴(kuò)展App)
數(shù)據(jù)共享的方式有很多種方法我來介紹倆種具體你們在研究
第一種:利用Group
- 這種方法原理就是將主App和擴(kuò)展App做一個(gè)緩存空間(NSUserDefaults)配置如下:
- 在工程目錄->TARGETS->分別選擇主App和擴(kuò)展App->Capabilities->App Groups->按照圖做就好了(Steps三個(gè)對勾要都打上)
主App存擴(kuò)展App所需要數(shù)據(jù)
NSUserDefaults* userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.10086.shandongmcc"];
[userDefault setBool:YES forKey:@"islogin"];
擴(kuò)展App取所需要數(shù)據(jù)
NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.10086.shandongmcc"];
BOOL isLogin = [myDefaults objectForKey:@"slogan"];
- 這就可以了正常主App與擴(kuò)展App進(jìn)行數(shù)據(jù)交互的第一種方法角塑;
第二種:利用接口
- 擴(kuò)展App也可以進(jìn)行數(shù)據(jù)請求解析,所需要的數(shù)據(jù)直接做接口請求處理就好淘讥;
還有靜態(tài)庫代碼共享等等的數(shù)據(jù)共享方法你們就自己研究吧圃伶。
總結(jié):
- 重點(diǎn)一:創(chuàng)建擴(kuò)展
- 重點(diǎn)二:創(chuàng)建數(shù)據(jù)共享空間(App Groups)
- 重點(diǎn)三:主App存,擴(kuò)展App取
- 重點(diǎn)四:開發(fā)過程是OC語言自己不會(huì)去找老師
補(bǔ)充:
iOS8中Today擴(kuò)展遇到在模擬器中OK蒲列,在5S以上真機(jī)就會(huì)失敗的問題窒朋,還會(huì)報(bào)can attach to it by selecting Debug > Attach to Process 之類的錯(cuò)誤,之前一直以為是Xcode的BUG蝗岖,其實(shí)想想只在5S上出現(xiàn)侥猩,就應(yīng)該想到64位編譯的問題了
解決方法:
1、Build Settings->Architectures 選擇 Standard architectures (armv7, arm64)
2抵赢、Build Settings->Valid Architectures 設(shè)定 armv7 armv7s armv8 arm64
3欺劳、Build Settings->Build Active Architectures Only 設(shè)定為 NO
4、擴(kuò)展Today的Target按如上設(shè)置有很多哥們問我說為什么我在調(diào)試的時(shí)候斷點(diǎn)打了卻不走呢铅鲤?
解決辦法:
別急划提。。一句話你調(diào)試主就運(yùn)行主邢享,調(diào)試擴(kuò)展就運(yùn)行擴(kuò)展鹏往。好吧在說一句就一句。驼仪。主App代碼是不能給擴(kuò)展用得掸犬,想公用代碼得打包靜態(tài)庫。歸誰得代碼就要放到誰得目錄下啊兄弟绪爸。
GitHub下載地址:https://github.com/QQ396368888/iOSToday.git