【轉(zhuǎn)】iOS widget的基本使用(為你的應(yīng)用創(chuàng)建一個(gè)分身)

iOS8.0之后次氨,蘋果支持了擴(kuò)展(Extension)的開發(fā)偷仿,開發(fā)者可以通過系統(tǒng)提供給我們的擴(kuò)展接入點(diǎn) (Extension point) 來為系統(tǒng)特定的服務(wù)提供某些附加的功能。當(dāng)時(shí)Widget擴(kuò)展應(yīng)用不溫不火舆绎,iOS10之后官方對Widget進(jìn)行了大幅度的優(yōu)化胞锰,配合3Dtouch Widget逐漸火了起來。本文簡單的介紹了Widget的使用葬凳。

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

1.在宿主工程添加widget target

打開宿主工程绰垂,F(xiàn)lie->New->Target->Today Extension->Next,如下圖火焰。
image.png
image.png

這樣創(chuàng)建一個(gè)widget target
這個(gè)時(shí)候需要注意兩點(diǎn)

1.在當(dāng)前的widget target基本配置里面將Deployment Target設(shè)置為你要兼容的iOS最低版本劲装。

因?yàn)閯?chuàng)建出來的時(shí)候,這里是默認(rèn)是iOS最高版本昌简,如果不更改占业,你自己的手機(jī)iOS版本比Deployment Target低的話就會導(dǎo)致運(yùn)行而不出現(xiàn)widget情況。

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

因?yàn)閣idget 與 宿主App是兩個(gè)不容的進(jìn)程纯赎,資源是不能共享的谦疾,如果不推入widget會導(dǎo)致不能加載資源。當(dāng)然你也可以創(chuàng)建一個(gè)xcassets再把圖片資源拖入址否。

image.png
2.構(gòu)建UI界面

系統(tǒng)默認(rèn)是用storyboard的形式餐蔬,如果你使用純代碼需要在當(dāng)前target的info.plist首先將原有NSExtensionMainStoryboard字段刪除,添加字段NSExtensionPrincipalClass佑附,value是你所寫的controller的名稱,一般默認(rèn)的都是TodayViewController仗考,如下圖

image.png

如果使用SB那就忽略上面的操作音同。
iOS10以上支持widget的折疊與展開。
在初始化UI的時(shí)候加入下面的代碼秃嗜,告訴系統(tǒng)你的widget是可折疊的樣式权均。

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

重寫切換展開及折疊布局時(shí)的方法顿膨,處理用戶點(diǎn)擊折疊與展開的操作。

- (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時(shí)一定要在主線程操作恋沃。

3.喚醒宿主App

widget 與 宿主App屬于兩個(gè)獨(dú)立的進(jìn)程”刂福可以理解為兩個(gè)不同的App囊咏,如果喚醒宿主,可以通過schemes的方式喚醒塔橡。
1.在宿主App內(nèi)設(shè)置url schemes
在宿主項(xiàng)目的target->info->URLTypes點(diǎn)擊加號增加內(nèi)容梅割,然后在URL Schemes定義一個(gè)Schemes,例如為widgetDemo葛家,如下圖

image.png

2.處理widget的點(diǎn)擊事件
在需要跳轉(zhuǎn)的時(shí)候加入以下代碼

 //點(diǎn)擊了內(nèi)容户辞,要跳轉(zhuǎn)到宿主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 點(diǎn)擊+號增加一個(gè)App Groups total.如下圖:

image.png

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

image.png

(3.)分別去Xcode中的宿主Targrt 與 widget Target,打開App Groups對剛才創(chuàng)建的App Groups total打鉤迅栅,無任何錯(cuò)誤殊校,證明添加成功,如下圖读存。

image.png

當(dāng)然你也可以忽略前兩步直接進(jìn)行第三步为流,點(diǎn)擊+號分別在宿主Targrt 與 widget Target中增加一個(gè)App Groups total,可能會因?yàn)楦袷讲粚θ貌荆鵁o法添加成功敬察。
分別在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戳這里椭迎,下面有一些注意點(diǎn):
1.widget與宿主細(xì)胞分別是兩個(gè)不同的進(jìn)程锐帜,相當(dāng)于是兩個(gè)不同的app,上架的時(shí)候需要創(chuàng)建證書畜号,配置文件等缴阎。
2.widget與宿主細(xì)胞分別是兩個(gè)不同的進(jìn)程,圖片等資源不能直接使用宿主app的資源简软。
3.widget target基本配置里面將Deployment Target設(shè)置為你要兼容的iOS最低版本蛮拔。一定比你真機(jī)的iOS系統(tǒng)版本低述暂,否者不能顯示出來。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末建炫,一起剝皮案震驚了整個(gè)濱河市畦韭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肛跌,老刑警劉巖艺配,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異惋砂,居然都是意外死亡妒挎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門西饵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酝掩,“玉大人,你說我怎么就攤上這事眷柔∑谙海” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵驯嘱,是天一觀的道長镶苞。 經(jīng)常有香客問我,道長鞠评,這世上最難降的妖魔是什么茂蚓? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮剃幌,結(jié)果婚禮上聋涨,老公的妹妹穿的比我還像新娘。我一直安慰自己负乡,他們只是感情好牍白,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抖棘,像睡著了一般茂腥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上切省,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天最岗,我揣著相機(jī)與錄音,去河邊找鬼朝捆。 笑死仑性,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的右蹦。 我是一名探鬼主播诊杆,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼何陆!你這毒婦竟也來了晨汹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤贷盲,失蹤者是張志新(化名)和其女友劉穎淘这,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巩剖,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铝穷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佳魔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曙聂。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠鲜,靈堂內(nèi)的尸體忽然破棺而出宁脊,到底是詐尸還是另有隱情,我是刑警寧澤贤姆,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布榆苞,位于F島的核電站,受9級特大地震影響霞捡,放射性物質(zhì)發(fā)生泄漏坐漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一碧信、第九天 我趴在偏房一處隱蔽的房頂上張望赊琳。 院中可真熱鬧,春花似錦音婶、人聲如沸慨畸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寸士。三九已至,卻和暖如春碴卧,著一層夾襖步出監(jiān)牢的瞬間弱卡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工住册, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婶博,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓荧飞,卻偏偏與公主長得像凡人,于是被迫代替她去往敵國和親名党。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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