標籤:tla 大小 認證 ios body 將不 nim anim ref
1、簡介
擴充(Extension)是iOS 8中引入的一個新特性。擴充讓app之間的資料互動成為可能。在iOS 8系統之前,每一個app在物理上都是彼此獨立的,app之間不能互訪彼此的私人資料。而在引入擴充之後,其他app可以與擴充進行資料交換。iOS 8系統有6個支援擴充的系統地區,分別是Today、Share、Action、Photo Editing、Storage Provider、Custom keyboard。支援擴充的系統地區也被稱為擴充點。本文只簡單記錄Today的使用!
2、Today擴充的建立
方法一:通過路徑File -->New -->Target建立!
方法二:直接點擊項目-->點擊 + 即可!
2、Today簡介和方法說明
Today擴充的一種,雖然依附在App中,但是它是單獨的個體,所使用的檔案、資源、第三方等,都需要單獨設定!
Today建立之後,其實就是一個ViewController!最小高度為110pt。有三方協議方法:
// 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載入和編碼載入兩種選擇:
通過修改plist檔案storyboard
編碼載入設定:
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)); } }
3、共用資料
通過擴充點進行資料的共用,真機測試需要在開發人員網站註冊一個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選項:
4、點擊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];}
:
iOS擴充Extension之Today