一、簡介app
擴展(Extension)是iOS 8中引入的一個新特性。擴展讓app之間的數據交互成爲可能。在iOS 8系統以前,每個app在物理上都是彼此獨立的,app之間不能互訪彼此的私有數據。而在引入擴展以後,其餘app能夠與擴展進行數據交換。iOS 8系統有6個支持擴展的系統區域,分別是Today、Share、Action、Photo Editing、Storage Provider、Custom keyboard。支持擴展的系統區域也被稱爲擴展點。本文只簡單記錄Today的使用!ide
二、Today擴展的建立測試
方法一:經過路徑File -->New -->Target建立!網站
方法二:直接點擊項目-->點擊 + 便可!ui
二、Today簡介和方法說明編碼
Today擴展的一種,雖然依附在App中,可是它是單獨的個體,所使用的文件、資源、第三方等,都須要單獨設置!spa
Today建立以後,其實就是一個ViewController!最小高度爲110pt。有三方協議方法:3d
// iOS10 新增的方法 // 用來設置Widget是展開仍是摺疊狀態的方法,能夠設置相關的preferredContentSizes屬性修改大小 - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{ if (activeDisplayMode == NCWidgetDisplayModeCompact) { NSLog(@"疊起狀態下的默認size:%@", NSStringFromCGSize(maxSize)); } else { NSLog(@"展開狀態下的默認size:%@", NSStringFromCGSize(maxSize)); } } // 該方法是用來告知Widget控制器是否須要更新的一個協議方法 - (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler { // Perform any setup necessary in order to update the view. // If an error is encountered, use NCUpdateResultFailed // If there's no update required, use NCUpdateResultNoData // If there's an update, use NCUpdateResultNewData completionHandler(NCUpdateResultNewData); // typedef NS_ENUM(NSUInteger, NCUpdateResult) { // NCUpdateResultNewData, // NCUpdateResultNoData, // NCUpdateResultFailed // } NS_ENUM_AVAILABLE_IOS(8_0); } // iOS10 版本以後將不會再被喚起 // 用來設置Widget控制器邊框間距的方法,若是出現誤差,能夠調整此方法的返回值進行操做 - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets NS_DEPRECATED_IOS(8_0, 10_0, "This method will not be called on widgets linked against iOS versions 10.0 and later.");
2.1 經過Storyboard加載和編碼加載兩種選擇:code
經過修改plist文件storyboardorm
編碼加載設置:
2.2 Today的展開和摺疊:
第一步:設置 widgetLargestAvailableDisplayMode屬性;
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
第二步:實現協議方法;
// iOS10 新增的方法 // 用來設置Widget是展開仍是摺疊狀態的方法,能夠設置相關的preferredContentSizes屬性修改大小 - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{ if (activeDisplayMode == NCWidgetDisplayModeCompact) { NSLog(@"疊起狀態下的默認size:%@", NSStringFromCGSize(maxSize)); } else { NSLog(@"展開狀態下的默認size:%@", NSStringFromCGSize(maxSize)); } }
三、共享數據
經過擴展點進行數據的共享,真機測試須要在開發者網站註冊一個App Groups。模擬器親測能夠無償使用(App Groups的測試group.com.xxx.TextToday),後面是Bundle Identifier。
3.1 開發者網站註冊一個App Groups
3.2 證書使用自動簽名部署,設置項目和Today的target中添加APPGroups選項
3.3 項目中儲存數據,在Today中獲取數據
經過[[NSUserDefaults alloc] initWithSuiteName:@"groupName"]
這個格式去建立NSUserDefaults
對象,groupName
填寫當前設置AppGroups
勾選的名字。
- (void)savaDataWithArray:(NSArray *)dataArray { NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dataArray]; NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.ForeverGuard.TextToday"]; [defaults setObject:data forKey:@"todayModel"]; [defaults synchronize]; }
獲取數據:注意數據存儲須要符合格則NSCoding協議、可儲存的類型、自定義轉Data存儲等。
- (void)readData { NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.ForeverGuard.TextToday"]; NSData *dataArray = [defaults objectForKey:@"todayModel"]; self.dataArr = [NSKeyedUnarchiver unarchiveObjectWithData:dataArray]; }
經過在Today界面加載一個TableView,效果如圖:
注意Today和項目共同使用的Model和資源須要設置Target選項:
四、點擊Today跳轉到APP
4.1 設置APP的URL Schemes
4.2 在Today中的跳轉代碼:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [tableView deselectRowAtIndexPath:indexPath animated:YES]; [self.extensionContext openURL:[NSURL URLWithString:[NSString stringWithFormat:@"TextToday://todayModel=%@",@"123"]] completionHandler:nil]; }
效果圖: