ios8 widget
2015-03-12 18:54
453 查看
App Extension 概述
应用程序扩展是iOS8中引入的一个非常重要的新特性,扩展让app之间的数据交互成为可能.用户可以在app中使用其他应用提供的功能,而无需离开当前的应用.但是基于安全和性能的考虑,每一个扩展运行在一个单独的进程中,它拥有自己的bundle,bundle后缀名是”.appex””.(PS:当天听到最多的可能就是,不用越狱也能用第三方输入法了,搜狗和百度也第一时间推出了Custom keyboard)iOS8上共有6个区域支持Extension,分别是Today、Share、Action、Photo Editing、Storage Provider、Custom keyboard几种,其中Today中的extension一般称为widget.
这里主要介绍widget(其他脑补…键盘最容易…)
先来看一张图:
分别是Clips、墨迹天气、搜狐视频3个App的Widget.
我们所要做的,也就是这样,根据Containing App来定制属于自己的Widget.
Start My Widget
我做的这个Demo是类似于Clips的widget,完整代码我已经上传到了github点这里,Demo里面注释比较详细.1.创建Extension
点击“File”->”New”->”Target”
2.后续步骤略略略略略
涉及扩展如何运作、Extension和Containing App、host app之间的关系、Containing App与扩展共享数据、开启App Groups等等知识点在查看到的资料中写得很详细,我就不打算详述(其实是水平有限^_^),接下来我重点讲下我在项目具体遇到的问题。(详细请见最后的参考资料,大牛们写得很棒!膜拜!)
3.My Problem
(1)UI布局:系统默认,widget的View的x坐标是和Containing App的图标坐标的bottom相对应的(参照搜狐视频效果),如果你想靠到左边去“越界”,要实现NCWidgetProviding代理方法- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets,这个defaultMarginInsets打印出来是{0, 47, 39, 0},注意看x左边是0.
1234567 | // 一般默认的View是从图标的右边开始的...如果你想变换,就要实现这个方法- (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets {//UIEdgeInsets newMarginInsets = UIEdgeInsetsMake(defaultMarginInsets.top, defaultMarginInsets.left - 16, defaultMarginInsets.bottom, defaultMarginInsets.right);//return newMarginInsets;//return UIEdgeInsetsZero; // 完全靠到了左边....return UIEdgeInsetsMake(0.0, 16.0, 0, 0);} |
12 | // 调整高度,根据数组的值来确定Cell的个数,从而确定视图的高度self.preferredContentSize = CGSizeMake(self.view.bounds.size.width, 400-72*(5 - _allDataArray.count)); |
1234567891011121314151617181920 | static NSString *const KArchiverKey = @"DataArray";// 数据处理(需要固化)// @"group.com.tranfer" 是entitlements中“com.apple.security.application-groups”对应的值NSUserDefaults *sharedUserDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.tranfer"];NSData *unarchiverData = [sharedUserDefaults objectForKey:KArchiverKey];// 特别注意,[NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData] 转化的是一个数组,因为我固化的是一个数组// PS:allDataArray 的类型 是 NSMutableArray// 不能直接用self.allDataArray = [NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData];self.allDataArray = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:unarchiverData]];NSData *lastStringData = [sharedUserDefaults objectForKey:KArchiverLastClipKey];self.lastPasteBoard = [NSKeyedUnarchiver unarchiveObjectWithData:lastStringData];// 保存主数据- (void)_saveDataToSanBoxWithDataArray:(NSMutableArray *)dataArray {NSUserDefaults *sharedUserDefaults = [[NSUserDefaults alloc] initWithSuiteName:@"group.com.tranfer"];NSData *archiverData = [NSKeyedArchiver archivedDataWithRootObject:dataArray];[sharedUserDefaults setObject:archiverData forKey:KArchiverKey];// 切莫忘记,依旧调用 synchronize 立即写入沙盒中[sharedUserDefaults synchronize];} |
1 | - (void)openURL:(NSURL *)URL completionHandler:(void (^)(BOOL success))completionHandler; |
123 | [self.extensionContext openURL:[NSURL URLWithString:@"iOSWidgetApp://"] completionHandler:^(BOOL success) {NSLog(@"open url result:%d",success);}]; |
上传注意事项
按照以往步骤上传应用就会报如下错误:123 | error: Embedded binary is not signed with the same certificate as the parent app. Verify the embedded binary target's code sign settings match the parent app's. Embedded Binary Signing Certificate: iPhone Developer: xxx xxx (H536M777VC) Parent App Signing Certificate: iPhone Distribution: xxx xxx (AA56B6R4CW) |
Ending
暂时就这些了,这也是我第一个Extension的Demo,大家如果发现什么问题,欢迎给我留言,小菜鸟的我仍在不断的探索中。相关文章推荐
- ios8新特性widget开发(手机上和通知栏并列的今天的制作)
- ios8新特性today widget开发
- ios8新特性widget开发(自定义的通知栏样式)
- ios8新特性widget开发-b
- iOS8 Today 实现Clips widget
- ios8 widget 名字本地化(localize)
- ios8新特性widget开发
- ios8新特性widget开发
- ios8新特性widget开发
- iOS8 新特性widget开发
- IOS8 Today Widget 总结
- iOS8 程序 系统设置-定位服务-崩溃问题
- iOS8地图点击标注显示详细信息(医药吧数据)
- iOS开发-iOS8地理位置定位
- poj 2947 Widget Factory (高斯消元)
- Widget——Web2.0中的互联网零件
- 开发问题及解决 java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记1 IOS8概述
- KeyBoard 在iOS7和iOS8上通知的区别
- 解决iOS8下面UItableView里面的cell多分割线右移的问题