美文网首页Swift编程iOS DeveloperiOS Development
iOS Today Extension开发(Widget)

iOS Today Extension开发(Widget)

作者: 退役程序猿 | 来源:发表于2016-10-25 19:07 被阅读629次

前言:

  • 自从iOS8API中开放iOS Today 扩展之后 很多朋友都在研究一下出来装个X,说实话这个东西做出来是挺炫的,感觉很高大上,但是经过我查阅资料正经研究这个东西的时候感觉很简单,没有大家想的那么高端,废话不多说上操作。

先来张效果图:

Untitled.gif
  • 第一步:创建 iOS Today 扩展(见图)
1.png 2.png 3.png
  • 如上体创建完成之后会在工程目录多一个TodayViewController文件夹
    应为我们这个教程截图是我已经做好的工程所以文件夹正常的StoryBoard文件我已经删除选用纯代码开发。

纯代码需要配置info.plist的俩项参数:

移除NSExtensionMainStoryboard 键,并添加NSExtensionPrincipalClass 键,使用view controller的名字作为值。

4.png

第二步:开发这个玩意

  • UI样式

如果你看一下官方对于今日插件的UI指南,有两点值得注意:
1、尽量不要使用背景,默认的毛玻璃效果很好,也比较统一;
2、尽量保持默认的缩进,即左边会空几个像素。

  • 如果想改变默认缩进,在TodayViewController里面实现以下方法,缩进就没有了:
-(UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:        (UIEdgeInsets)defaultMarginInsets{
    return UIEdgeInsetsZero;
}

与宿主App进行交互-扩展App跳转主App

TodayViewController.m类实现代码
//点击按钮跳转页面
-(void)BUttonClick:(UIButton *)Bt{
UIButton* button = (UIButton*)Bt;
  if (button.tag == 0) {
    [self.extensionContext openURL:[NSURL URLWithString:@"跳转链接"] completionHandler:^(BOOL success) {
         NSLog(@"open url result:%d",success);
    }];
}
else if(button.tag == 1) {
    [self.extensionContext openURL:[NSURL URLWithString:@"跳转链接"] completionHandler:^(BOOL success) {
        NSLog(@"open url result:%d",success);
    }];
}
else if(button.tag == 2) {
    [self.extensionContext openURL:[NSURL URLWithString:@"跳转链接"] completionHandler:^(BOOL success) {
        NSLog(@"open url result:%d",success);
    }];
}
}

配置跳转链接协议

16632-8df6a709f3a34305.png
  • 跳转链接示例:iOSWidgetApp://为跳转页面做标识

AppDelegate.m类实现代码

跳转链接与TodayViewController.m类跳转链接相对应
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
UINavigationController * nav = (UINavigationController*)[customTabBarController.viewControllers objectAtIndex:0];
  if ([ctrlString isEqual:@"跳转链接"]) {
      跳转操作
  }if ([ctrlString isEqual:@"跳转链接"]) {
      跳转操作
  }if ([ctrlString isEqual:@"跳转链接"]) {
      跳转操作
  }
  return NO;
 }

数据共享(主App和扩展App)

数据共享的方式有很多种方法我来介绍俩种具体你们在研究
第一种:利用Group
  • 这种方法原理就是将主App和扩展App做一个缓存空间(NSUserDefaults)配置如下:
C8BAEAB5-6872-4A91-99FF-D806E4D4F882.png
  • 在工程目录->TARGETS->分别选择主App和扩展App->Capabilities->App Groups->按照图做就好了(Steps三个对勾要都打上)

主App存扩展App所需要数据

NSUserDefaults* userDefault = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.10086.shandongmcc"];
[userDefault setBool:YES forKey:@"islogin"];

扩展App取所需要数据

NSUserDefaults *myDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.cn.10086.shandongmcc"];
BOOL isLogin = [myDefaults objectForKey:@"slogan"];
  • 这就可以了正常主App与扩展App进行数据交互的第一种方法;
第二种:利用接口
  • 扩展App也可以进行数据请求解析,所需要的数据直接做接口请求处理就好;
    还有静态库代码共享等等的数据共享方法你们就自己研究吧。

总结:

  • 重点一:创建扩展
  • 重点二:创建数据共享空间(App Groups)
  • 重点三:主App存,扩展App取
  • 重点四:开发过程是OC语言自己不会去找老师

补充:

  • iOS8中Today扩展遇到在模拟器中OK,在5S以上真机就会失败的问题,还会报can attach to it by selecting Debug > Attach to Process 之类的错误,之前一直以为是Xcode的BUG,其实想想只在5S上出现,就应该想到64位编译的问题了
    解决方法:
    1、Build Settings->Architectures 选择 Standard architectures (armv7, arm64)
    2、Build Settings->Valid Architectures 设定 armv7 armv7s armv8 arm64
    3、Build Settings->Build Active Architectures Only 设定为 NO
    4、扩展Today的Target按如上设置

  • 有很多哥们问我说为什么我在调试的时候断点打了却不走呢?
    解决办法:
    别急。。一句话你调试主就运行主,调试扩展就运行扩展。

  • 好吧在说一句就一句。。主App代码是不能给扩展用得,想公用代码得打包静态库。归谁得代码就要放到谁得目录下啊兄弟。

  • GitHub下载地址:https://github.com/QQ396368888/iOSToday.git

相关文章

网友评论

    本文标题:iOS Today Extension开发(Widget)

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