美文网首页
Widget、3DTouch、自动化打包

Widget、3DTouch、自动化打包

作者: 风ai翔 | 来源:发表于2019-02-19 14:54 被阅读0次

    这篇文章主要记录开发及打包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

    8、图片太大、内存不足会导致Widget闪退,Widget闪退也会有UI展示,如下图: -w555

    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文件。

    -w497
    三、打包时问题

    正常开发原本已经完成,但是我们的项目需要支持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字段来配置。

    相关文章

      网友评论

          本文标题:Widget、3DTouch、自动化打包

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