在 iphone 上我們會看到一些小工具,類似插件的存在
widget.png
這些就是 widget 其實就是項目中的一個 target
Paste_Image.png
新創(chuàng)建的 today
Paste_Image.png
如果想要純代碼 編寫UI
在 infoPlist中修改 NSExtension 字段
使用 Storyboard
使用純代碼
具體UI編寫和之前一樣這里就是說了..
主要說幾個地方:
一.展開與折疊狀態(tài)
//當點擊右上角的按鈕時 切換顯示模式自動調用
-(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)的時候有沒有更改對應的高度
二.調起 App
1.添加Containing App (原本的項目)的 URL Schems
URL Schems
2.在Extension App 對應的位置添加如下代碼完成跳轉
//在"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 但是無法滾動