widget開發(fā)

widget, 快速便捷、功能單一买雾、使用頻繁,如圖杨帽,是支付寶的widget效果圖漓穿。

支付寶效果圖.png

widget開發(fā)步驟:
就發(fā)widget并不難,就那么簡單的幾個步驟睦尽,請往下看↓↓↓↓

  1. 第一步 新建target
    新建的方式有兩種
    1: File-> New -> Target器净;


    新建Target.png

2: 點擊工程,點擊target列表下方的加號進行添加

新建Target 2.png

選擇Today Extension

選擇Today Extension.png

點擊next当凡,輸入Product Name等信息山害。需要注意的是最后面有一個Embed in Application選項纠俭,這里請選擇你的App。

Embed in Application.png

完成之后浪慌,左側會多一個testWidget文件夾冤荆,以及對應的文件,如圖

target新建完成.png

第二步 布局:
默認是采用interface.storyboard权纤,如果使用純代碼需要在Info.plist文件進行相應的修改, 刪除key - NSExtensionMainStoryboard钓简, 添加key-NSExtensionPrincipalClass, value-TodayViewController,如果使用xib可忽略汹想。
默認值:

配置文件_修改前.png

修改后:

配置文件_修改后.png

如果采用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ā)者中心后根據提示一步一步操作即可恋博,這里很簡單。

申請App Groups.png

新建時葵蒂,填寫的ID通常以group.開頭交播。

Identifier.png

證書配置
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ā)者賬號里面所有都列出來樟氢,然后選擇你要用的那一個就可以了骤素。

設置App Groups.png

數據共享:
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嘛

url schemes.png

通過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) {
    }];
    ```
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瑟由,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冤寿,更是在濱河造成了極大的恐慌歹苦,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件督怜,死亡現(xiàn)場離奇詭異殴瘦,居然都是意外死亡,警方通過查閱死者的電腦和手機号杠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門痴施,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人究流,你說我怎么就攤上這事《猓” “怎么了芬探?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長厘惦。 經常有香客問我偷仿,道長,這世上最難降的妖魔是什么宵蕉? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任酝静,我火速辦了婚禮,結果婚禮上羡玛,老公的妹妹穿的比我還像新娘别智。我一直安慰自己,他們只是感情好稼稿,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布薄榛。 她就那樣靜靜地躺著,像睡著了一般让歼。 火紅的嫁衣襯著肌膚如雪敞恋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天谋右,我揣著相機與錄音硬猫,去河邊找鬼。 笑死,一個胖子當著我的面吹牛啸蜜,可吹牛的內容都是我干的坑雅。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼盔性,長吁一口氣:“原來是場噩夢啊……” “哼霞丧!你這毒婦竟也來了?” 一聲冷哼從身側響起冕香,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蛹尝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后悉尾,有當地人在樹林里發(fā)現(xiàn)了一具尸體突那,經...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年构眯,在試婚紗的時候發(fā)現(xiàn)自己被綠了愕难。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡惫霸,死狀恐怖猫缭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情壹店,我是刑警寧澤猜丹,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站硅卢,受9級特大地震影響射窒,放射性物質發(fā)生泄漏。R本人自食惡果不足惜将塑,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一脉顿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧点寥,春花似錦艾疟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至责鳍,卻和暖如春碾褂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背历葛。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工正塌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嘀略,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓乓诽,卻偏偏與公主長得像帜羊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸠天,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內容