美文网首页
Today Extension

Today Extension

作者: 小凡凡520 | 来源:发表于2019-10-10 16:23 被阅读0次
一、前言

extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制。

extension的出现,为用户提供了在其它应用中使用我们应用提供的服务的便捷方式,比如用户可以在Today Extension中查看应用展示的简略信息,而不用再进到我们的应用中,同样可以快捷操作app的功能,这将是一种全新的用户体验。

二、使用

在原有的工程基础上,想要使用Today Extension,我们需要创建一个新的target,点击File-->New-->Target-->Today Extention,如下图所示:


2030896-9e9c21a813b140c8.png 2030896-ec38f67728c60caa.png

添加成功后项目的目录会如下图所示:

2030896-afa605bea8fb3205.png

运行项目会看到如下图所示的效果:


2030896-66feec9b01bad7c8.png
三、定制UI

由于我习惯使用纯代码写UI,所以我会选择删除默认创建的MainInterface.storyboard,并在info.plist中删除NSExtensionMainStoryboard,添加NSExtensionPrincipalClass为TodayViewController,如下图所示:


2030896-6b3b42fd5852e80a.png

我们可以使用以下方法配置视图的大小

//配置Today Extension展示视图的大小
self.preferredContentSize = CGSize(width: UIScreen.main.bounds.width, height: 100)

实现下面的协议,配置边距,否则会发现一个问题:绘制的内容与左侧边界有一定距离。

func widgetMarginInsets(forProposedMarginInsets defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets {
    return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 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];

在Today Extension中,ScrollView是无法滚动的,滚动的事件都被拦截了,所以在这里TableView只能显示两行,也无法滑动。在iOS 10之后,Today Extension的高度默认为110,也是最小高度。我们可以通过设置widgetLargestAvailableDisplayMode属性,来展开查看更多的UI

self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded

并且实现NCWidgetProviding协议方法func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize),在这里,可以打印TodayExtension在叠起和展开状态下支持最大的高度。

func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
    if activeDisplayMode == .expanded {
        print("展开状态下的最大size = \(maxSize.debugDescription)")
    } else {
        print("叠起状态下的默认size = \(maxSize.debugDescription)")
    }
}
四、打开app

today Extension只能通过openURL的方式来调起app,并且需要在info.plist文件中配置参数URL types,app工程中配置如下

2030896-b5b004e3c9334f9a.png

Today Extension如下图


屏幕快照 2019-10-08 下午2.23.40.png

调用以下代码来打开app

func openURLContainingAPP() {
    //scheme为app的scheme
    if let url = URL(string: "scheme://xxxx") {
        self.extensionContext?.open(url, completionHandler: { (success) in
            print(success)
        })
    }
}
五、数据共享

首先需要去苹果开发者中心的APP Groups中创建一个APP Group,命名方式"group.com.companyName.xxx",如下图

2030896-7400a90d9bde74f9.png

完成之后你还要做以下修改:

* 编辑你的contain app的APP ID,Service中选中App Groups,并且点击右边的Edit按钮选中刚刚创建的group,返回后,点击Done完成APP ID的编辑
* 此时contain app的Provisioning Profiles文件会显示为无法使用,需要更新下文件,并且下载下来覆盖安装

Today Extension工程与app工程的配置都如下图所示


2030896-0f27c9b289fe18b3.png

通过App Groups提供的同一group内app共同读写区域,可以用NSUserDefaults和NSFileManager两种方式实现Today Extension和containing app之间的数据共享。

1、通过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;
}

2、通过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,各自有自己的App ID和Provisioning profile. 在Xcode里是两个Target给不同的target设置自己的bundleID和Provisioning profile。所以你需要按以下步骤操作,才能真机调试以及打包

操作步骤如下:

1、需要为Today Extension创建一个APP ID,一般命名方式为你的contain app的bundle id加上你创建的Today Extension工程名"com.companyName.xxx.xxx",App Services中勾选上App Groups,完成创建。如下图


2030896-bc2fa0dc1be2c899.png

2、去Provisioning Profiles中创建Today Extension对应的profile文件,下载下来,安装,真机调试和打包需要用到,如下图


2030896-8ab4da42a07f6e66.png

3、将Today Extension的bundleID修改为刚刚为Today Extension创建的APP ID

4、Today Extension版本号与contain app配置一致,否则审核上传的时候会有警告

5、打包或者真机调试的时候contain app与Today Extension选择各自的profile文件。

相关文章

  • IOS开发--通知栏扩展(Today Extension)

    使用Today Extension 1.file--new--target--today Extension 提示...

  • Extension

    Today Extension Share Extension Action Extension(UI) 1.插件...

  • Today Extension

    一、前言 extension是iOS8新开放的一种对几个固定系统区域的扩展机制,它可以在一定程度上弥补iOS的沙盒...

  • Today Extension

    前言 简单介绍下APP Extension(应用扩展)中的Today Extension的使用方法。下图就是一个T...

  • iOS Widget 开发小结

    一、 什么是Extension ? 二、 添加Widget 1. 添加Today Extension Xcode菜...

  • iOS Today Extension

    我们项目中想要添加iPhone Today Extension功能,之前没有自己接触过Extension的新功能今...

  • iOS:Today Extension

    PS:此文仅作对TodayExtension的一些简单的使用,且大多参看前辈文章所写,作者目前水平尚水…. 学无止...

  • 关于Today Extension

    第一次写有关技术的博客,有错误的地方请及时纠正。 扩展介绍 效果图: 最近写了一个app需要用到app扩展(App...

  • iOS Today Extension

    什么是Today Extension? 怎么创建? 怎么使用? 不想使用sb? 代码共享 数据共享 什么是Toda...

  • iOS开发一些知识Demo

    RunTime、GCD、KVO、Block、RunLoop、Widget(today extension)、sha...

网友评论

      本文标题:Today Extension

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