Tag: App Development

如何在没有Mac的情况下自动为iOS签署Flutter应用

对于任何iOS开发人员来说,在将iOS应用安装到物理设备上并通过App Store交付给最终用户之前,都无需对iOS应用签名。 您所需要做的就是一个Apple开发人员帐户,一个有效的签名证书,一个匹配的配置文件……以及一台Mac来生成这些文件。 听起来很麻烦? 从与Stackoverflow上的iOS代码签名相关的问题数量来看,许多开发人员都为此感到困惑。 我们知道,设置代码签名可能会让人头疼,尤其是当您尝试使其在CI / CD环境中工作时,尤其是在为多个平台进行开发时,更是如此,例如Flutter SDK ,并且没有Mac。 但是,等等,我们对所有Flutter开发人员来说都是个好消息! 通过消除常规iOS代码签名过程中所需的某些步骤,Codemagic使整个代码签名业务比以往任何时候都容易。 介绍传统iOS代码签名的替代方法 如果我们告诉您不再需要Mac才能对iOS的Flutter应用进行签名怎么办? 而且,如果您不必担心签名文件又可以让Codemagic免费为您处理所有这些,该怎么办? 这就是我们的意思:Codemagic通过在应用程序内生成签名证书和供应配置文件,为iOS的Flutter应用程序提供自动代码签名,从而允许您在构建过程中对应用程序进行签名并将其发送到App Store。 继续阅读以获取代码签名基础知识和Codemagic的新自动代码签名功能的概述。 了解iOS代码签名的基础 在我们描述Codemagic如何通过为iOS签署Flutter应用来实现其魔力之前,让我们先了解一下iOS代码签名通常需要的内容。 苹果开发人员帐户 。 必须注册Apple Developer Program才能使用TestFlight进行Beta测试或将该应用发布给App Store上的最终用户。 还需要能够请求证书和下载配置文件。 但是,如果您只是在寻找一种可以在真实设备上安装的版本的方法,则可以按照本教程的有关如何在iPhone上部署应用程序而无需注册Apple Developer Program(但您确实需要Mac)。 签名证书 。 证书是一个公钥/私钥对,可用于识别谁开发了代码。 有一个个人开发证书,用于在开发过程中对应用程序进行代码签名,还有(共享的) App Store和Ad Hoc分发证书,用于对应用程序进行代码签名时进行分发。 供应配置文件 。 配给配置文件包含有关应用程序ID,可在其上安装应用程序的设备以及可用于对应用程序进行签名的证书的信息。 与证书一样,有一个开发配置文件,用于在开发过程中对应用程序进行代码签名,并提供分发配置文件(即席或应用商店)进行分发。 更具体地说, Ad Hoc分发配置文件可用于将应用分发给非Testflight测试人员(例如,通过HockeyApp),而您需要使用App Store分发配置文件在TestFlight上进行测试或发布到App Store。 与其他供应配置文件不同,App Store分发配置文件未链接到特定设备。 Mac 。 您需要Mac才能首先从Apple请求证书,然后再生成可以上传到第三方系统的证书文件。 开发Flutter应用程序时并不需要Mac,因此,当您没有可以使用的Mac时,这部分代码签名过程可能会成为问题。 综上所述,您将需要使用开发证书以及开发配置文件来对代码进行签名,并在开发过程中将应用程序安装在实际设备上。 当您计划将应用程序发布给测试人员或将其发布到App Store时,您将需要使用分发证书以及适当的分发设置配置文件。 […]

如何将C库集成到Swift中编写的iOS应用中

如今,每个人都重视隐私和安全性。 这就是为什么最近我们需要在我们的Distillery项目之一上使用加密库的原因。 对于相关项目,已决定使用libsignal 。 libsignal最初是为Signal Private Messenger开发的,在安全专家中享有很高的声誉。 使用libsignal 在2018年7月末,在Pure C , Java和JavaScript中实现了libsignal。 在Objective-C中也有一个称为SignalProtocolKit的实现 ,但那时它已被弃用。 我们的目标是在以Swift编写的iOS应用程序中使用该库。 为了使所有内容保持最新,我们必须使用C语言编写的代码,源代码存储在此处。 幸运的是, Swift可以非常顺畅地与C代码交互,至少因为苹果的一些底层库是用C编写的。 棘手的部分是将库正确添加到项目中。 创建一个module.map 经过一些研究,我发现我可以简单地将库的源代码添加到项目中,并创建一个module.map文件来指定要公开的库头(有关更多信息,请查看此博客)。 libsignal包含许多头文件,但是如果我想在常规C项目中使用它,则只需包含一个称为signal_protocol.h的文件。 由于signal_protocol.h包括它依赖的其他头文件,就像其他每个头文件一样,我们可以确定所有文件都包括在内。 因此,我制作了一个具有以下内容的module.map文件: module SignalProtocol [system] { header “src/signal_protocol.h” export * } 然后,将其放入带有库源代码的文件夹中,将其添加到项目中,然后开始进行测试。 Xcode允许导入此模块并使用某些库函数,但是缺少某些库组件。 例如,我无法使用signal_protocol_internal.h中定义的signal_context数据类型。 在那一刻,很明显Xcode没有正确包含嵌套的头文件。 因此,我决定尝试将来自libsignal的所有标头包含在我的module.map文件中。 (将更新后的module.map放在这里是多余的,因为它只包含与上面的文件类似的每个* .h文件。) 完成此操作并尝试构建以构建项目后,我从libsignal中获得了许多与某些头文件有关的错误。 当我查看它们时,我意识到有些头文件不是实际的头文件。 相反,它们存储一些常数值,并按如下方式使用: static const fe sqrtm1 = { #include “sqrtm1.h” } ; 截至2018年7月底,已使用以下文件: sqrtm1.h […]

我人生中的第一张APP卡

这是我的第一个关于信用卡折扣的应用程序 该项目被使用 Facebook SDK。 GoogleMapSDK。 GooglePlaces API。 FirebaseCloudDatabase 1.此视图可以选择多个折扣 3.显示信息 5.管理您的卡 7.地图 8.可以推送通知 最初于 2018 年1月14日 发布在 medium.com 上。

使用JSON Web令牌(JWT)构建有效的推送通知

Apple推送通知服务(APN)是Apple设备上所有远程通知的主要亮点。 使用APN,开发人员可以利用该服务来建立参与度并将信息传递给iOS平台上的用户,包括tvOS,macOS和watchOS等其他Apple设备。 使用Apple先前对推送通知服务的更新,您可以使用身份验证令牌安全地连接到APN,以通过HTTP / 2 API发送推送,从而免除了维护有效证书和其他相关任务的压力。 该协议使开发人员轻松构建强大的推送通知。 苹果公司新的基于APN的基于令牌的通信还提供了无状态且快速的通信,这比基于证书的通信要快,因为APN不必验证您的证书或任何其他信息。 此外,您不必总是为每个通知生成新的令牌。 此外,您可以将单个令牌与多个服务器一起使用,以向每个应用程序发送通知。 如果您是iOS开发人员,并且希望与APN实现基于令牌的通信,那么可以像以下几个快速步骤来熟练掌握JWT! 有3个步骤可实现此目的: 从会员中心生成签名密钥。 生成JSON身份验证令牌。 发送推送通知。 从会员中心生成签名密钥 您可以将该密钥用于多个应用程序,并且可以在生产和开发服务器上使用。 要创建签名密钥,请登录会员中心,然后单击“ Keys部分中的“ All ”。 单击右上角的+按钮,为您的密钥命名,然后在“密钥服务”部分中选择APN。 单击继续,将生成您的密钥。 记下Key ID然后从下载选项中下载签名密钥(扩展名为.p8)。 将这两条信息都存储在安全的地方。 您将需要它来生成用于身份验证的JSON令牌。 生成JSON身份验证令牌 APN需要JSON Web令牌才能遵循以下格式: 标头 { “ alg”:“ ES256”, “孩子”:“ ABC123DEFG” } 要求 { “ iss”:“ DEF123GHIJ”, “ iat”:1437179036 } alg (Algorithm):加密算法,当前APN仅支持ES256 kid (密钥ID):我们在上一步中生成的10位数字的密钥ID。 iss (发行人):这是一个10位数字的团队ID,可帮助您开发应用程序。 iat (Issed At):生成令牌时从UTC的纪元开始的秒数。 […]

在视图坐标系之间转换框架

知道子视图的确切位置是一种可以在多种情况下派上用场的技术。 您可能想知道用户是否可以看到该视图,从视图的初始位置执行动画或将视图还原到其原始目的地。 有很多用例。 您可能还会想到更多。 但是,当您要执行此操作时,您不能仅仅依赖目标视图的框架,因为它只是其超级视图坐标系的一部分,这很快会引起问题,具体取决于您如何构成视图层次结构。 幸运的是, UIView和NSView都有一些方法可以为我们提供所需的结果。 如果您阅读我的上一篇有关框架如何在macOS上工作的文章,您可能还记得我们曾简要介绍过坐标系。 因此,让我们深入了解如何在不同的坐标系之间转换框架。 现在,我们已经设置了场景,让我们看一下整篇文章所涉及的方法, convert(CGRect,to:UIView?)方法。 如果我们检查从访问视图框架中获得的值。 它是视图坐标空间内的正确值,但是当尝试在扩展到视图坐标空间外部的上下文中组合这些类型的值时,这并不能使其普遍正确。 我们要实现的是知道视图在屏幕上的确切位置,而不是子视图内的位置。 因此,通过传递当前帧并将其指向所需的坐标空间,我们现在可以获得所需的测量值。 您可以切换到任何您喜欢的坐标系。 我选择了过去与我最相关的窗口。 在实现中执行此操作时,访问视图的窗口很简单。 所有UIView都有对其所属窗口的可选引用,如果该值为nil,则表示该视图尚未添加到窗口中。 附带说明,这只是冰山一角。 这些方法中有更多的是采用点而不是框架。 请查看UICoordinateSpace以获取更多信息。 https://developer.apple.com/documentation/uikit/uicoordinatespace 这些方法在UIWindow上也可用的原因是它继承自UIView ,后者又符合UICoordinateSpace 。 如您所见,这是直接但功能强大的,但是macOS呢? 让我们看一下带有一些macOS代码的另一个示例。 该技术本身以及转换时的结果保持不变。 这两个示例之间唯一明显的区别是,它使用NSView表示窗口。 原因是NSWindow不符合PlaygroundLiveViewable 。 即使这看起来很虚伪,但在思考如何解决特定情况时,该技术也具有巨大的价值。 我在优化滚动视图和集合视图的滚动性能时都使用了此方法,如果该视图在屏幕上不可见,则不执行布局操作。 我还使用了这些类型的值来定义核心动画的开始和结束位置。 我相信您可以提出更多方案,关键是要知道该技术可以扩展您的工具箱,并且您获得的工具箱越大,找到问题的最佳解决方案就越自然。 希望您觉得这有用,对我而言,这已经无数次挽救了生命。

如何在macOS上编写没有界面构建器的NSViewController。

在上一篇文章中,我写过关于在Cocoa中为常规NSView设置背景色的信息。 因此,要想打个比方 ,我想分享如何制作NSViewController而不使用笔尖/ xib或情节提要。 这似乎是一件微不足道的任务,确实如此。 但是,在没有先验知识的情况下,您可能会很快发现一个基本的陷阱。 让我们在旅途中展示这个节目,看看一些代码。 就像上一篇文章一样,我将分享如何在iOS中完成此操作。 在这里,我们有一个名为MyViewController的NSViewController子类。 空视图控制器在这里没有什么特别有趣的。 非常简单! 让我们为macOS尝试相同的示例,看看会发生什么。 看起来一样,应该表现得一样吗? 好吧,也许有人会假定,但是,这会给您以下日志消息: -[NSNib _initWithNibNamed:bundle:options:]无法加载捆绑中的nibName:Apex.ViewController(空)。 就像消息中所述,您的视图控制器无法加载,导致其无法显示。 其原因是寻找显然不存在的nib文件。 由于接口构建器已深度集成到Cocoa的体系结构中,因此笔尖是macOS中的默认设置。 这意味着您必须做一些额外的工作才能使其正常工作。 幸运的是,它涉及的更改很少。 这里缺少的是视图控制器视图,要修复它,我们需要实现loadView方法。 因此,让我们看另一个示例,其中我们有一个不使用接口生成器的有效NSViewController实现。 就是这样,您现在可以在不使用NIB的情况下创建视图控制器。 编码愉快!

滚动浏览过去,现在和未来的一切历史

呼吁所有历史和科学爱好者对简单但互动的艺术表示赞赏:今天的本周应用适合您。 2Dimensions是一家开发用于应用程序或游戏设计的一流动画工具的公司。 他们以在《孤儿》,《科瓦》和《颤抖的热装》中令人叹为观止的视觉效果而著称,他们继续证明,他们慷慨的资源贡献在于完美的交付。 Kurzesagt对我们宇宙的错综复杂的YouTube叙述启发了2Dimensions设计和开发一个应用程序,该应用程序允许用户探索不同的时间段或重大历史事件。 经过几个阶段的集中设计和开发,他们提出了一个虚拟的时间轴应用程序,该应用程序通过交互式图形和优雅的滚动机制而得到进一步的区分。 万物历程(History of Everything)是一个2D应用程序,可显示广阔的宇宙时间线,归档从“大爆炸”到历史里程碑到所有空间和生存尽头的事件(如果您曾经病态好奇)。 滚动浏览所有时代,了解您选择的任何主题-该应用程序将成为您的导航指南。 将手指按在屏幕上以引起Amelia Earheart的注意,在苹果树上滑动以展示牛顿的重力理论,并通过对它们的每个描述来了解有关其位置和时间的更多信息。 这是教育和娱乐的简单但精妙的结合。 目前,iOS和Google Play上免费提供所有内容的历史记录。 它的开发人员也足够慷慨地在GitHub上共享应用程序的代码,以防任何冒险的开发人员想要进入沙盒并进行实验! 如果您想重温中生代时代或观看我们的太阳渐渐暗淡成红色巨人,请下载《万物史》,并以前所未有的方式发现宇宙。

一个新的应用程序

最近我一直不安。 通常,我一直在寻找一种途径来传播我的创造力。 因此,在过去的几周中,我一直在思考我可以创建的应用程序的想法。 我希望这段旅程能帮助我提高编程技能。 我将在博客中记录我的进展,希望可以与其他志趣相投的开发人员建立联系。 工具类 Xcode 9和Swift 4用于前端开发 MindNode集思广益 Evernote做笔记 Todoist用于任务跟踪 后端的Node.js 数据库仍然是一个问号 用于后端开发的Atom GitHub用于源代码控制 对我而言,开始使用Node.js非常容易。 虽然学习曲线绝对是选择技术时要考虑的重要方面,但我担心我最终会被JavaScript的泥潭所困扰。 (#sorrynotsorry) 第一步 第一步是让我在Node.js上运行API,并将其连接到我的客户端应用程序。 在获得了选择了正确技术的概念证明之后,我将开始手工进行一些接线。 想帮忙吗? 该应用程序将围绕目标设定。 我希望收集有关人们为自己设定的目标的信息。 请留下您自己设定的目标类型的评论。

创建路由应用程序覆盖文件

因此,您是一个应用程序开发人员,而您刚刚制作了一个为用户提供点对点驾驶说明的应用程序,将该应用程序提交给商店,并遇到了绊脚石。 没有提供路由应用程序覆盖文件。 如果您注册为路由应用程序,则必须在App Store Connect中上传路由应用程序覆盖文件。 将生成的geojson文件上传到“ 常规应用信息”下的“ 路由应用覆盖文件”位置。 重新提交您的应用程序,您应该参加比赛。

你好! 我是亚历克西斯。 –亚历克西斯·埃利奥特(Alexis Elliott)

你好! 我是亚历克西斯。 我目前正在学习使用Swift编写iOS应用程序代码。 要学习Swift语言,我正在跟踪一些Udemy的介绍。 我的长期目标是能够成为一名应用程序开发人员。 不一定只有iOS应用程序,这只是一个起点。 我是妈妈,妻子,而且我全职工作,因此显然有时候可能会有些挑战。 有时候,我没有动力,因此对从事这个职业感到很兴奋。 我感觉自己在家中工作,拥有数百种成功的应用程序,可以清晰地看到我的未来。 其他时候,我非常沮丧。 感觉就像在1,000,000英里之外。 仅仅能够开发一个应用程序所花费的时间和精力的步骤有时似乎是极其巨大的。 但是最终,我内心深处知道我打算这样做。 我知道这一点是因为无论我感到多么害怕,不值得,或者绝对确定自己将要失败,我都不想放弃。 我愿意为此失败。 我知道对于大多数人来说这听起来很奇怪。 但是任何成功的人都知道失败是成功的重要组成部分。 我愿意制作100个失败的应用程序,而只是制作一个成功的应用程序。 这就是我知道我注定要成为应用程序开发人员的方式。 不要误会我的意思。 失败的想法吓坏了我,但我学会了生活在爱与信任的地方,而不是恐惧的地方。 因此,我决定创建一个博客,跟踪我的进度,追究我的责任,并保持动力。 我的结论真的很糟糕。 凯再见👋🏽