前言:
- 自从iOS8API中开放iOS Today 扩展之后 很多朋友都在研究一下出来装个X,说实话这个东西做出来是挺炫的,感觉很高大上,但是经过我查阅资料正经研究这个东西的时候感觉很简单,没有大家想的那么高端,废话不多说上操作。
先来张效果图:
Untitled.gif- 第一步:创建 iOS Today 扩展(见图)
- 如上体创建完成之后会在工程目录多一个TodayViewController文件夹
应为我们这个教程截图是我已经做好的工程所以文件夹正常的StoryBoard文件我已经删除选用纯代码开发。
纯代码需要配置info.plist的俩项参数:
4.png移除NSExtensionMainStoryboard 键,并添加NSExtensionPrincipalClass 键,使用view controller的名字作为值。
第二步:开发这个玩意
-
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)配置如下:
- 在工程目录->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
网友评论