iOS Today Extension

作者: 乐Coding | 来源:发表于2016-03-25 10:48 被阅读1398次

    我们项目中想要添加iPhone Today Extension功能,之前没有自己接触过Extension的新功能今天抽了点时间看了看。

    ExtensioniOS8新添加的特性,主要是为了改善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)究竟是个什么鬼呢,如下图:

    IMG_1455.PNG

    Today Extension创建步骤

    开始之前先要创建一个iOS项目,因为Extension不能脱离containing app而存在。本项目实例名为,TodayExtensionDemo,项目创建完后
    具体步骤如下:

    1. File -> New -> Target 选择Today Extension,点击继续。
    屏幕快照 2016-03-21 下午6.31.40.png
    1. 给Extension起个响亮的名字后点击创建。
    屏幕快照 2016-03-21 下午6.36.10.png
    1. 创建完后项目中会多三个文件:

      • TodayViewController.h/.m
      • MainInterface.storyboard
      • info.plist
    2. 运行,设置Active Scheme为刚创建的Extension,点击运行,点击运行后会出现一个选择框,选择Today就可以了,如下图:

    屏幕快照 2016-03-21 下午6.42.50.png 屏幕快照 2016-03-21 下午6.45.34.png

    这时你就可以看到一个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 appAssets.xcassets,在右侧File Inspector中的Target Membership勾选Extension项目名。如下图:
    屏幕快照 2016-03-25 上午9.57.25.png

    更多iOS、Android开发精彩文章请关注微信公众账号:lecoding,你也可以扫描下方二维码关注我们。

    qrcode_for_gh_af22362bf4bb_258.jpg

    相关文章

      网友评论

      • CholMay:swift中怎么在extention中使用主应用中的类
      • 460e5714e248:您好,打扰了,谢谢您写这么全的教程,很有用!我想请教您一下就是在 APPDelegate 里面-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options这个方法中 if ([action isEqualToString:@"GotoHomePage"]) {

        }

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

        }这个判断里面的语句是写跳转的代码吗还是空着不写啊?如果写跳转代码的话是怎样跳转呢?我的按步骤写完之后只能跳转到 APP 但是不能跳转到指定页面,一直很困惑,期待您的答案,万分感谢
        陌上北辰:@在漫游 你跳转代码咋写的? 完成了么。我现在也有疑问

      本文标题:iOS Today Extension

      本文链接:https://www.haomeiwen.com/subject/dtzrlttx.html