啤酒统计:啤酒评级应用

通过CQLer Weston Miller 办公文化的精髓 真实地说,没有人真正喜欢南瓜啤酒。 但这并不能阻止Cognizant Quick Left举办年度南瓜啤酒大赛。 每年的10月,CQL每月的欢乐时光都专门用于此。 在过去的几年中,CQL团队将提交啤酒或苹果酒供团队选择。 每个人都将对最佳和最差的啤酒进行投票,然后在干擦板上将每种饮料的等级从1提高到10。 尽管此策略足够了,但在CQL,我们以谋生为目的构建Web应用程序。 话虽如此,我自己和另一位开发人员都觉得有更好的方法来了解啤酒品尝经验以及对啤酒进行排名的过程。 啤酒统计 我们决定编写一个本地iOS啤酒评级应用程序。 作为一个团队,我们在构建应用程序时配对编程。 如果您不熟悉结对编程,那么它实质上是一种编写代码的方法,开发团队可以使用该方法更有效地构建软件。 一台计算机上驻有两个程序员,该计算机具有两个监视器,两个键盘和两个鼠标。 通常有一个“驾驶员”,即大部分打字工作的人,以及一个“导航者”,其是审查代码并告知驾驶员是否犯错的人,就像后座驾驶员。 导航员还是在团队陷入困境时研究问题的人。 这些角色在开发时经常切换。 在开发Brew-tally时,我们中的一个专注于构建iOS应用,而另一个专注于编写服务器和设计用于显示最终数据点的界面。 该应用程序非常简单。 它包括一个tableViewController,它显示了所有啤酒,并允许用户选择它们,在1到10之间对其评分并提交评分。 该应用使用Socket.io实时更新评级。 酿酒服务器 该服务器是用NodeJS和Express编写的。 它使用mongoDB和MongooseJS作为数据库。 该服务器符合RESTful标准,并且端点具有/beers/ , /beers/{beerId}/reviews/ POST方法,以及具有/beers/, /beers/{beerId}, /beers/{beerId}/reviews/ GET方法。 /beers/, /beers/{beerId}, /beers/{beerId}/reviews/和/beers/{beerId}/reviews/{reviewId} 。 由于我们只有大约一周的时间来开发应用程序,因此我们没有时间设置任何PUTS或DELETES尽管这可能会在将来实现。 我们还编写了移动优先的Web应用进行测试。 电视转盘 最终的评分界面是用Polymer / WebComponents编写的。 我们选择了这种“框架”,以便我们可以在一周内快速开发该应用程序。 界面实质上是一个“卡片”轮播,其中包含每个啤酒瓶的图像。 为了使人们在投票时保持诚实,我们将啤酒的评级隐藏到比赛结束之前,以使人们保持诚实,因为在提交啤酒时显示其评级可能会影响评论。 我们对事件应在服务器中结束的时间进行了硬编码。 活动结束后,该应用将显示评分最高的前三名啤酒。 分发iOS应用 为了分发Brew-tally,我们使用Apple的TestFlight程序进行Beta测试。 我们没有太多时间来获得Apple的批准,因此使用TestFlight可以使我们增加许多用户作为内部测试人员。 这使团队成员可以轻松地通过TestFlight下载该应用程序。 我们还为没有iPhone的用户提供了一个网络版本,允许所有成员参加。 […]

simctl:从命令行控制iOS模拟器

在开发iOS应用程序时,模拟器是开发人员的最好朋友。 这是在开发过程中测试应用程序的快速简便的方法,因为我们可以使用GUI与iOS模拟器进行交互。 苹果公司关于模拟器入门的文档很棒,我们几乎可以通过使用图形用户界面来学习有关控制模拟器的所有知识。 尽管模拟器很容易与GUI一起使用,但是脚本模拟器交互要在Continuous Integration服务器上运行有点痛苦。 幸运的是,Apple有一个不错的命令行实用程序,名为“ simctl”。 在本文中,让我们看看如何使用’simctl’与iOS模拟器进行交互。 我们将介绍以下内容 创建,删除和引导模拟器 将照片和视频添加到模拟器 在模拟器中安装/卸载,启动/终止应用程序 捕获截图并录制模拟器视频 收集模拟器日志和其他技巧 simctl Apple具有“ simctl”二进制文件,可从命令行与iOS模拟器进行交互。 它与Android的adb非常相似。 再次,这是Apple记录不足的另一个实用程序,但是我们可以在/Applications/Xcode.app/Contents/Developer/usr/bin/simctl中找到二进制文件,并将其与xcrun实用程序一起使用。 我们可以使用help命令访问所有可用选项 $ xcrun simctl帮助 我们可以使用’simctl’在iOS模拟器上执行各种操作,包括创建新模拟器,擦除模拟器,在模拟器内部安装应用,向模拟器添加照片/视频等等。 让我们详细研究其中的几个。 列出所有可用的模拟器 我们可以使用命令轻松列出所有可用的模拟器 $ xcrun simctl列表 该命令将列出运行时所有可用的模拟器。 如果已经在运行,它还将显示“已启动”模拟器。 在模拟器上的CRUD操作 我们可以使用simctl创建,擦除,删除,引导,关闭和升级模拟器。 创建 我们可以使用命令在现有的iPhone7(iOS 10.3)模拟器之上轻松创建名为“ My-iPhone7”的新模拟器。 $ xcrun simctl创建My-iphone7 com.apple.CoreSimulator.SimDeviceType.iPhone-7 com.apple.CoreSimulator.SimRuntime.iOS-10-3 我们可以看到使用列表选项新创建的模拟器,并且拥有模拟器’C86A559A-1F50–40D1–8D84–954EDFBBCE18’的UUID 关机/擦除/启动 正如我们已经看到的那样,已经启动了另一个模拟器,让我们关闭它并擦除其内容。 这里的顺序很重要,我们不能在引导状态下擦除模拟器,我们需要先关闭然后再擦除。 $ xcrun simctl关闭C8C050F3–062D-4444-A888-BBEC783E31BD $ xcrun simctl擦除C8C050F3–062D-4444-A888-BBEC783E31BD 开机 现在,让我们使用新的UUID引导新创建的模拟器 […]

Xcode 10的惊人和新功能

最近,Apple在WWDC 2018上发布了Xcode10。Xcode10比其最初发布的版本要好得多,永远不要低估内部应用程序的更改以真正影响开发生命周期。 如果您熟悉Xcode 9,将会看到巨大的变化。 Xcode 10中进行了一些令人难以置信的更改,这些更改将使您的代码比以往任何时候都更易于原型设计。 首先,让我们讨论“ 什么是Xcode ?” Xcode是用于为Apple Watch,Apple TV,iPad,iPhone和Mac制作应用程序的整个开发人员工具集。 Xcode开发将Simulator,Instruments分析工具和OS结构捆绑为tvOS SDK,watchOS SDK,iOS SDK和macOS SDK。 让我们讨论Xcode 10的惊人功能 NSGridView设计工具: 有一个惊人的新设计工具可用于布置矩阵视图。 它可以极大地帮助我们记住在Numbers(Apple iWorks)中使用电子表格的方式,您可以四处拖动以添加/删除行和列以及编辑其他详细信息。 资产目录: 在macOS 10.14或更高版本上通过亮,暗和高对比度外观支持不同的图像和颜色资源。 •支持CarPlay资源。 •支持ARKit 3D ARReferenceObject资源。 •资产目录和视图调试器的背景可以明确设置为浅色或深色,因此正面元素的显示差异很大。 支持的配置: 考虑任何新功能的主要因素将是完美的平台。 同样,这是Xcode 10轻松工作所需的设置。 最初需要运行MacOS 10.13.4或更高版本的Mac。 在Xcode 10中进行测试: Xcode 10有助于领导并发和并行测试,从而减少了独立运行测试的机会。 诚然,并行测试对macOS单元测试以及iOS和tvOS单元和UI测试也有很大帮助。 在源代码编辑器中进行更改: 当前,可以想到的是利用多光标进行编辑,目的是您可以快速更改不同的代码范围而不会稍有延迟。 构建系统: Xcode 10中的新构建系统增强了可靠性和构建性能。 该框架可以识别遗留构建系统忽略(忽略)的项目配置问题。 通过在“文件”>“项目/工作区设置”表中选择系统设置,开发人员可以更改为Xcode 10中的旧版构建系统。 关于: Binary Informatics是一家离岸开发公司,总部位于印度诺伊达,在美国海湾地区也设有开发办事处。 我们是一个由60人组成的团队,我们始终致力于为客户提供高质量的工作。 我们提供以下方面的解决方案:网站开发,Web应用程序开发,产品开发, […]

TaleAStory-故事改写

媒体工具包 啊,欢迎…谢谢您看一下我们的媒体资料🙂 在向您展示所有很棒的东西之前,请接受这张独角兽恐龙的图画,作为对我们赞赏的象征。 他的名字叫Dragon McDragonface,无论您是否覆盖我们,都可以保留他。 不,这不是贿赂! (他爱你) 前奏-为什么我们要重塑故事? 通过故事,我们传达了几代人的意义,智慧和知识。 这是我们娱乐自己的媒介。 我们将其用作表达,教育和艺术的一种形式。 讲故事是每个人分享的一种固有的社会素质。 这是我们的DNA。 作为一个物种,我们沉迷于故事。 即使身体入睡,大脑也会整夜保持睡眠,讲述自己的故事。 —乔纳森·戈特绍尔 我们相信每个人都有一个故事可以讲。 借助TaleAStory,我们希望使故事的创建过程像故事本身一样轻松,有趣和引人入胜。 通过这样做,我们希望说服最不情愿的作家前来与世界分享他们的创作故事。 我们迫不及待想一起阅读人们会想到的所有原始,疯狂和令人兴奋的故事! 🙂 第1章-什么是故事故事? TaleAStory可以说是专门为讲故事的人而设计的文字游戏。 它的核心是为那些喜欢通过语言表达和探索他们的想象力和创造力的人提供的工具。 该应用程序使您和您的朋友可以一起编写短篇小说,从“一次”开始。 每个作者每个动作最多可以写260个字符,并见证故事的发展。 这样的故事可能是因为海豹6队时光​​倒流与罗马帝国作战,也可能是太空维京人试图从敌对的神奇宝贝入侵中拯救自己的星球。 这是您的故事,您可以决定冒险将带您到何处。 你的想象力是唯一的限制。 故事完成后,您可以将其发布并与您的朋友和全世界分享。 令人兴奋的是🙂 但是,等等……还有更多! 我们决定将游戏体验进行游戏化,而不仅仅是创建一个简单地讲故事的应用程序。 这是这样的: 硬币:使用奖励词,快速回答并做出原创,有创意和详尽的回复来赚取硬币 。 助推器:使用您的硬币在商店里购买助推器 。 使用助推器与您的朋友 战斗并获得优势。 窃取硬币,跳过转弯等等。 获胜者: 48个故事之后,故事结束了。 故事末尾硬币最多的人获胜 。 我们设计了TaleAStory,因此它既可以用于娱乐目的,也可以用于教育目的(学习10种语言中的1种)。 此外,如果您愿意,可以将您的故事提交给日益增长的各种挑战,如果幸运的话,可以将其纳入我们即将推出的电子书系列的一部分。 第2章-谁创造了TaleAStory? 资格证书:我们是所谓的病毒性攻击背后的家伙,称为Pooductive。 这是我们的第一个应用程序,并在英国,德国,法国和澳大利亚,爱尔兰和荷兰等国际电视上播放。 诸如《卫报》,《混搭》,《有线》,《赫芬顿邮报》,《副刊》和《每日邮报》等许多媒体都对此进行了报道。 此外,Pooductive病毒式传播取得了成功,因此与联合国水机制建立了伙伴关系,以帮助提高人们对改善发展中国家卫生状况的认识。 关于创始人:我的名字叫里卡多·格鲁伯。 我和我的联合创始人Rusmin Causevic共同承担了开始我们第二个也是后来最雄心勃勃的项目的责任。 […]

核心数据和并发性:

记住这一点: “切勿在线程之间共享托管对象上下文。 这是一条硬规则,你不应该打破。” “ 并发性是同时处理多个队列上的数据的能力。 ” 如果不了解多线程应用程序中的场景和用例,则对核心数据概念的了解将是不完整的。 老实说,Apple文档没有以简单的方式解释这些用例。 让我们从基础开始: 考虑以下两个问题: 如果从不同的线程访问相同的管理对象上下文,会发生什么情况? 如果将托管对象从后台线程传递到主线程会怎样? Apple文档非常清楚Core数据希望在单线程上运行 ,而不必是主线程。 核心数据并非旨在从不同的线程访问。 但是,苹果公司的核心数据团队并不幼稚。 它知道需要从多个线程访问持久性框架。 单个线程(主线程)可能适合许多应用程序。 更复杂的应用程序需要一个健壮的多线程持久性框架。 在多线程应用程序中访问核心数据的基本规则: 托管对象: NSManagedObject 实例绝不能从一个线程传递到另一个线程。 如果需要将托管对象从一个线程传递到另一个线程,请使用托管对象的 objectID 属性。 objectID 属性的类型为 NSManagedObjectID 并且唯一标识持久性存储中的记录。 当您将其交给NSManagedObjectID实例时,托管对象上下文知道该怎么做。 您需要了解三种方法: object(with:) existingObject(with:) registeredObject(for:) 第一个方法 object(with:) 返回与 NSManagedObjectID 实例 相对应的托管对象 。 如果托管对象上下文中没有该对象标识符的托管对象,它将询问持久性存储协调器。 此方法始终返回一个托管对象。 知道 如果找不到接收到的对象标识符的记录 ,则 object(with:) 会引发异常。 例如,如果应用程序删除了与对象标识符相对应的记录,则Core Data无法将您的应用程序交给相应的记录。 结果是一个例外。 existingObject(with:) 方法的行为类似。 主要区别在于,如果该方法无法获取与对象标识符相对应的托管对象,则该方法将引发错误。 […]

为什么我们使用KIF-Quick进行用户界面测试

作者:软件工程师Paul Zabelin 在DoorDash,我们的工程团队正在不断开发新代码,以改善iOS上的用户界面(UI)。 最近,我们开发了自己独特的测试系统,该系统将名为“保持功能正常”的框架与行为驱动的开发框架Quick结合在一起。 我们已经看到,我们的KIF-Quick系统提供了最好的测试结果,并自豪地宣布它是一个开源项目,因此我们鼓励其他人看看并尝试一下。 为了深入研究,出于多种原因,我们选择使用“保持功能正常”或KIF进行测试,但其中一个与众不同-可靠性。 我们需要能够相信测试是100%准确的,每次测试通过或失败。 KIF还可以快速,轻松地进行测试,这是该框架的主要吸引力。 关键是测试不会花费太多时间来运行,同时仍能提供可靠的结果。 同时,我们还使用Swift开发和编写单元测试,并使用Quick和Nimble框架提供帮助。 对于更多上下文,Quick是受RSpec启发的Swift行为驱动开发(BDD)框架。 我们之所以选择使用Quick,是因为它的组织性使其更易于阅读,这有助于简化测试代码。 使用Quick进行我们的iOS UI测试可以为工程师提供更多具有嵌套上下文的可读性规范。 另外,当在开发之外共享使用我们领域特定语言的单元测试时,我们的UI测试甚至可以从BDD样式中受益。 这就是为什么在DoorDash中我们选择将两者结合使用的原因。 KIF-Quick的易用性和可靠的结果为我们提供了UI测试的最佳体验和结果-毕竟,他们说“您的代码仅与您的测试一样好” 例子 下面比较两个用于应用登录的测试示例。 第一个示例使用KIF-Quick,另一个示例显示常规XCTest。 在Swift中使用Quick BDD语法的KIF Spec Objective-C中的KIF测试 从上面的两个示例中可以看到,第一个示例(使用KIF-Quick)提供了更具可读性的语法,这在组织多个上下文时特别有用。 如果您想了解更多信息,请在此处查看KIF-Quick,希望您发现它与我们的测试一样有益。

iPhone X:第一个真正的@ 3x设备

传闻已久的iPhone X正式亮相,并附带了一系列令人印象深刻的规格洗衣清单。 不过,最有趣的事情之一是新的5.8英寸“ Super-Retina ”显示屏。 屏幕分辨率为1125px×2436px。 这是一个特别有趣的分辨率选择,因为根据苹果公司的《人机界面指南》,它是@ 3x屏幕,具有有效的375 x 812视点可视屏幕。 基本上,这对用户而言意味着他们将获得与iPhone 6尺寸的设备相同的内容,只是屏幕高度增加了20%,分辨率从@ 2x变为@ 3x。 您可能正在考虑苹果的iPhone plus(6 +,6S +,7 +,8 +)系列手机怎么样? 那些已经是@ 3x设备多年的“ 真实 ”设备了吧? 好吧,不完全是。 继Paintcode应用程序的“ iPhone分辨率最终指南 ”(已更新为包括新的iPhone X)之后,6 Plus的有效分辨率为@ 3倍,而不是对其进行下采样以适合屏幕上的物理像素。 对于用户而言,这意味着这是他们第一个真正在屏幕上真正看到@ 3x元素完整视觉保真度的设备。 对于开发人员而言,这意味着现在是使用@ 3x支持潮流的好时机。 尽管您已经准备好支持iPhone X的全部显示功能,但您可能已经提供了@ 2x和@ 3x版本的资产。 对于平面/简单矢量资产,建议将它们作为PDF引入Xcode,并让Xcode为您将其缩放为1x / 2x / 3x资产。 从Xcode 9开始,这比以往任何时候都更容易使用,因为有一个用于保存矢量数据的新选项。 这意味着它不仅可以处理针对不同设备的扩展,而且可以在不损失质量的情况下对资产进行放大或缩小。 要利用此新功能,可以按照本指南进行操作。 在过去的几年中,iPhone X与苹果的战略大相径庭,后者通过对其旗舰设备进行最少的设计更改来提供迭代改进。 您对在未来的应用中支持此设备有何想法?

DO iOS University ’18的3个重点

几周前,我参加了由CocoaHeadsNL主办的今年在阿姆斯特丹举行的DO iOS会议的第一天。 这也被称为“大学时代”,这是丹尼尔·斯坦伯格(Dim Sum Thought)的作者,培训师和开发人员丹尼尔·斯坦伯格(Daniel Steinberg)在函数编程方面进行的实验性研讨会,在剧透警告时,他是一位出色的演讲者。 Daniel在iOS方面具有深厚的背景,并且对函数式编程非常熟悉。 (很酷的事实:在成为开发人员之前,他曾经是数学教授。) 粗略地说,会议包括一些很简单的东西,一些是中间的东西,有些是某种魔术。 在此博客中,我将分享精彩集锦,以及当天的一些最佳提示,技巧和提示。 *要阅读我们在DO iOS系列文章的第2部分,请单击此处。 首先:函数编程的一些很酷的功能,例如将函数链接到先前函数的结果。 信不信由你,下图是一个包含多次执行“ F”的闭合结构的结构。 之所以有效,是因为每个函数都返回该结构本身的实例。 真好! 该变量称为“ f”,它是名为Picture的结构的一个实例,其中包含一个作为属性的闭包(闭包绘制一个“ F”)。 实际上,只需调用f即可创建第一张图片,如下所示: F 相反,第二个是通过调用: f.quad(空白,f.rotate(),f).quadFlip().quadRotate().quadRotate() 这里的关键是每个函数( rotate() , quadFlip()和quadRotate()返回Picture的实例,从而允许您以功能性方式运行更多转换。 接下来,我们讨论了Swift中几个比较基本的功能编程函数,例如.sorted() .split()或.map() 。 一些创建Swift的开发人员具有此类编程的背景,因此这是今天值得欢迎的补充。 小组中的几乎每个人以前都曾经听说过这些功能,或者曾经使用过这些功能-但是即使如此,Daniel仍可以向我们展示如何使用它们的原始方法。 例如:为了弄清楚句子“ 我看见的是猫吗? ”是回文(向后读取与向后读取相同),您可以编写一个循环以将第一句话的第一个字母与第二句话的最后一个字母进行比较(在小写并删除标点符号之后)。 如果您可以正常工作,则可以执行以下操作: zip(string,string.reversed()).map(==).reduce(true){(累加器&&元素中的(累加器,元素)} 我们还手动实现了一个map函数,以查看引擎盖下发生的事情,这既简单又酷。 在对其进行抽象之后,Daniel遵循了以下建议: “编写抽象时,应从具体到抽象。” 咖啡-还是茶歇! (我是每个办公室都有一个茶人)。 让我们提高水平! 休息后,我们练习实现自定义集。 但是,此集只存储一个包含闭包的变量,而不是存储值。 它看起来像这样: struct MySet {让包含:(T)-> Bool} 要点: 为变量选择一个好名字 。 Daniel甚至开玩笑说MySet有多糟糕,他说:“您应该与团队进行命名讨论。” […]

Buildkite和Fastlane-iOS开发人员改善睡眠的关键

在开始构建Tink应用程序的Swift版本之前,我们没有这些限制。 大多数开发人员在开始新项目时,都有他们想要实现的抱负和目标。 干净的代码。 没有警告。 良好的测试覆盖率。 主分支应始终建立。 我们实现这一目标的一种方法是建立一个持续集成和持续交付系统。 在开始对此进行讨论时,我们研究了可以使用的选项。 我们通常找到两个选项-托管和自托管解决方案。 借助托管服务(例如Circle,Bitrise),我们发现我们不得不移交对GitHub存储库的过多访问权限。 由于我们的应用程序可以处理数十万客户的财务数据,因此安全性至关重要,我们宁愿不这样做。 在阅读我们的工程博客时,您可能会注意到,我们在安全性方面非常重要。 这是我们和我们客户的财务风险。 我们选择使用自托管解决方案。 Tink的其他团队已经将Buildkite用于其CI / CD需求,因此,很显然,从长远来看,使用相同的系统对我们也将有所帮助。 建立,使用和修复可能发生的任何问题的知识已经在建筑物中了。 我们只需要点击它。 建筑风筝 我们在办公室中发现了一个旧的15英寸MacBook Pro,它的机身凹陷,视频卡出现故障以及古老的规格。它很快成为我们的第一台构建机器。当我们将笔记本电脑升级到新的USB-C MacBook Pro时,第二台旧的MacBook Pro成为了也可用-我们的第二个构建机器。 设置我们的构建机器非常容易,只需九步。 这些处理使我们的构建在机器上运行的设置过程。 我们还有其他设置机器的步骤,例如设置File Vault,在此不再赘述。 我们的服务器机房目前容纳我们的两台构建机器。 重要的是Trigger a build on all the lanes on the new build machine.突出显示“ Trigger a build on all the lanes on the new build machine. 这样,build文件夹是由Buildkite创建的,我们可以将带有秘密的keys文件复制到其中。

关于我在中国的iOS App下载情况有些奇怪

我在中国有两次免费的iOS App下载,现在发生了一件非常奇怪的事情。 例如,自2017年8月17日以来,下载量已增长1000%,此后,下载速度几乎相同,即使它们都是英文的,也迎合了不同的受众。 根据记录,它们都是相当缺乏市场预算的利基应用程序,因此在全球范围内,下载率一直很低,每天只有1或2个,如果您愿意的话,“算是噪音很大”。 这两个应用程序均未本地化,因此主要在以英语为主要语言的国家/地区下载它们。 这两个应用程序的会话计数都非常低,并且不存在应用程序内购买率。 这两个应用都不会展示广告。 一个应用程序,《海象》知道什么:野兽能量指南-免费!是关于动物图腾的。 另一个应用程序是《牧师的鼓手笑话和名人音乐家猜谜游戏》,它很好地讲述了鼓手笑话和猜测名人音乐家的名字。 这两个应用程序没有什么不同。 我并不是要插入它们,而是要指出有人(或某事)以相对于整个应用可用时间惊人的高速率下载了这两个应用(分别在2013年和2014年左右)在中国,原因我未知。 今年早些时候,我注意到Drummer Jokes应用程序的下载量从每天1-2增长到每天约20,从5月20日左右开始(这是4月至7月的3个月): 当时我并没有考虑太多。 也许在中国的英语课堂上,有人建议将该应用下载给学生或其他用户,但该应用一直持续到8月中旬,因此开始显得有些奇怪。 然后,从8月17日开始,下载量突然又增加到每天50-60次(这是8月): 奇怪的是,在同一天,我的另一个免费应用程序“海象知道免费”从每天1-2的速度增加到与鼓手笑话应用程序几乎相同的下载水平,每天50到60: 请注意,它们在8月25日当天的下载量也达到了峰值,分别在110和115左右。而且,这完全是通过中国应用商店进行的,没有其他国家/地区的商店显示下载量有所增加(Walrus应用): 中国是8月总下载量的93%,自8月17日以来为95%。 这根本没有道理 如果我们深入研究App Store产品的页面浏览量(例如Walrus应用程序),就会发现它们在8月份保持不变,因此页面浏览量与下载量增长之间没有任何关联,这完全不是因为字词-口外(这很好)或广告(我不为这些应用程序做): 设备会话类似地保持不变。 应用内购买也没有任何变化。 为了进行比较,我的其他四个付费应用程序享有与以前相同的下载率。 在iTunes中,我将商店更改为中国,并查看了我的应用程序,但没有看到任何新的应用程序评级。 而且,根据AppFigures的统计,即使下载量有所增加,这些应用程序的类别甚至都没有进入前400名。 那么,这是怎么回事? 如果您有免费的应用程序,您是否注意到中国的下载量增加了? 2017年10月更新 该问题似乎已在9月29日至30日左右纠正。 下载量从每天60–70下降到每天5–10。