iOS Widget開發(fā)小結

從iOS8開始, 系統(tǒng)開始支持iOS Widget,就是如下圖.
Widget是Extension的一種Today, WWDC2014 Session 205, 講的就是關于Extensions的開發(fā).

Widget示例

用一個話回答,Widget是什么呢?

Widget就是一個依賴于Container App的另外一個小App.

它有自己Bundle Id,有自己的生命周期.

新建Today Extension Target, 命名為TodayWidget,如下圖.


Today Extension

會產(chǎn)生如下的文件夾:

TodayWidget

運行后(注意沒有Widget,則需要在編輯中手動添加),產(chǎn)生如圖


Widget

這里有個設計問題, 折疊的高度是固定的, 開發(fā)者改不了.

具體開發(fā)中有以下注意點:

一. 設置widgetLargestAvailableDisplayMode及拉起

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    //不設置,iOS10,可能不會出現(xiàn)展開/折疊按鈕
    self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded;
}

//使用open Url拉起方式
- (void)openContainingAPPWithURL:(NSString *)urlStr{
    //通過extensionContext借助host app調起app
    NSURL *url = [NSURL URLWithString:urlStr.length>0?[urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]:@"TodayWidgetTest://"];
    [self.extensionContext openURL:url completionHandler:nil];
}

二. iOS9版本差異

每次進入today頁面都會調用這個方法刷新數(shù)據(jù),但是iOS9卻不會(-_-)???一臉懵逼的什么鬼,事實就是這樣.

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler;

所以iOS9我們要自己手動調用一下

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    if ([[[UIDevice currentDevice] systemVersion] floatValue] < 9.9
        && [[[UIDevice currentDevice] systemVersion] floatValue] > 8.9) {
        [self widgetPerformUpdateWithCompletionHandler:^(NCUpdateResult result) {}];
    }
}

三. TodayWidget文件夾中代碼或者其他資源(例如圖片等)和外部的是不可共用.嘗試調用外部的代碼會產(chǎn)生編譯鏈接錯誤.

解決方法:

  • 如果使用cocoapods的話,直接設置好target引用就可以共用庫了. 例如下:
target "TodayExtension" do
    pod 'FMDB'              ,       '2.5'
    pod 'Masonry',                  '0.6.4'
end
  • 將共用的資源制作成framework來共用.
  • 一般Widget都是輕量,共用代碼不太多,使用手動添加共享資源更加方便快捷. 如下圖手動添加藍色圈里的代碼和圖庫:
手動添加共享資源

注意共享的源文件需要放在工程的根目錄下,同級于兩個target名文件夾的目錄,否則編譯器會找不到,編譯會失敗.

三. 共享數(shù)據(jù),需要將Apps建立Group關系.

  • 在蘋果開發(fā)者個人中心端的工作, 戳我直達:
1, 新建App Groups,點擊下圖的選項,按提示操作.
App Group

例如建好一個ID為group.testxx.todaywidget的App Group如下:


todaywidget App Group
2, 將App加入到App Group

選中要加入的App Group的App ID,點擊編輯,然后開啟App Group:


編輯App ID

點擊App Group的編輯按鈕:


編輯Group

勾選Group:
勾選Group

將Widget的App ID也加入這個Group.
如果有其他需要共享數(shù)據(jù)的Extension也加進去.

3, 產(chǎn)生新的Provisioning Profiles并在Xcode中使用.
Provisioning Profiles
  • 在Xcode中對應設置
1, 設置App Group,在這個Group的Target都需要設定.
Xcode中設置App Group
2,使用對應的Provisioning Profiles,在這個Group的Target都需要設定.
Provisioning Profiles

沒有的話,preferences下載一下:


preferences
  • 在代碼中使用共享Group沙盒
1, 沙盒地址如下(Group ID與上面保持一致):
NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.testxx.todaywidget"];
2, 共享的UserDefaults(Group ID與上面保持一致):
NSUserDefaults* userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.testxx.todaywidget"];
3, 要使用共享keychain數(shù)據(jù),要另外開啟Keychain Sharing. (由于沒這種需求,暫不展開)
Keychain Sharing

關于實時共享數(shù)據(jù),可以參考這位童鞋的心得.(戳我)

Widget空白及無法加載

  • Widget一直空白的原因很可能是崩潰了,在崩潰日志中能夠找到.
    開發(fā)非常注意穩(wěn)定性,一旦崩潰了,比較難恢復了.

  • Widget無法加載的原因,很可能是內存占用過大了.
    畢竟Widget不停地運行,要注意內存控制,不宜數(shù)據(jù)量過大的任務,展示過大的圖片.(目前只展示了一張圖片,只有100K左右, 沒出現(xiàn)無法加載的現(xiàn)象)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖既棺,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡俯树,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門贰盗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來许饿,“玉大人,你說我怎么就攤上這事舵盈÷剩” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵秽晚,是天一觀的道長瓦糟。 經(jīng)常有香客問我,道長爆惧,這世上最難降的妖魔是什么狸页? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮扯再,結果婚禮上芍耘,老公的妹妹穿的比我還像新娘。我一直安慰自己熄阻,他們只是感情好斋竞,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秃殉,像睡著了一般坝初。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钾军,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天鳄袍,我揣著相機與錄音,去河邊找鬼吏恭。 笑死拗小,一個胖子當著我的面吹牛,可吹牛的內容都是我干的樱哼。 我是一名探鬼主播哀九,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼剿配,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了阅束?” 一聲冷哼從身側響起呼胚,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎息裸,沒想到半個月后蝇更,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡界牡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年簿寂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宿亡。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡常遂,死狀恐怖,靈堂內的尸體忽然破棺而出挽荠,到底是詐尸還是另有隱情克胳,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布圈匆,位于F島的核電站漠另,受9級特大地震影響,放射性物質發(fā)生泄漏跃赚。R本人自食惡果不足惜笆搓,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纬傲。 院中可真熱鬧满败,春花似錦、人聲如沸叹括。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汁雷。三九已至净嘀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侠讯,已是汗流浹背挖藏。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厢漩,地道東北人熬苍。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柴底。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容