天天看點

iPhone Today Extension

我們項目中想要添加

iPhone Today Extension

功能,之前沒有自己接觸過Extension的新功能今天抽了點時間看了看。

Extension

iOS8

新添加的特性,主要是為了改善iOS沙河機制對應用間通信限制。iOS8新添加了6個擴充,iOS9又新添加了4個,分别是:

iOS8:

  • Today
  • Share
  • Action
  • Photo Editing
  • Storage Provider(Document Provider)
  • Custom Keyboard

iOS9新添加四個:

  • Audio Unit
  • Content Blocker
  • Shared Links
  • Spotlight Index

今天我們主要看一下

Today Extension

的實作。Today Extension(也叫

Widget

)究竟是個什麼鬼呢,如下圖:

iPhone Today Extension

Today Extension建立步驟

開始之前先要建立一個iOS項目,因為

Extension

不能脫離

containing app

而存在。本項目執行個體名為,

TodayExtensionDemo

,項目建立完後

具體步驟如下:

  1. File -> New -> Target 選擇Today Extension,點選繼續。
    iPhone Today Extension
  2. 給Extension起個響亮的名字後點選建立。
    iPhone Today Extension
  3. 建立完後項目中會多三個檔案:
    • TodayViewController.h/.m
    • MainInterface.storyboard
    • info.plist
  4. 運作,設定Active Scheme為剛建立的Extension,點選運作,點選運作後會出現一個選擇框,選擇Today就可以了,如下圖:
    iPhone Today Extension
iPhone Today Extension

這時你就可以看到一個Hello World出現了。

接下來的工作就是自定義這個展示頁面了,如果你習慣使用Storyboard直接在

MainInterface.storyboard

上修改即可,如果你習慣自己Coding,你需要先修改一下info.plist

修改方法:

删除

<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
           

添加:

<key>NSExtensionPrincipalClass</key>
<string>TodayViewController</string>
           

部分代碼

1.調整Widget的高度

-(void)awakeFromNib {
    [super awakeFromNib];
    [self setPreferredContentSize:CGSizeMake(0, 240)];
}
           

2.如果你要通路http站點連結,iOS9之後因為蘋果App Transport Security (ATS)新特性,無法直接通路http資料,你也需要在Extension的plist中添加如下代碼:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
           

3.因為Extension和containing app無法進行資料和檔案共享,是以你還需要在Extenison中再添加一遍需要的檔案。

4.在widget想要點選頁面打開containing app。需要采用Open URL的方式打開containing app。

首先,在containing app的info.plist添加如下代碼:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <!--這個一定要唯一-->
        <string>com.wildcat.TodayExtensionDemo</string>  
        <key>CFBundleURLSchemes</key>
        <array>
            <!--調轉URL的host,例如:TodayDemo:// --->
            <string>TodayDemo</string>                    
        </array>
    </dict>
</array>
           

在today extension中實作:

-(void)openURLContainingAPP
{
    [self.extensionContext openURL:[NSURL URLWithString:@"lecoding://action=GotoHomePage"]
                 completionHandler:^(BOOL success) {
                     NSLog(@"open url result:%d",success);
                 }];

}
           

在 containing app appdelegate中添加如代碼,接收跳轉:

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
    NSString* prefix = @"TodayDemo://";
    if ([[url absoluteString] rangeOfString:prefix].location != NSNotFound) {
        NSString* action = [[url absoluteString] substringFromIndex:prefix.length];
        if ([action isEqualToString:@"GotoHomePage"]) {

        }

        else if([action isEqualToString:@"GotoOtherPage"]) {

         }
    }
    return YES;
}
           

如何使用containing app中的圖檔

雖然Extention無法和containing app 公用庫檔案,但是可以公用圖檔,方法就是:

  1. 左側選中containing app的Assets.xcassets,在右側File Inspector中的Target Membership勾選Extension項目名。如下圖:
iPhone Today Extension
更多iOS、Android開發精彩文章請關注微信公衆賬号:lecoding,你也可以掃描下方二維碼關注我們。
iPhone Today Extension