如何使用uniapp-iOS基座| 掘金·日新计划

1,189 阅读7分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天

前言

随着公司业务的发展移动端业务也不断多了起来,而随着近年来跨端技术的快速发展,现在iOS原生开发的处境也大不如前,所以需要一个uniapp-iOS基座,而为什么是使用的是uni-app,而不是React Native、Flutter等其他的,这是因为相比于React Native和Flutter而言uni-app的学习成本更低,有一点经验的前端基本都可以快速上手。其中有些没有细讲的会有续更。如果大家有需要了解的细节,可以给我点赞留言,我会单独出文档讲明白。

项目介绍

目前项目提供两个能力,一是为了减低crash率使用了AvoidCrash,二是提供统一的原生调用脚本WKUniPlugin

AvoidCrash

为什么要使用AvoidCrash,AvoidCrash是什么?

为什么要使用AvoidCrash

为什么要使用AvoidCrash,这一点上面我们也有介绍到,主要是减低crash率。因为Objective-C是一门强类型语言,也就是说所有的变量必须先声明后使用,指定类型的变量只能接收类型与之匹配的值。而Objective-C又是在运行时才能确定数据的类型,所以就会导致运行时值的类型不一定是定义的类型,就可能导致crash。

AvoidCrash是什么

  • 这个框架利用runtime技术对一些常用并且容易导致崩溃的方法进行处理,可以有效的防止崩溃。
  • 并且打印出具体是哪个方法会导致崩溃,让你快速定位导致崩溃的代码。
  • 你可以获取到原本导致崩溃的主要信息<由于这个框架的存在,并不会崩溃>,进行相应的处理。比如:
    • 你可以将这些崩溃信息发送到自己服务器。
    • 你若集成了第三方崩溃日志收集的SDK,比如你用了腾讯的Bugly,你可以上报自定义异常。
  • 或许你会问就算防止了崩溃,但是所获取到的数据变成nil或者并非是你所需要的数据,这又有什么用?对于防止崩溃,我的理解是,宁愿一个功能不能用,都要让app活着,至少其他功能还能用。

WKUniPlugin

为了让uni-app写的代码能调用原生的方法,才写了这个uni-app插件,这里只提供一个uni-app插件,所以uni-app写的代码想调用任何原生支持的方法都需要在这里进行中转。

WKUniPlugin提供的方法

  • 插件提供的方法

    我们需要根据uni-app的需求来实现对应功能,所以需要传一个业务标识,iOS可以通过业务标识实现对应的需求。必要时还需要uni-app给对应的参数,有参数时说明iOS的实现需要依赖这个参数jsonArgs,uni-app向iOS传参时只能传json字符串,不能直接传递json对象。iOS完成对应的功能后可能需要通知uni-app完成后续流程,那就需要一个回调还是callback。

    /// 异步方法有回调
    /// @param businessIdentity 业务标识
    /// @param jsonArgs 参数
    /// @param callback 回调
    - (void)asyncInvokeAndCallback:(NSString *)businessIdentity jsonArgs:(NSString *)jsonArgs callback:(jsBridgeCallback)callback;
    
    /// 同步方法有回调
    /// @param businessIdentity  业务标识
    /// @param jsonArgs 参数
    /// @param callback 回调
    - (void)syncInvokeAndCallback:(NSString *)businessIdentity jsonArgs:(NSString *)jsonArgs callback:(jsBridgeCallback)callback;
    
    /// 同步调用无回调
    /// @param businessIdentity 业务标识
    /// @param jsonArgs 参数
    - (void)syncInvoke:(NSString *)businessIdentity jsonArgs:(NSString *)jsonArgs;
    
    /// 异步调用无回调
    /// @param businessIdentity 业务标识
    /// @param jsonArgs 参数
    - (void)asyncInvoke:(NSString *)businessIdentity jsonArgs:(NSString *)jsonArgs;
    
  • uni-app端使用插件

    • 导入原生插件

      let uniplugin = uni.requireNativePlugin('YXHUniPlugin');
      
    • 使用代码实例

      uniplugin.syncInvokeAndCallback(
      	// 业务标识
        "businessIdentity", 
      	// 参数
        JSON.stringify({ pageName: isTourist ? "register" : "login" }),
      	// 回调
        function (msg) {
          console.log(msg);
        }
      );
      

      其他几种方法的调用方式一样

如何接入基座

上面介绍了基座的一些能力,那我们一个新项目怎么快速接入基座呢?需要完成哪些修改?

快速接入基座流程

iOS基座的接入使用流程还是比较复杂的,大致梳理了一下有如下13个流程,下面我们会具体介绍一下每个流程的工程

  • 大前提需要有一个iOS开发者账号
  • 根据项目修改Bundle Identifier
  • 到iOS开发者账号申请证书,需要申请Bundle Identifier和描述文件
  • 根据Bundle Identifier到开发者后台 创建应用,需要appid与appkey
  • 修改info.plist的dcloud_appkey
  • 修改control.xml的appid值
  • 修改Pandora/apps下面的appid文件名
  • 修改uni-app项目中的应用标识
  • uni-app打包和文件迁移
  • iOS打包
  • 上传到对应的平台
  • 下载内测与App Store下载

iOS开发者账号

如果我们做的是甲方的项目需要先咨询甲方是否有iOS开发者账号,如果有iOS开发者账号还需要知道他们的账号属于什么类型,目前iOS开发者账号分三种类型,分别为个人型、组织型和教育机构型。三种账号的权限和具备的功能是不一样的,下面会分别介绍各个账号的区别。

  • 个人型—个人开发者账号(Individual)

    价格:$99/年

    优点:申请速度快(最快1天申请即可完成,最慢2-3个工作日),可以上架至AppStore供全世界下载.可以申请100台iOS设备UDID(iPhone/iPad/iPod),注册时不需要邓白氏编码

    缺点:上架至AppStore需要经过Apple审核,在iTunes里查到的信息只能是个人注册信息。

  • 组织型

    组织型分为两种账号,分别是公司开发者账号(Company)和企业开发者账号**(Enterprise)**

    • 公司开发者账号(Company)

      价格:$99/年

      优点:可以上架到AppStore,供全世界下载,iTunes里可以查到公司信息及相关产品,并显示团体名称。可以绑定100个iOS设备UDID(iPhone/iPad/iPod)。可以创建开发团队,并添加成员至此账号中,开发人员可以集中管理。

      缺点:上架需要经过苹果公司的审核,申请时间较个人型有所延长,最快需要2-4个工作日,最慢一般5-8个工作日保证完成。有Adhoc测试(QA测试)设备数量限制。注册时需要邓白氏编码

    • 企业开发者账号(Enterprise)

      价格:$299/年

      优点:针对企业用户,开发的app可以不经过苹果公司的审核,直接上架到企业网站(不能上架到Appstore),适合大型团队敏捷团队开发,迭代版本快。无设备限制,可以创建开发团队,并添加成员至此账号中,开发人员可以集中管理。

      缺点:申请时间和公司开发者账号一样长,注册时需要邓白氏编码

      在iTunes store里查不到企业的app信息和企业信息,适合企业内部使用

  • 教育机构型—教育开发者账号(Free)

    一般不对外开放

💡 如果需要了解开发者账号申请流程,可以查看`[iOS开发者账号申请流程篇](https://juejin.cn/post/6904164072141357063)`

根据项目修改Bundle Identifier

每一个项目的Bundle Identifier都是不一样的,所以要接入基座就需要有一个自己的Bundle Identifier。Bundle Identifier的定义规范为一个完整的二级域名反着写的字符串,如二级域名为app.baidu.com,那Bundle Identifier就应该为com.baidu.app,这是apple对Bundle Identifier定义的规范要求,请各位使用者严格准守。有了Bundle Identifier后我们就需要对项目就行修改,也需要在iOS开发者账号中进行证书申请。

  • 对项目中的Bundle Identifier进行修改

bundleIdentifier.png

申请证书

通常来说我们只需要申请Identifier、开发证书(iOS原生开发者使用)、描述文件(adhoc,development、appStore)、按需添加推送证书。

💡 这里不展开介绍,需要了解证书申请流程的朋友可以查看`iOS各类证书申请篇`

uni-app创建应用

目前公司的所有移动端应用都是使用uni-app开发的,一部分uni-app无法实现的功能再由原生实现。那么就需要显示在uni-app开发者后台创建应用,还需要到离线打包key管理申请appkey。

  • 创建应用

    • 首先访问DCloud开发者中心

      直接点击链接就能进入的开发者中心,然后登录就好了,这里不过多介绍这个。

    • 创建应用

      创建应用很简单,只需要填写应用名称,然后确认就好了。

      https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fc8254829f0f49edb9914694857da472~tplv-k3u1fbpfcp-zoom-1.image

  • 离线打包key管理

    申请好应用后,点击应用名称进入的应用详情中,在左侧菜单栏找到“离线打包key管理”,然后配置好iOS BundleId,这里的iOS BundleId就是上文提到的Bundle Identifier。如果没有Android的证书签名,可以取消勾选Android,只勾选iOS就好了。Android需要的时候在填写对应的信息就好了。

    https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9f56089dedb4412b84f871e39322001f~tplv-k3u1fbpfcp-zoom-1.image

修改info.plist中的dcloud_appkey

这个很简单不做过多介绍,这里的dcloud_appkey就是离线打包key管理中的app key

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f38fd356472e4e6a95cfa7496684f9f6~tplv-k3u1fbpfcp-zoom-1.image

修改control.xml中的appid

control存放的目录如果不好找,可以在左下角搜索control

然后把DCloud开发者中心创建的应用appid复制到这里就好了

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/65ff41808f9a428e8e4691fe86a39203~tplv-k3u1fbpfcp-zoom-1.image

修改Pandora/apps下面的appid文件名

Pandora/apps是用作存放uni-app打包后的代码的,这个文件名不能修改,uni-app的跨端框架在启动的时候会按照这里路径获取uni-app的启动文件加载项目。这里有一个重要的应用识别,因为是离线打包需要有与dcloud_appkey对应的appid(应用id)进行匹配加载项目启动文件。所以需要确保Pandora/apps目录下的有appid值对应的目录,也就是说需要control中的appid需要与Pandora/apps下的目录文件名相同,如果不一致项目是跑步起来的

https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/b5d7967712d84a9ca8e1ededf80eefdb~tplv-k3u1fbpfcp-zoom-1.image

修改uni-app项目中的应用标识

修改uni-app项目中的manifest.json的appid,确保uni-app应用标识(AppID)与dcloud开发者中心中我们创建的应用appid一致。

www.notion.so

uni-app打包和文件迁移

到这一步我们的准备工作都已经完成了。现在就是离线打包工作了,接下来就是需要完成本地打包。

  • uni-app打包

    到uni-app项目目录下,执行打包命令;如build:app-plus

  • 文件迁移

    将uni-app项目打包好的文件迁移到原生app的Pandora/apps/__UNI__DB0432D/下。这个操作是每一次打包都需要做的,我们可以写一个shell脚本后完成这个操作。

    #!/bin/bash
    cd ..
    path=$(cd `dirname $0`; pwd)
    #echo $path
    cp -r $path/uni-app项目名/dist/build/app-plus/ $path/ios原生项目名/ios原生项目名/Pandora/apps/uni-app appId/www/
    

iOS打包

iOS打包有两种方式,分别是Xcode打包与shell脚本打包

  • Xcode打包

    Xcode打包比较适合iOS原生开发者,所以这里不做过多介绍,本文档主要是给uni-app开发者看的

  • shell脚本打包

    这种方式需要先写脚本,这个由我来完成,而uni-app开发者只需要执行shell脚本就好了。

    目前shell脚本提供的命令有 sh pgyer.sh dev 开发环境sh testFlight.sh dev

    • sh pgyer.sh dev 开发环境

    其中dev是指dev环境,还可以选择pro环境即生产环境,命令中的开发环境 是发布描述,是为了给下载的人查看当前版本是什么环境的。sh pgyer.sh dev 开发环境 等待命令运行完成后,就已经上传到蒲公英了。

    • sh testFlight.sh dev

    这个命令是将打包好的应用后上传到TestFlight的,上传完成后需要App Store完成机审,机审完成后脚本才结束。

    💡 注意:如果是企业开发发布生产环境(非内测),请发布私有平台,因为蒲公英有下载数量限制

上传到对应的平台

这一步已经集成到打包脚本中去了,所以不需要手动上传

下载内测与App Store下载

  • 蒲公英下载

    可以通过二维码下载和链接下载

    值得一提的是如果页面上出现了点击下载最新版本的时候,而你确实需要最新版本时请点击下载最新的

    https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ba0a107040594f0db551964e1ddee2d2~tplv-k3u1fbpfcp-zoom-1.image

  • TestFlight下载

    可以通过先安装TestFlight,然后访问公开链接进行下载,在Safari浏览器中访问链接既可以到TestFlight进行兑换应用

    关于TestFlight测试有任何问题可以访问文档

结语

多多留言会变有钱多多点赞会变好看多多转发造福大家