iOS widget的基本使用(為你的應用創(chuàng)建一個分身)

iOS8.0之后锹锰,蘋果支持了擴展(Extension)的開發(fā),開發(fā)者可以通過系統(tǒng)提供給我們的擴展接入點 (Extension point) 來為系統(tǒng)特定的服務提供某些附加的功能癣漆。當時Widget擴展應用不溫不火长赞,iOS10之后官方對Widget進行了大幅度的優(yōu)化,配合3Dtouch Widget逐漸火了起來态贤。本文簡單的介紹了Widget的使用。

本地大致按照以下四個步驟介紹widget
1.在宿主工程添加widget target
2.構建UI界面
3.喚醒宿主App
4.與宿主App共享數(shù)據(jù)
1.在宿主工程添加widget target

打開宿主工程醋火,F(xiàn)lie->New->Target->Today Extension->Next悠汽,如下圖箱吕。


這樣創(chuàng)建一個widget target
這個時候需要注意兩點

1.在當前的widget target基本配置里面將Deployment Target設置為你要兼容的iOS最低版本。

因為創(chuàng)建出來的時候柿冲,這里是默認是iOS最高版本茬高,如果不更改,你自己的手機iOS版本比Deployment Target低的話就會導致運行而不出現(xiàn)widget情況假抄。

2將你需要的圖片資源拖入當前的target內(nèi)

因為widget 與 宿主App是兩個不容的進程怎栽,資源是不能共享的,如果不推入widget會導致不能加載資源宿饱。當然你也可以創(chuàng)建一個xcassets再把圖片資源拖入熏瞄。


2.構建UI界面

系統(tǒng)默認是用storyboard的形式,如果你使用純代碼需要在當前target的info.plist首先將原有NSExtensionMainStoryboard字段刪除谬以,添加字段NSExtensionPrincipalClass强饮,value是你所寫的controller的名稱,一般默認的都是TodayViewController为黎,如下圖


純代碼info操作

如果使用SB那就忽略上面的操作邮丰。
iOS10以上支持widget的折疊與展開。
在初始化UI的時候加入下面的代碼铭乾,告訴系統(tǒng)你的widget是可折疊的樣式柠座。

 if (@available(iOS 10.0, *)) {
        self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
    }

重寫切換展開及折疊布局時的方法,處理用戶點擊折疊與展開的操作片橡。

- (void) widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize {
    NSLog(@"maxWidth %f maxHeight %f",maxSize.width,maxSize.height);
    if (@available(iOS 10.0, *)) {
        if (activeDisplayMode == NCWidgetDisplayModeCompact) {
            //折疊
            self.preferredContentSize = CGSizeMake(maxSize.width, 100);
            //處理一些操作
        } else {
            //展開
            self.preferredContentSize = CGSizeMake(maxSize.width, 200);
            //處理一些操作
        }
    } else {
        // Fallback on earlier versions
    }
}

這里注意加載數(shù)據(jù)完畢后妈经,渲染UI時一定要在主線程操作。

3.喚醒宿主App

widget 與 宿主App屬于兩個獨立的進程捧书〈蹬荩可以理解為兩個不同的App,如果喚醒宿主经瓷,可以通過schemes的方式喚醒爆哑。
1.在宿主App內(nèi)設置url schemes
在宿主項目的target->info->URLTypes點擊加號增加內(nèi)容,然后在URL Schemes定義一個Schemes舆吮,例如為widgetDemo揭朝,如下圖



2.處理widget的點擊事件
在需要跳轉的時候加入以下代碼

 //點擊了內(nèi)容,要跳轉到宿主app
    NSURL *URL = [NSURL URLWithString:@"widgetDemo://data=123456"];
    [self.extensionContext openURL:URL completionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"打開成功");
        }
    }];
4.與宿主App共享數(shù)據(jù)

1.通過schemes傳遞參數(shù)
如果數(shù)據(jù)量不大色冀,僅僅是參數(shù)的一些傳遞的話潭袱,利用schemes即可,如上面的代碼所示widgetDemo://后面的data=123456即是參數(shù)锋恬,可以攜帶少量的信息屯换。
2.通過App Groups來共享數(shù)據(jù)
(1.)去開發(fā)者賬號Identifiers->App Groups 點擊+號增加一個App Groups total.如下圖:



(2.)然后去宿主App的appId點擊Edit->點擊App Groups的Edit,選中剛才創(chuàng)建的App Groups total->Continue.點擊如下圖



(3.)分別去Xcode中的宿主Targrt 與 widget Target,打開App Groups對剛才創(chuàng)建的App Groups total打鉤彤悔,無任何錯誤嘉抓,證明添加成功,如下圖晕窑。

當然你也可以忽略前兩步直接進行第三步抑片,點擊+號分別在宿主Targrt 與 widget Target中增加一個App Groups total,可能會因為格式不對杨赤,而無法添加成功敞斋。
分別在widget 內(nèi)添加寫入代碼,在宿主app內(nèi)添加讀取代碼望拖。即可完成App Groups內(nèi)數(shù)據(jù)共享

//widget內(nèi)存入數(shù)據(jù)
- (void)wirteData:(NSData *)data {
    NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.widgetdemo.message"];
    [userDefaults setObject:data forKey:@"widgetImage"];
    BOOL isok = [userDefaults synchronize];
    NSLog(@"寫入成功?%d",isok);
}
//宿主app內(nèi)讀取數(shù)據(jù)
- (void)readMessage {
    NSUserDefaults *userDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.widgetdemo.message"];
    NSData * date = [userDefaults objectForKey:@"widgetImage"];
    _imageView.image = [UIImage imageWithData:date];
}

至此widget的簡單使用完成挫鸽,Demo戳這里说敏,下面有一些注意點:
1.widget與宿主細胞分別是兩個不同的進程,相當于是兩個不同的app丢郊,上架的時候需要創(chuàng)建證書盔沫,配置文件等。
2.widget與宿主細胞分別是兩個不同的進程枫匾,圖片等資源不能直接使用宿主app的資源架诞。
3.widget target基本配置里面將Deployment Target設置為你要兼容的iOS最低版本。一定比你真機的iOS系統(tǒng)版本低干茉,否者不能顯示出來谴忧。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市角虫,隨后出現(xiàn)的幾起案子沾谓,更是在濱河造成了極大的恐慌,老刑警劉巖戳鹅,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件均驶,死亡現(xiàn)場離奇詭異,居然都是意外死亡枫虏,警方通過查閱死者的電腦和手機妇穴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隶债,“玉大人腾它,你說我怎么就攤上這事∷蓝铮” “怎么了携狭?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長回俐。 經(jīng)常有香客問我逛腿,道長稀并,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任单默,我火速辦了婚禮碘举,結果婚禮上,老公的妹妹穿的比我還像新娘搁廓。我一直安慰自己引颈,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布境蜕。 她就那樣靜靜地躺著蝙场,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粱年。 梳的紋絲不亂的頭發(fā)上售滤,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音台诗,去河邊找鬼完箩。 笑死,一個胖子當著我的面吹牛拉队,可吹牛的內(nèi)容都是我干的弊知。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼粱快,長吁一口氣:“原來是場噩夢啊……” “哼秩彤!你這毒婦竟也來了?” 一聲冷哼從身側響起事哭,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤呐舔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后慷蠕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珊拼,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年流炕,在試婚紗的時候發(fā)現(xiàn)自己被綠了澎现。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡每辟,死狀恐怖剑辫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情渠欺,我是刑警寧澤妹蔽,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響胳岂,放射性物質發(fā)生泄漏编整。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一乳丰、第九天 我趴在偏房一處隱蔽的房頂上張望掌测。 院中可真熱鬧,春花似錦产园、人聲如沸汞斧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粘勒。三九已至,卻和暖如春屎即,著一層夾襖步出監(jiān)牢的瞬間庙睡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工剑勾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留埃撵,地道東北人赵颅。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓虽另,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饺谬。 傳聞我的和親對象是個殘疾皇子捂刺,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容