widget, 快速便捷、功能單一买雾、使用頻繁,如圖杨帽,是支付寶的widget效果圖漓穿。
widget開發(fā)步驟:
就發(fā)widget并不難,就那么簡單的幾個步驟睦尽,請往下看↓↓↓↓
-
第一步 新建target
新建的方式有兩種
1: File-> New -> Target器净;
新建Target.png
2: 點擊工程,點擊target列表下方的加號進行添加
選擇Today Extension
點擊next
当凡,輸入Product Name等信息山害。需要注意的是最后面有一個Embed in Application
選項纠俭,這里請選擇你的App。
完成之后浪慌,左側會多一個testWidget
文件夾冤荆,以及對應的文件,如圖
第二步 布局:
默認是采用interface.storyboard权纤,如果使用純代碼需要在Info.plist文件進行相應的修改, 刪除key - NSExtensionMainStoryboard
钓简, 添加key-NSExtensionPrincipalClass
, value-TodayViewController
,如果使用xib可忽略汹想。
默認值:
修改后:
如果采用Xib外邓,這一步可以忽略。
第三步 版本適配:
版本<iOS 10
self.preferredContentSize = CGSizeMake(self.view.bounds.size.width, 110); // 指定寬高
頁邊距設置
-(UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets
{
return UIEdgeInsetsMake(0, 0, 0, 0);
}
版本>iOS 10
設置是否支持widget展開與折疊古掏,NCWidgetDisplayModeExpanded
是一個枚舉值损话,這里支持折疊。
if ([[UIDevice currentDevice].systemVersion doubleValue] >= 10.0) {
self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;// 支持折疊
}
NCWidgetDisplayMode代理回調:
-(void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize
{
if (activeDisplayMode == NCWidgetDisplayModeCompact) { // 折疊時大小
self.preferredContentSize = CGSizeMake(self.view.bounds.size.width, 110);
}else{ // 展開時大小
self.preferredContentSize = CGSizeMake(self.view.bounds.size.width, 220);
}
}
第四步 數據處理:
數據刷新:每一次切換到widget頁面和下拉widget頁面會刷新todayviewcontroller槽唾,執(zhí)行viewwillappear方法
數據共享:widget與應用程序共享一些數據丧枪,使用App Groups,組內的app共享一個沙盒空間庞萍,App Groups是什么呢拧烦?,首先先去 開發(fā)中心 注冊申請App Groups钝计。進入開發(fā)者中心后根據提示一步一步操作即可恋博,這里很簡單。
新建時葵蒂,填寫的ID通常以group.開頭交播。
證書配置
widget是個獨立的target,需要使用單獨的Boundle id以及對應的證書践付。個人建議先把APP的Boundle id確定以后再去創(chuàng)建target秦士。這樣就可以不用修改boundle id了,否則永高,運行的時候回提示錯誤信息隧土,widget的Bundle id的包含App的Bundle id。
進入工程命爬,將App和widgt中的App Groups打開曹傀,選中需要共享數據的group,就是在上一步中創(chuàng)建的id饲宛,這里會自動出來的皆愉,不用擔心仰坦。如果創(chuàng)建了多個groups叫倍,這里會把該開發(fā)者賬號里面所有都列出來樟氢,然后選擇你要用的那一個就可以了骤素。
數據共享:
widget與App之間的數據交互有兩種方式,可以采用NSUserDefaults或者是NSFileManager進行實現(xiàn)异剥。
通過NSUserDefaults
#define GROUP_ID @"這里是創(chuàng)建app groups的id"
// 保存數據
+(void) saveObject:(id) object forkey:(NSString *) key{
if (object && key) {
NSUserDefaults *userDefault = [[NSUserDefaults alloc] initWithSuiteName:GROUP_ID];
if (userDefault) {
[userDefault setObject:object forKey:key];
[userDefault synchronize];
}
}
}
// 讀取數據
+(id) objectForKey:(NSString *) key{
NSUserDefaults *userDefault = [[NSUserDefaults alloc] initWithSuiteName:GROUP_ID];
if (userDefault) {
id object = [userDefault objectForKey:key];
return object;
}
return nil;
}
NSFileManager方式:
// 保存數據
- (void) saveObject{
NSError *error = nil;
NSURL *url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxxx"];
url = [url URLByAppendingPathComponent:@"Library/Caches/wodget"];
NSString *value = @"data";
BOOL result = [value writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (!result) {
NSLog(@"%@", error);
}
else{
NSLog(@"save value:%@ success.", value);
}
}
// 讀取數據 返回類型以實際數據為準
-(NSString *) readData{
NSError *error = nil;
NSURL *url = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxx"];
url = [url URLByAppendingPathComponent:@"Library/Caches/widget"];
NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
return dataStr;
}
與App進行交互
首先我們需要在APP中的添加url schemes ,可以直接寫app的bound id嘛
通過widget來打開app應用
//#define APP_URL_SCHEMES @"com.icoming.MacBee"http:// app的urlschemes
NSString * urlSchemes = [NSString stringWithFormat:@"%@://",APP_URL_SCHEMES];
NSURL * url = [NSURL URLWithString:urlSchemes];
[self.extensionContext openURL:url completionHandler:^(BOOL success) {
}];
```