iOS擴展Extension之Today

一、簡介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];
}

  效果圖:

相關文章
相關標籤/搜索