widget 之 Today Extension

在 iphone 上我們會看到一些小工具,類似插件的存在

widget.png

這些就是 widget 其實就是項目中的一個 target

Paste_Image.png

新創(chuàng)建的 today

Paste_Image.png

如果想要純代碼 編寫UI
在 infoPlist中修改 NSExtension 字段


使用 Storyboard
使用純代碼

具體UI編寫和之前一樣這里就是說了..

主要說幾個地方:

一.展開與折疊狀態(tài)

//當點擊右上角的按鈕時 切換顯示模式自動調(diào)用
-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize{
    if (activeDisplayMode == NCWidgetDisplayModeCompact) {
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 110);
    } else {
        self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 300);
    }
}

如果沒有展開效果 查看在切換狀態(tài)的時候有沒有更改對應的高度

二.調(diào)起 App

1.添加Containing App (原本的項目)的 URL Schems

URL Schems

2.在Extension App 對應的位置添加如下代碼完成跳轉(zhuǎn)

//在"widget://"后面添加對應參數(shù)
    NSString *urlStr = [NSString stringWithFormat:@"widget://%@",@"i am comming"];
    NSURL *url = [NSURL URLWithString:urlStr];
    [self.extensionContext openURL:url completionHandler:^(BOOL success) { 
    }];

3.在 Containing App 中攔截 url 分析后執(zhí)行相應的方法

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    NSLog(@"%@",url);
    [[NSNotificationCenter defaultCenter]postNotificationName:@"fromWidget" object:[NSString stringWithFormat:@"%@",url]];
    return YES;
}

三.數(shù)據(jù)共享

1.通過 NSUserDefaults 共享數(shù)據(jù)

1.1設置 Containing App 與 Extension App 的 App Groups
兩個選一樣的 App Groups


App Groups

1.2存

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.111"];         
[shared setObject:@"11111" forKey:@"widget"];
[shared synchronize];
    

1.3取

NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.111"];
NSString *value = [shared valueForKey:@"widget"];
NSLog(@"%@",value);
注意:

這里的NSUserDefaults 實例化方法和常用的不同
兩者的initWithSuiteName 需要與設置的 App Groups 一致 (為啥?)

2.通過NSFileManager共享數(shù)據(jù)
保存數(shù)據(jù)
- (BOOL)saveDataByNSFileManager{ 
    NSError *err = nil; 
    NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri
tyApplicationGroupIdentifier:@"group.com.xxx"]; 
    containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/
widget"]; 
    NSString *value = @"asdfasdfasf"; 
    BOOL result = [value writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&err];
    if (!result) { 
        NSLog(@"%@",err); 
    } else { 
        NSLog(@"save value:%@ success.",value); 
    } 
    return result;
}
讀取數(shù)據(jù)
- (NSString *)readDataByNSFileManager{ 
    NSError *err = nil;
    NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecuri
tyApplicationGroupIdentifier:@"group.com.xxx"]; 
    containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/
widget"]; 
    NSString *value = [NSString stringWithContentsOfURL:containerURL encoding:
NSUTF8StringEncoding error:&err]; 
    return value;
}

最后注意:

1.UI 操作應在主線程執(zhí)行
dispatch_async(dispatch_get_main_queue(), ^{
});
2.可以添加 tableView 但是無法滾動

參考與拷貝:
http://www.itdecent.cn/p/9b3d06236d19

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容