美文网首页
Toady Widget使用

Toady Widget使用

作者: 爱迪生的小跟班 | 来源:发表于2018-10-12 17:01 被阅读0次

一、创建today widget插件工程

today widget工程需要依赖于主工程(“宿主工程”),所以前提需要有一个能够运行的项目。然后打开工程File -> New -> Target -> Today Extension 如下图:


创建today widget工程.png

输入名称创建之后,项目中会多出以下文件夹:
(注:创建的today Extension和宿主程序的版本号需要一致,否则在上架审核的时候回报错)


创建 today widget后新增的文件夹.png

文件中的.storyboard已经被在下删除了,并且将plist文件中的NSExtensionPrincipalClass修改为页面名称:


增加拓展页面名称.png

到此,编译工程,就能够编译通过了。模拟器上能够正常运行并且看到today中有了该插件。。但是真机中还不行,因为证书不对啊。需要去开发者中心创建today widget对应的证书 (证书还需要加入APP Group,才能实现today widget与宿主程序之间的数据共享,后面会讲到)

二、从today widget打开APP

Today Extension只能通过openURL的方式调起APP,所以需要配置URL types。
1、首先,在宿主程序中增加URL Types:


宿主程序中增加URL Types.png

2、其次,在today Extension程序中的plist文件中增加url types选项:(注意:URL identifier为宿主程序的Bundile id ; URL Schemes为上一步添加的Schemes)看下图


today Extension程序中的plist文件中增加url types选项.png

完成上面两个步骤之后,就可以实现从today Extension中打开APP了,在TodayViewController.m中增加个按钮,点击进入APP:实现如下:

TodayViewController.m
//打开app (//通过openURL的方式启动Containing APP)
- (void)openURLContainingAPP:(UIButton *)sender{
    //打开类型(用于宿主程序内部控制跳转逻辑,比如是要跳转到首页还是要跳转到个人中心等等)
    NSString *schemeSubString = @"typeHome";
    //scheme为app的scheme
    NSString *scheme = [NSString stringWithFormat:@"此处写入上面创建的Schemes://?type=%@",schemeSubString];
    
    [self.extensionContext openURL:[NSURL URLWithString:scheme] completionHandler:^(BOOL success) {
        NSLog(@"open url result:%d",success);
    }];
    
}

然后再宿主程序的AppDelegate方法中实现协议,监听url,

- (BOOL)application:(UIApplication *)app openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<NSString *,id> *)options
{
    //TODO:打开逻辑控制
    NSDictionary *type = [url URLParameter];
    if ([[type objectForKey:@"type"] isEqualToString:@"typeHome"]) {//打开首页
        [[AppDelegate sharedDelegate].tabBarController setSelectedIndex:0];
        
    }else if ([[type objectForKey:@"type"] isEqualToString:@"typeOrder"]){//打开菜单
        [[AppDelegate sharedDelegate].tabBarController setSelectedIndex:1];
    }
    return YES;
}

三、today Extension与宿主程序之间的数据共享

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

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

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

3、在宿主程序中添加APP Groups(名称为:你在App Store添加创建的group的名称)


image.png

4、同样在today Extension中勾选刚添加的group
[图片上传中...(image.png-2f0d77-1539332876378-0)]

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

    //在宿主程序中存储数据
    //测试与todayWidget数据共享
    NSUserDefaults *userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"这里填写你的group名称"];
    [userDefault setObject:@"存储的内容,就是我 -松小宝-" forKey:@"key_todayWidget_appName"];
    [userDefault synchronize];
    //测试与todayWidget数据共享

下面是在today Extension中读取数据

//获取宿主程序的数据
- (void)getLuckyClientData{
    //从宿主程序获取共享数据
    NSUserDefaults *userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"这里填写你的group名称"];
    NSString *appName = [userDefault objectForKey:@"key_todayWidget_appName"];

    NSLog(@"%@",appName);
}

下面为使用NSFileManager共享数据的方式

#pragma mark -  通过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;
}

四、让APP Extension共享宿主程序第三方库或者头文件和资源文件

1、PROJECT --info --configurations,将对应的Debug和Release 设置成pods-你的Xcode项目名.debug和pods-你的Xcode项目名.release。


image.png

2、TARGETS--Build Phases --Link Binary With Libraries,将pods的.a文件引入


image.png

3、如果想引用宿主程序中的头文件或者资源文件,将Target Menbership中打勾对应的程序即可


打勾该项之后,today Extension就能使用Assets.xcassets中的资源.png

最后,上一张效果图:


today widget效果图.png

五、添加3D Touch

  //在didFinishLaunchingWithOptions方法中添加3D Touch选项
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    //快捷菜单的图标
    UIApplicationShortcutIcon *icon1=[UIApplicationShortcutIcon iconWithTemplateImageName:@"cart_bar_select"];
    //快捷菜单
    UIApplicationShortcutItem *item1=[[UIApplicationShortcutItem alloc] initWithType:@"1"
                                                                     localizedTitle:@"购物车"
                                                                  localizedSubtitle:nil
                                                                               icon:icon1
                                                                           userInfo:nil];
    //设置app的快捷菜单
    [[UIApplication sharedApplication] setShortcutItems:@[item1]];
}
//3D Touch按压程序图标的快捷项时触发的方法
-(void)application:(UIApplication *)application performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem completionHandler:(void (^)(BOOL))completionHandler{
    if([shortcutItem.type isEqualToString:@"1"]){
        //打开应用,并跳转到购物车
        [[AppDelegate sharedDelegate].tabBarController setSelectedIndex:3];
    }
}

加入3DTouch后可以再桌面长按图标显示快捷选项和today widget视图.

相关文章

网友评论

      本文标题:Toady Widget使用

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