iOS之widget开发(Today Extension)
前言
extension是iOS8新開放的一種對幾個固定系統區域的擴展機制,它可以在一定程度上彌補iOS的沙盒機制對應用間通信的限制。
extension的出現,為用戶提供了在其它應用中使用我們應用提供的服務的便捷方式,比如用戶可以在Today Extension中查看應用展示的簡略信息,而不用再進到我們的應用中,同樣可以快捷操作app的功能,這將是一種全新的用戶體驗。
今天我們介紹一下給工程添加Today Extension的步驟。
添加Today Extension工程
在原有的工程基礎上,想要使用Today Extension,我們需要創建一個新的target,點擊File-->New-->Target-->Today Extention,如下圖所示:
添加Target 選擇Today Extension添加成功后項目的目錄會如下圖所示:
工程目錄運行項目會看到如下圖所示的效果:
運行效果定制UI
由于我習慣使用純代碼寫UI,所以我會選擇刪除默認創建的MainInterface.storyboard,并在info.plist中刪除NSExtensionMainStoryboard,添加NSExtensionPrincipalClass為TodayViewController,如下圖所示:
我們可以使用以下方法配置視圖的大小 //配置Today Extension展示視圖的大小 self.preferredContentSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, 100);復制代碼
實現下面的協議,配置邊距,否則會發現一個問題:繪制的內容與左側邊界有一定距離。
- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {//配置邊距為0return UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);}復制代碼我們創建一個lable來充滿視圖,并且點擊可打開我們的app
//Today Extension的頁面加一個可點擊打開containingAPP的label UILabel *openAppLabel = [[UILabel alloc] init]; openAppLabel.textColor = [UIColor colorWithRed:(97.0/255.0) green:(97.0/255.0) blue:(97.0/255.0) alpha:1]; openAppLabel.backgroundColor = [UIColor clearColor]; openAppLabel.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 100); openAppLabel.textAlignment = NSTextAlignmentCenter; openAppLabel.text = @"點擊打開app"; openAppLabel.font = [UIFont systemFontOfSize:15]; [self.view addSubview:openAppLabel];openAppLabel.userInteractionEnabled = YES; UITapGestureRecognizer *openURLContainingAPP = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(openURLContainingAPP)]; [openAppLabel addGestureRecognizer:openURLContainingAPP];復制代碼打開app
Today Extension只能通過openURL的方式來調起app,并且需要在info.plist文件中配置參數URL types,
app工程中配置如下
Today Extension如下圖
跳轉URL types設置URL identifier為app的bundle ID,URL Schemes配置為app的scheme
并且調用以下代碼來打開app
demo代碼,由于后面的步驟是需要蘋果開發者賬號才能操作,所以demo的代碼到這里為止。
數據共享
首先需要去蘋果開發者中心的APP Groups中創建一個APP Group,命名方式"group.com.companyName.xxx",如下圖
創建App Group完成之后你還要做以下修改
Today Extension工程與app工程的配置都如下圖所示
App Groups設置通過App Groups提供的同一group內app共同讀寫區域,可以用NSUserDefaults和NSFileManager兩種方式實現Today Extension和containing app之間的數據共享。
通過NSUserDefaults共享數據
- (void)saveDataByNSUserDefaults {NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];[shared setObject:@"test" forKey:@"widget"];[shared synchronize]; }- (NSString *)readDataFromNSUserDefaults {NSUserDefaults *shared = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.xxx.xxx"];NSString *value = [shared valueForKey:@"widget"];return value; }復制代碼通過NSFileManager共享數據
- (BOOL)saveDataByNSFileManager {NSError *error = nil;NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxx.xxx"];containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/test"];NSString *value = @"test";BOOL result = [value writeToURL:containerURL atomically:YES encoding:NSUTF8StringEncoding error:&error];if (!result) {NSLog(@"%@",error);} else {NSLog(@"save value:%@ success.",value);}return result; }- (NSString *)readDataByNSFileManager {NSError *error = nil;NSURL *containerURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.com.xxx.xxx"];containerURL = [containerURL URLByAppendingPathComponent:@"Library/Caches/test"];NSString *value = [NSString stringWithContentsOfURL:containerURL encoding:NSUTF8StringEncoding error:&error];return value; }復制代碼這樣就實現了Today Extension與app的數據共享
真機調試與打包
我們把Today Extension當作一個單獨的app,各自有自己的App ID和Provisioning profile. 在Xcode里是兩個Target給不同的target設置自己的bundleID和Provisioning profile。所以你需要按以下步驟操作,才能真機調試以及打包
去蘋果開發者中心操作以下步驟
Today Extension APP ID設置
Today Extension profile文件
完成以上的準備工作之后,我們就可以開始真機調試以及打包了。
總結
本篇暫時只是Today Extension簡單的功能實現,我會在后面更新iOS10的適配,以及其他功能使用。如果有錯誤的地方歡迎指出~謝謝~
擴展閱讀
希望對您有幫助,如果文章中有問題,歡迎評論留言~,謝謝支持~歡迎關注,我會在空余時間更新技術文章~
總結
以上是生活随笔為你收集整理的iOS之widget开发(Today Extension)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (hdu step 7.2.1)The
- 下一篇: 怎样健身最有效?程序员们可能还需要这些…