Tag: iOS应用开发

适用于iOS的Promise-为什么要尝试使用?

介绍 由于您已经阅读标题并查看了上面的图片,因此您想象会收到一些新闻。 一个新的框架? 一个新的第三方可以帮助您改善项目演示中的大量脏代码? 答案是肯定的,但根本不是。 承诺对您的帮助超出了您的预期。 因此,如果您是拥有高级商标的iOS开发人员,或者是技术领导团队,那么您可能会在意。 如果没有,请停止阅读更多内容并返回到滚动条。 您是否曾经在项目中使用异步任务? 说是? 好。 为此,举一个例子,当您想从Web服务(用于使用Youtube JSON api)获取视频列表时,您可能会知道: 使用Promise ,它看起来像: 给你惊喜吗 结果甚至令我惊讶。 什么? Promise是包装异步任务的对象。 传递该对象,并编写整洁,有序的代码; 从一个异步任务到另一个异步任务的逻辑,简单,模块化的流。 您现在所需要的就是:https://github.com/mxcl/PromiseKit 好消息: PromiseKit带有使UIAlertView , UIActionSheet , NSURLConnection , UIViewController , CLLocationManager等“ thenable”的类别。 例如,我们甚至试图变得超级方便。 将一个UIImagePickerController (等)实例传递给PromiseKit的 promiseViewController:animated:completion方法可自动处理幕后的常规委派,从而为您提供整洁,简单,受块支持的承诺。 这些都是使用PromiseKit的重要原因。 但是,诺言比那时更强大。 为什么? 它们使异步操作可链接和标准化。 他们清理异步意大利面; 它们简化了错误处理; 可以通知许多对象完成的信息,而不仅仅是一个。 和 它们使您的应用程序更强大。 与Promise合作时,我最钟爱的是什么? 它正在链接。 假设您要同时执行3个任务A,B和C,分别是先执行A,然后执行B,然后执行C。 可以,但更复杂且难以维护。 并承诺 流似乎正在穿过薄壁🙂 如何开始? Promise提供了一些您可以看到的关键字: […]

反应本机推送通知

使用Amazon Pinpoint,AWS Amplify和AWS Mobile Hub将推送通知添加到React Native iOS项目中。 AWS最近增加了将推送通知发送到AWS Amplify库的功能,从而可以与适用于iOS和Android平台的Amazon Pinpoint推送通知服务集成。 这增加了Amplify支持的现有服务,该服务现在还包括使用Amazon Cognito进行授权,使用Amazon S3进行存储以及使用Amazon Pinpoint进行分析。 在本文中,我们将逐步介绍如何向React Native iOS项目添加推送通知。 我们将不介绍Android,它将在另一篇文章中介绍,因为这两个平台是如此不同,并且具有完全不同的配置和工作流程。 要查看完整的端到端实施,包括配置Apple证书和配置文件,请参阅以下视频。 现在,您会注意到项目中添加了几个新文件和文件夹: ./aws-exports.js – ./awsmobilejs和./awsmobilejs 。 在通过CLI创建Mobile Hub项目之后,应在终端中向您介绍./awsmobilejs的内容: ./aws-exports.js包含与AWS Amplify支持的任何AWS服务进行交互所需的配置。 我们在调用Amplify.configure(config)时使用此文件来配置应用程序,其中config是此配置。 接下来,我们需要在AWS Amplify React Native项目中链接本机依赖关系: 反应本机链接aws放大反应本机 苹果开发人员配置 接下来,我们需要在开发人员控制台中设置iOS推送通知,创建配置文件,并从Keychain Access生成并下载.p12文件。 执行此操作的步骤位于此处。 如果您以前从未做过,那么这是一个复杂的过程,我会在这里指出您之前引用的视频,并从4:42到12:30观看整个过程。 将.p12文件添加到Amazon Pinpoint 现在我们已经配置了Apple证书,我们需要通过Mobile Hub将.p12文件上传到Amazon Pinpoint。 让我们从控制台在Mobile Hub中打开项目: awsmobile控制台 这将在AWS控制台中打开当前的AWS Mobile Hub项目。 向下滚动并单击Messaging&Analytics ,然后选择Messaging : 现在,选择Mobile Push […]

为什么iOS应用程序开发会成为未来?

移动应用程序开发是一个不断发展的行业,它融合了技术人员和专业公司的服务以实现其主要目标。 过去,数字市场曾经集中在网络上,但是最近,情况发生了不可预测的转变,尤其是对于每个希望专门研究移动技术的人。 如今,由于智能手机的重要性日益重要,因此对智能手机的需求不断增加。 而且,它是一种相对最新的技术,为许多熟练的移动开发人员带来了更高的就业率。 现在,任何移动应用程序开发都希望雇用优秀的应用程序开发人员。 移动域中有许多操作系统试图通过一系列不同的可行策略来吸引大量客户。 iOS的整个实施过程无疑对数字世界产生了更大的影响。 现在,越来越多的应用程序开发人员以及移动应用程序开发公司正在使用此特定平台,以推广自己的策略并改善移动应用程序的开发。 苹果公司的iOS是最著名的移动操作系统之一,它需要非常特定的方法来开发应用程序。 与大多数常规Web应用程序和桌面软件不同,在此特定平台上开发应用程序需要大量战略规划以及实施。 iPhone应用程序开发的兴起 多年来,iPhone应用程序的开发无疑已经发展起来,从而成为全世界最伟大的企业之一。 这归因于以下事实:几乎每个企业和个人都希望使用此平台来提出自己的想法以及产品和服务。 另外,Apple甚至不以任何方式做出让步,以确保向用户提供没有麻烦的应用程序。 他们已经成功建立了非常严格的标准,想要使用该平台的开发人员必须遵守这些标准。 在任何特定的应用程序开始在Apple App Store上获得可见性之前,它必须经过严格的设计和开发过程,严格按照iPhone应用程序开发标准进行。 这也包括主题结构,无缝的UX和UI以及连续性。 任何希望在此平台上创建标准移动应用程序的企业都必须遵循并遵循Apple的指定设计范式。 当涉及到iOS应用程序开发时,在此特定平台上没有任何限制可以轻松实现。 您可以轻松地在Apple App Store上亲自查看所有内容。 大多数企业都认为iOS是最有益,利润最高的平台,可以将不同的概念变成现实。 有了合适的资源和团队,任何概念都可以实现。 作为市场领导者,iOS实际上为高效的移动应用程序开发铺平了道路。 大多数iPhone应用程序开发人员都致力于充分利用该平台。 他们通过开发设计时尚的不同生产应用程序来利用其不同客户和客户的购买力。 因此,该应用程序的许多所有者以及用户现在正在享受通过iPhone应用程序开发所创建的各种动态设计所带来的丰富体验。 这有助于增强移动交互,并且该技术现在正在帮助为世界各地的不同客户产生数百万美元的收入。 iOS应用程序开发必将成为未来。 让我们看一下理解它的关键方面。 1. Swift简介 编码是应用程序开发的基础。 如果出现问题,则整个应用程序开发都会随之失败。 Android开发人员使用Java时,iOS开发人员当然欢迎新发布的Swift。 它带有用很少的代码就能提供更好的结果的承诺。 它还可以充当计算机和编码器之间的一个很好的翻译器,还可以帮助您向计算机传达您到底想做什么。 要构建iPhone应用程序,请聘请精通Swift语言的iPhone应用程序开发人员。 2.仿真器的质量 与Android模拟器进行比较时,iOS模拟器在速度和支持方面都非常出色,这可能会减慢Android应用程序的开发速度,并使Android开发人员的工作更加艰难。 因此,iOS应用程序开发无疑是领先的。 3.消耗时间 事实证明,Android应用程序开发需要更长的代码,并且它与缓慢的仿真器混杂在一起,这会导致开发人员花费更多时间。 即使很少代码是自动生成的,仍然需要对其进行读取和调试。 与之相比,iOS应用程序开发消耗的时间更少。 4.开发人员支持和工具 通过提供比Android Development Studio更好的XCode,Apple确实向开发人员展示了巨大的承诺。 5.碎片化 由于众多品牌,平台和屏幕尺寸,Android应用程序开发面临重大挑战。 您可以做一个完美的应用程序,但是您可能会收到许多关于在不同手机上发现的未检测到的错误的电子邮件。 […]

我见过的iOS开发最佳实践在GrubHub上

鉴于GRUBHUB是我工作过的第一家技术公司,所以我分享的一些实践可能会受到限制。 在加入GRUBHUB之前,我曾在企业公司工作,这些公司通常在业务和技术实践之间存在分歧。 他们不一定彼此一致。 通常,企业拥有更大的发言权,因为它们控制着公司的财务方面。 因此,我喜欢在技术驱动的公司工作。 这也是我第一次体验真正的敏捷开发过程。 以下几节是我作为开发人员的经验。 团队架构 为了使该过程正常进行,每个人都必须在同一页面上。 在我们的案例中,利益相关者包括开发人员,产品所有者,分析代表和质量检查工程师。 有时,设计师需要参与。 在GRUBHUB,我们非常重视产品的质量。 因此,我们选择以高质量实现较少的功能。 产品管理 在GRUBHUB,我们与产品所有者紧密合作。 产品所有者负责管理其票务的优先级,我们将其作为一个团队进行梳理。 修饰过程每周进行一次,持续30分钟,偶尔会召开临时会议来修饰需要紧急完成的其他票证。 在会议期间,开发人员可以确定需求中的任何差距,并在组合中添加任何单元测试和功能测试,因为开发人员还负责实施自动化测试(单元测试和功能测试)。 我们的质量检查团队会进行更多的探索手动测试,以检查整个应用程序的运行状况。 他们有更全面的看法。 这就是质量检查团队参与修饰过程的原因。 它们有助于确保票证包含需要由开发人员自动化的用例。 产品负责人负责提供足够的详细信息,包括验收标准,设计模型,API请求,流程和测试数据。 在计划过程中,开发团队的负责人将根据产品所有者的优先积压工作,获取冲刺门票,并进行相应分配。 在这一点上,任何经过修饰且可用于计划的票证都将具有开发人员要处理的所有详细信息。 由于我们的冲刺周期大约为两周,因此我们所有人都在确保票证上有足够的信息以在一周的短时间内完成开发。 发展管理 除非包含单元测试/功能测试并通过代码更改,否则不会创建任何请求请求。 为了使开发团队能够做到这一点,我们在工作开始之前进行了设计审查,编码风格指南,持续集成系统以及代码审查流程。 开发人员在其各自的分支机构工作,并负责在合并到主分支机构之前从其分支机构创建临时构建,以完成所有验证。 验证包括与设计人员进行的任何视觉质量检查测试以及与负责任的产品所有者进行的功能测试。 开发人员需要完成的其他其他任务包括在登台环境中进行实验。 需要注意的一个重要关键是,我们有很多时间专注于开发而不会受到任何干扰。 所有会议均安排在中午12点之前和下午4点之后。 因此,这段时间之间的任何时间都致力于开发。 发布管理 我们的发布周期为每两周一次,因此每天都会举行发布会议,以对任何新缺陷进行分类并检查发布状态。 与会人员包括质量检查小组和开发人员主管。 在这段时间里,他们还会优先处理需要解决的所有关键错误。 任何超出范围(包括产品所有者期望的其他更改)的提议,都会将它们放入待办事项列表中,以优先考虑将来的冲刺。 我们的目标是最终将发布周期缩短至一周,随着我们完善上述流程,我们将能够实现这一目标并更频繁地发布到应用商店。 我们的流程是可预测的,为开发人员完成工作以及按时按计划交付提供了一定的稳定性。 然后去哪儿? 您是否在团队中经历过类似的最佳实践? 您是否发现其他有价值的东西可以提供质量。 最初发表于《如何在Swift中做到》。

Swift World:设计模式-中介者

今天我们将讨论中介者模式。 让我们从现实世界中的场景开始,而不是解释抽象定义。 在团队中,有PM,开发人员和QE。 当开发人员完成对新功能的编码后,这些代码将提交给存储库。 其他股东(如量化宽松和PM)需要通知。 protocol Collogue { var id: String { get } func send (message: String ) func receive (message: String ) } class Developer : Collogue { var id: String var qe: QE var pm: PM init (qe: QE , pm: PM ) { self. id = “Developer” self. qe = qe […]

在Swift中使用泛型的13个理由

我决定使用电视节目“ 为什么要使用13种理由 ”撰写一篇有关仿制药的文章,以说明我们如何使用它们,希望您会喜欢! 提醒 Swift中的泛型是为项目编写“泛型”代码的一种方式:是的,但是还有什么呢? 这些通用类型可以用项目中可用的任何其他类型替换,也可以由Swift标准库提供。 它们通常用于创建结构,类或函数。 如果需要,泛型可以受协议约束 ,从而可以更精确地了解泛型。 您已经遇到的最常见的通用类型是Optional 。 您可以使用任何类型并将其设置为Optional,它将起作用。 这是因为Optional使用通用类型(在其定义中声明为Wrapped ),该通用类型允许您在其中放入任何内容。 而且,它可以有选择地帮助您编写更少 , 干净和可重用的代码! 让我们看看如何说明它们的用法。 语境 自由高中的新来学生汉娜·贝克尔 ( Hanna Becker)在未知的情况下自杀身亡。 她的朋友克莱·詹森 ( Clay Jensen)想知道她死亡的所有真相。 在她去世之前,她记录了13个原因 她用录音带传送给她的朋友托尼帕迪拉(Tony Padilla) 。 我们将尝试帮助克莱聆听录音带,并使用基本的Swift泛型原理最终认识他的朋友汉娜的真相。 不用担心,本文没有任何破坏 ! 帮助克莱·詹森 汉娜去世前,克莱曾 在他去学校的路上听音乐。 他拥有一个音乐播放器 ,该音乐播放器可以从CD和USB等多种支持中读取内容。 不幸的是,他的音乐播放器坏了。 由于我们是好人,我们将帮助他让它再次发挥作用。 我们将定义一个枚举AudioType ,它将包含不同类型的可能的支持。 我们还定义了一个名为AudioContent的协议,该协议将保存不同音频支持的属性 : 最后,真相 托尼刚把录音带交给了克莱: Tape类再次符合AudioContent协议,并且还具有title属性。 不幸的是,克莱无法用他的音乐播放器来读取磁带。 每个磁带都有不同的类型,是唯一的,并且由不同的属性组成: 这些自定义磁带是从Tape类继承的 ,因此它们也符合AudioContent协议。 请注意,它们可能还具有一些属性和方法。 克莱决定窃取能够读取任何磁带的托尼帕迪拉的磁带播放器 。 […]

简要介绍iOS应用程序生命周期

iOS应用程序生命周期是一个非常大而复杂的主题。 我将尽力解释它。 下图来自斯坦福大学的iOS编程课程,从我看来,它清楚地表示了应用程序的生命周期。 让我们深入研究它,并尝试了解正在发生的事情以及原因。 实际上,当用户启动一个应用程序,浏览它,将其发送到后台,启动另一个应用程序,从内存中卸载它,应用程序将“消息”发送到应用程序委托类时,您可以从那里捕获并处理它们。 应用程序在不同的生命周期状态中移动,这些状态由其活动级别定义,例如未运行,不活动,活动,后台,已暂停。 关于应用状态的几句话: 未运行-应用尚未启动或系统已将其关闭。 无效-启动之前的应用程序状态。 应用程序正在运行,但正在执行其他操作,尚无法与用户交互一起使用。 活动-在前台运行并与用户合作的应用的正常状态。 应用程序接收事件,更新UI。 背景-背景状态,表明应用程序仍在运行,但用户看不到它的界面。 已暂停-应用程序仍在设备内存中,但是代码未运行。 如果发生内存不足的情况,系统可能会在不通知的情况下终止应用程序。 关于应用程序委托和在不同生命周期状态下调用的方法的几句话: 首先让我指出,应用程序委托是UIApplication对象调用的一组方法,用于响应应用程序生命周期中的重要事件。 它将确保应用程序与系统以及其他应用程序进行预期的交互。cI将指出最重要的应用程序委托方法。 应用程序成功启动启动过程后: 应用程序:willFinishLaunchingWihtOptions 叫做。 这是执行任何代码的第一个机会。 如果启动成功: 应用程序:didFinishLaunchingWithOptions 方法被调用。 同时,应用程序发布通知UIApplicationDidFinishLaunchingNotification。 当应用程序完成启动并准备好显示任何窗口时,将调用此方法,因此这是准备界面的最后机会。 在上图中,这些进程的状态标记为数字1。 申请生效后: applicationDidBecomeActive 叫做。 当您的应用程序从非活动状态转换为活动状态时,将调用此方法。 [箭头2。] 如果用户按下了主页按钮或启动了另一个应用程序: applicationWillResignActive 调用,并发布UIApplicationWillResignActiveNotification。 当应用程序过渡到非活动状态时,将调用此方法。 对于某些类型的临时中断(例如打来的电话或SMS消息),或者当用户退出应用程序并开始过渡到背景状态时,可能会发生这种情况。 您可以在图中的数字3下看到此过程。 进入非活动状态后 applicationDidEnterBackground 被调用,并开始向后台过渡。 在图中,此过程在箭头4下方列出。也许还不清楚,但是我所指的箭头方向是从非活动状态到背景状态。 如果应用程序没有被用户终止或被系统杀死,则可以返回到前台,它是箭头5,与箭头4相反。调用的方法是: applicationWIllEnterForeground 但是该应用未移至活动状态,但仍保持不活动状态。 我要向您介绍的最后一个委托方法: applicationWillTerminate。 当终止事件被触发时,它通知委托。 强制退出应用程序或关闭设备会触发该方法。 这意味着该应用程序将从内存中完全删除。 箭号8。 可能您想知道暂停状态。 我没有透露太多信息,因为应用程序在进入后台模式后正处于这种状态。 这是当应用程序在后台但未运行实际代码时的状态。 […]

RxSwift#2 —可观察的과主题(+中继)알아보기

可观的下载, 可观察的主题 ,RxCocoa 中继的继电器 。 룬룬다룬룬알아 可观察的 Observable이지속적으로이있것을发射이라고다。 1.可观察的生命周期 next 통해1,2,3을可观察 뒤뒤종료된可观察 1,2에러에러종료된 error 를종료된可观察 이전다뤘던정정해보자 next :최신(다음)값을이벤트 error :可观察到的错误 complete :성공적으로이벤트스시퀀이벤트。 可观察的이더상배출하지않음

在iOS中实现3D Touch

当用户选择快速操作时,您的应用程序将启动(如果当前未运行),否则,如果您的应用程序已启动并且处于后台/暂停状态,则您的应用程序将在应用程序委托对象收到快速操作之前被激活消息或通知。 对于任何应用程序,我们最多可以有4个快捷方式操作;如果从应用程序商店下载了第五个名为shareApp的快捷方式,则系统会添加该操作。 我们的应用程序中可以同时包含静态和动态快速操作,但是静态操作比动态操作具有更高的优先级。 因此,如果您的应用具有3个静态操作和3个动态快速操作快捷键,则只会向用户展示一个动态操作以及这3个静态操作。 →开始编码: 要添加快速操作,请在应用程序的Info.plist文件中创建UIApplicationShortcutItems的数组。 该数组的每个元素都是一个字典,其中包含一个快速动作的属性( 例如动作的标题,字幕,图标,动作的类型(快捷方式的唯一标识符) ) 。 按键说明: UIApplicationShortcutItemType:必需的字符串,用于标识您的快速操作。 字符串必须是唯一的且特定于应用程序。 一个好主意是在它的前面加上您的包ID或其他一些应用程序唯一的String。 如果您想使用应用程序包标识符,请使用类似这样的占位符,该占位符为您提供包标识符的路径。 “ $(PRODUCT_BUNDLE_IDENTIFIER)”。 因此,即使将来更改了捆绑包ID,您的应用程序快捷方式也不会生效,也不需要在其他类似位置手动更改捆绑包ID。 UIApplicationShortcutItemTitle:必需的字符串,一旦用户按下应用程序的图标,该字符串就会显示快速操作的标题。 如果您的应用程序已本地化,则可以设置Localized.string文件的String键。 向用户显示了快速操作。 UIApplicationShortcutItemSubtitle:一个可选的字符串,用于显示快速操作的字幕。 字幕也可以本地化为标题。 UIApplicationShortcutItemIconType:可选的字符串,显示由库提供的系统图标。 检查UIApplicationShortcutIcon枚举以查看所有可能的字符串键。 UIApplicationShortcutItemIconFile:可选的字符串,用于显示要从应用程序包中使用的自定义图标图像,或资产目录中图像的名称。 UIApplicationShortcutItemUserInfo:一个词典,其中包含一些您想通过快速操作传递的额外信息。 快速操作会在iOS主屏幕上显示给用户,因此在选择这些选项时,我们需要在我们的应用中进行处理。 处理它们的最佳位置是您的App-elegate类。 在此应用程序中,我为UIApplicationShortcutItemType使用了一个枚举,以避免键入错误。 每当用户在主屏幕上选择快速操作时,在应用程序的App-delegate类中,都会调用application:shortcutItem:completionHandler:方法。 此方法必须使用布尔值调用完成处理程序,这取决于快速操作的成功或失败。 在application:didFinishLaunchingWithOptions:方法中,我们将该值保存到launchShortcutItem中,以便接下来可以处理它。 下一个要调用的方法是applicationDidBecomeActive ,此方法在application:didFinishLaunchingWithOptions:之后启动:在您的应用程序首次启动期间,或者每次用户进入您的应用程序时,该应用程序仍在后台打开。 当用户选择一项快速操作时,该应用将启动或继续。 因此,将在调用performActionForShortcutItem方法之前,调用上述两个方法( application:didFinishLaunchingWithOptions:或applicationDidBecomeActive )中的任何一个。 正如我们上面所讨论的,这是通过使用true或false调用完成操作(Bool)来处理快捷方式操作的必需方法。 在下图中,我为快速操作的快捷方式标识符定义了一个枚举。 我使用此枚举类型来查找用户在handleShortcutItem方法中触发了哪些操作。 在下图中,我们定义了handelShortcutItem方法。 首先,我们检查触发的快捷方式操作的类型是否为nil。 然后得到触发类型。 使用开关盒后,将执行所需的功能。 →动态快捷方式动作:到目前为止,我们已经看到了在应用程序的info.plist文件和然后在AppDelegate类中配置的静态动作。 我们也可以实现动态动作,但是请记住仅显示了4个动作,静态动作的优先级较高。 让我们看看配置动态动作。 在上图中,我通过代码配置了动态操作。 首先,我设置了类型,记住它必须是唯一的并且是必需的,就像在我以应用程序的包标识符作为前缀分配类型之前一样。 然后,我通过API初始化了快捷方式项。 在这一章中,您可以根据需要动态地提供标题和副标题(以及图标)。 最后,我将创建的项目分配给UIApplication的shortcutItems数组。 您可以在需要的地方调用上面的代码段,该代码段已包装在函数中。 […]

我们没想到这一点! 2个月周年纪念日:用户增长166%。 耶!

2周年纪念日带来了出色的成绩和令人惊讶的改善。 书呆子统计 88个总用户:+55个新用户-环比增长166% 282个全屏蔽电子邮件地址:环比增加143个新电子邮件-增加103% 它们看起来似乎很小,但是坐在我们的鞋子里,只计算它们,那真是太好了。 就像小时候在糖果店里逛街一样,还有一些非常好的人……日复一日,日复一日地带糖果。 直言不讳,当我们看到越来越多的用户开始采用ALTER EGO时,我们不知道如何应对日常快乐。 每天早晨都有自己的感叹号: 杜德,你看见了吗? 另外10位用户!!!! 我们今天才2个月大,我们即将提前一个月完成季度目标。 这意味着我们将越来越热情地开发产品,因为我们收到了大家的反馈。 或者也许要花一个月的假期🙂 两周前,我们在DefCamp 7上首次公开亮相(谢谢大家,太好了)。 然后,数字开始飙升。 我们想知道会持续多久,但是在那之前,请享受一些有趣的统计数据。 在工作日,我们的每日活跃用户从4-6稳定增加到23-24。 但是,最能说明我们故事的是我们的服务器。 这是他们日常工作的总计数。 令人惊讶的改进是更强大,更强大的私人Beta 2。 它包括所有用户的地址,公司名称,性别和生日 。 这是它的一些屏幕截图。 该界面仍在大量更新中,将尽快公开。 基于社区反馈的12月计划: –探索可用于激活需要电话号码的服务的虚拟电话号码 。 –为可用于一次性购买的活动虚拟借记卡构建具有成本效益的解决方案。 – 启动我们的OpenID Connect服务器的专用alpha版本 ,我们可以在合作伙伴网站上对其进行beta测试。 进行中,未来几个月: –我们的服务器AI在实验室中运行良好 。 它仍在处理数字,我们需要更高的数据集,但我们能够利用数据力来改善输入字段匹配算法。 – Safari扩展程序再次投入使用,我们计划在明年年初发布,因为我们可能会在Apple批准过程中等待一段时间。 所有这一切都朝着我们的长期目标迈进,那就是在2017年第一季度启动ALTER EGO开发人员平台。 非常感谢! AlterEgo团队