Widget、3DTouch、自动化打包
这篇文章主要记录开发及打包Widget项目时遇到的坑,及解决方案。
具体开发过程可参考:
Widget开发
3DTouch开发
一、Widget发展史
1、Widget也叫作 Today Extension,iOS8推出第一版,iOS10大幅度修改,支持收缩展开功能,且可自定义高度,系统默认的高度为110pt。
2、3D Touch也叫作 Shortcut,从iPhone 6s及其以上机型开始支持,iOS9以上系统才支持,iOS10后 3D Touch支持显示一个Widget。
二、开发中问题
1、一个项目可加多个Widget,3D Touch时显示哪个Widget是可配的:
image
- 在Info.plist 中添加 UIApplicationShortcutWidget,其 Value 代表快捷菜单中展示的 Extension 的 Bundle id
- value为空字符串,可以让3D Touch不显示Widget,但有人透露无法通过上线审核。
2、隐藏和显示Widget方法:
#import <NotificationCenter/NotificationCenter.h>
BOOL show = NO;
NSString *bundleID = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"];
NCWidgetController *widgetController = [NCWidgetController widgetController];
[widgetController setHasContent:show forWidgetWithBundleIdentifier:bundleID];
3、3D Touch最多可以给用户自定义4个Item,AppStore的包系统自动添加分享“**”
,TestFlight的包系统自动添加发送Beta版反馈
。也就是最多5个Item。
4、Widget的BundleID的前缀必须是 主Target的BundleID,否则编译报错。
5、3D Touch支持APP内事件、APP外事件,APP外事件效果可查看系统的照片
、邮件
APP,代码实现可参考上面附件。
6、Widget可以使用的内存远远低于APP的可用内存,因此当内存吃紧的时候,会优先杀死Widget。
7、使用图片也是必不可少,然而直接 imageNamed: 和 imageWithContentsOfFile: 两种方式加载都不行,即使设置了文件的 target 为 Widget Extension,后来在其target 内部建立一个 .xcassets
文件,再使用 imageNamed: 和 imageWithContentsOfFile: 即可加载图片。图片最好压缩一次,推荐TinyPNG。
9、Widget可以单独看作是一个app:
- Mach-O Type和主Target一样,是Executable
- 在Widget的代码上打断点,会发现没有效果
- 共享数据需要使用APP Group
- 宿主app被杀进程不影响Widget
- 与宿主app的交互使用
openURL:
Scheme
10、Widget的调试方法:
-w280
- 选择Widget的Target,直接运行,断点这时候才会生效
11、重启Widget的方式:
发现Widget闪退了,怎么重启呢?
重启手机,修改系统语言,卸载重装,触发内存不足
12、Widget生命周期:
- Widget的代码是写在一个ViewController里的,第一次(启动)运行时,生命周期同普通VC一样。
- 如果Widget短时间内过于频繁的消失显示,VC直接只会执行
viewWillAppear
方法。 - 当Widget从屏幕上消失2s左右,就会调用
dealloc
,再次出现在屏幕中时,都会重新调用viewDidLoad
。
但是Widget APP进程并没有被杀死,内存不足才会被杀死。
13、新增一个Target,XCode能自动获取主Target的自定义字段,一些编译前数据可以保存在这里进行数据共享。说明所有Target共享使用App.xcconfig
文件。
三、打包时问题
正常开发原本已经完成,但是我们的项目需要支持Jenkins自动化打包和重签名,因此引发这个模块问题总结。
1、描述文件问题:
-
fastlane sigh
生成PP文件命令,添加参数 指定BundleID、指定输出PP文件名,输出主Target和Widget的两个PP文件。 - 打包配置文件
exportOptions.plist
改成自动管理PP模式
<dict>
<key>compileBitcode</key>
<false/>
<key>method</key>
<string>ad-hoc</string>
</dict>
</plist>
2、重签名命令fastlane sigh resign
可以直接指定多个bundleID和PP文件,只要一一对应上就行。
3、APP Group ID问题:
- 同一个开发者账号下的所有APP,可以通过同一个Group ID垮APP共享数据。打破沙盒环境的限制。
- Group ID 与 BundleID 一样,必须唯一。因此马甲包重签名后,必须使用另外一个Group ID,这里就使用了XCode的
App.xcconfig
文件和User-Defined
字段来配置。