日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS之widget开发(Today Extension)

發布時間:2025/3/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,如下圖所示:

配置controller
我們可以使用以下方法配置視圖的大小 //配置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工程中配置如下

app schemes

Today Extension如下圖

跳轉URL types設置

URL identifier為app的bundle ID,URL Schemes配置為app的scheme
并且調用以下代碼來打開app

//通過openURL的方式啟動Containing APP - (void)openURLContainingAPP {//scheme為app的scheme[self.extensionContext openURL:[NSURL URLWithString:@"scheme://xxxx"]completionHandler:^(BOOL success) {NSLog(@"open url result:%d",success);}]; }復制代碼

demo代碼,由于后面的步驟是需要蘋果開發者賬號才能操作,所以demo的代碼到這里為止。

數據共享

首先需要去蘋果開發者中心的APP Groups中創建一個APP Group,命名方式"group.com.companyName.xxx",如下圖

創建App Group
完成之后你還要做以下修改
  • 編輯你的contain app的APP ID,Service中選中App Groups,并且點擊右邊的Edit按鈕選中剛剛創建的group,返回后,點擊Done完成APP ID的編輯
  • 此時contain app的Provisioning Profiles文件會顯示為無法使用,需要更新下文件,并且下載下來覆蓋安裝
  • 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,一般命名方式為你的contain app的bundle id加上你創建的Today Extension工程名"com.companyName.xxx.xxx",App Services中勾選上App Groups,完成創建。如下圖
    Today Extension APP ID設置
  • 去Provisioning Profiles中創建Today Extension對應的profile文件,下載下來,安裝,真機調試和打包需要用到,如下圖
    Today Extension profile文件
  • 將Today Extension的bundleID修改為剛剛為Today Extension創建的APP ID
  • Today Extension版本號與contain app配置一致,否則審核上傳的時候會有警告
  • 打包或者真機調試的時候contain app與Today Extension選擇各自的profile文件。
  • 完成以上的準備工作之后,我們就可以開始真機調試以及打包了。

    總結

    本篇暫時只是Today Extension簡單的功能實現,我會在后面更新iOS10的適配,以及其他功能使用。如果有錯誤的地方歡迎指出~謝謝~

    擴展閱讀

  • WWDC2014之App Extensions學習筆記
  • 希望對您有幫助,如果文章中有問題,歡迎評論留言~,謝謝支持~歡迎關注,我會在空余時間更新技術文章~

    總結

    以上是生活随笔為你收集整理的iOS之widget开发(Today Extension)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。