如何以.p12文件的形式获取Apple Push Notification Service证书,以便将其转换为.pem文件

如果有任何编写地狱的经验会使我烦恼和写作,那么我想这将是一个荒唐的过程,并且会产生大量无益的Google结果……例如为我的Rails以正确的文件类型创建Apple Push Notification Service证书+ iOS项目。 (此过程需要macOS。) TL; DR:使用macOS的钥匙串访问权限创建证书签名请求,将其上传到Apple,下载生成的.cer,将其添加到钥匙串,将.cer从钥匙串中导出为.p12,然后使用Terminal转换.p12到一个.pem文件中。 *哇!* 创建证书签名请求 打开“钥匙串访问”,然后在菜单栏中选择“钥匙串访问”>“证书助手”>“从证书颁发机构请求证书”。 选择此选项将弹出“证书助手”窗口。 输入与您的Apple Developer帐户关联的Apple ID,您的姓名,并将最终选项更改为“ Saved to disk”。 单击“继续”将允许您命名证书申请并选择想要保存证书的文件夹。 单击“保存”后,您应该在选定的目标文件夹中找到一个名为CertificateSigningRequest.certSigningRequest的文件。 下一步,我们将其上传到Apple。 下载您的.cer 登录到Apple Developer帐户后,系统会显示帐户概述。 幸运的是,正确的选择是放在最前面和最中心:单击“证书,标识符和配置文件”。 这将带您到将要管理iOS证书的区域。 您会在屏幕左侧找到相关的菜单选项。 此菜单包括一个UX陷阱,使我花了数小时徒劳无果。 在“证书”类别下,您会找到“ APNs身份验证密钥”。单词“ certificate”和“ APNS”可能会导致您得出以下结论:您应该单击“ APNs身份验证密钥”按钮才能创建APNS证书。 ,但是您会错的。 可怕的,可怕的错误。 并且拥有一个无用的(无论出于我们的目的,无论如何).p8文件。 取而代之的是,您将忽略您的直觉,转到下一个类别“标识符”,然后单击“应用程序ID”。这将向您显示与帐户相关联的所有应用程序包ID的列表。 选择将用于APNS的应用程序,然后将展开“应用程序服务”列表。 向下滚动并单击“编辑”。 这将带您进入一个页面,该页面允许您设置和配置应用程序服务。 向下滚动,直到看到标有“推送通知”的服务。 我已经启用了推送通知并创建了两个证书,所以您的屏幕可能看起来有些不同。 单击复选框以启用“推送通知”(如果尚未启用),然后(取决于您要创建开发证书还是生产证书),单击“创建证书”。 然后,您将进入一个页面,解释如何创建证书签名请求(我们已经在上面完成了)。 单击“继续”,上传您的CSR,然后下载生成的.cer文件。 已经累了吗? 我也是。 我们到了一半! 将您的.cer转换为.p12 通过双击或将其拖动到“钥匙串”窗口中,使用“钥匙串访问”打开.cer。 然后使用左侧面板导航到“我的证书”并找到您刚刚添加的证书。 (它也可以添加到“证书”中。) 选择/突出显示/单击您的证书,然后右键单击并选择“导出”,或者在菜单栏中选择“文件”>“导出项目”。 在出现的弹出窗口中,命名您的证书,选择它的目的地,然后选择.p12文件类型。 系统会要求您使用密码来保护此证书(可能是个好主意),但您可以根据需要将其保留为空白。 […]

使用RubyMotion搜索Apple Music(第2部分)

在第1部分中,我们添加了通过Apple Music播放歌曲的功能(希望您喜欢它!),但是曲目ID是硬编码的。 在本期中,我们将创建一个搜索界面,让您搜索自己要播放的音乐。 我们将从为搜索界面添加新的视图控制器开始。 使用此代码创建一个新文件search_controller.rb 。 类SearchController < UITableViewController def viewDidLoad 超 自我 .title = ‘搜索’ 结束 结束 我们将从PlayerController创建SearchController的实例,然后在导航栏中添加一个按钮。 我们现在可以摆脱硬编码的曲目ID,因为我们将找到自己的曲目以尽快播放。 def viewDidLoad 超 @player = 玩家 。 新 @search_controller = SearchController 。 新 自我 .title = ‘MusicApp’ 自我 .view.backgroundColor = UIColor .whiteColor 自我 。 addSubview create_play_button 自我 .navigationItem.rightBarButtonItem = create_search_button 结束 def create_search_button @search_button = […]

应用程序本地化的注意事项–应用程序演示视频–中

应用程序本地化的注意事项 应用程式本地化的重要性 全球化使几乎任何人都可以在世界各地开展业务。 互联网,智能手机和其他技术为小型企业提供了进入国外市场的机会。 应用开发人员潜在地有数百万新的潜在客户来向他们的产品推销。 但是,当您进入一个新市场时,在处理文化上会有所不同,更不用说使您的产品适应新的语言了。 为了在这些新市场中取得成功,至关重要的是您必须针对其新环境正确地定位应用程序。 在本地化应用程序时不要犯这些常见的错误 应用程式开发人员将其行动应用程式影片示范带入国外市场时,常会犯以下10个常见错误: 直接嵌入到代码中的文本:将文本直接嵌入到代码中会减慢本地化过程,因为翻译人员需要实际阅读代码才能确定需要翻译的内容和不需要翻译的内容。 没有为字符串的增长和收缩腾出空间 :翻译的长度和密度可能会并且会有所不同。 如果您不为此做准备并且没有足够的空间,则字符串可能会与其他控件重叠,这需要在翻译后编辑界面。 提供语言但不提供语言环境 :有时国家/ 地区使用一种语言,但会有细微的差异。 英国的英语和美国的英语只是一个例子。 级联字符串 :使用占位符将句子片段串联在一起,其中单词和短语的顺序是硬编码的,假定语法和特定的句子结构。 条件文本的粒度可能会在翻译过程中引起混乱。 不使用Unicode进行字符编码 :每当您使用错误的字符编码并且源代码使用无法处理Unicode的数据类型处理字符串时,翻译都会中断。 通常,编程语言使用系统的默认编码存储文件和应用程序目录。 但是,如果您的服务器是英语,并且所有用户都使用中文浏览,则字符将被损坏。 硬编码数字,日期和时间单位 :世界各地的时间和日期格式差异很大。 度量单位也有所不同,例如英里和公里。 在大多数国家,货币也有所不同。 所有这些都会在翻译过程中造成麻烦。 不计划从右向左阅读的语言 :某些语言(例如阿拉伯语和希伯来语)从右向左阅读。 如果您不打算这样做,则可能最终不得不构建一组新的样式表。 由于缺少上下文而造成的混淆/歧义 :当字符串包含变量,在特定上下文中使用或措词不明确时,翻译人员将很难。 通常,翻译人员以上下文无关的格式处理文件和字符串。 那么,翻译人员将如何知道单个术语“联系”是按钮的动词还是标签的名词? 使用包含文本的图像:有时包含文本的图像对于翻译人员可能是个问题。 图片中的文字可能会减慢翻译过程,并可能导致翻译费用更高。 在其操作环境中未对翻译内容进行语言审查 。 语言审查是一项质量保证步骤,可确保没有不清晰的语言可能会引起用户的混淆或误解。 应用翻译的一些技巧 您可以采取许多措施来简化和廉价地翻译应用程序。 请记住以下10条提示,这些有助于提高翻译质量: 从代码中分离出诸如UI字符串和图像之类的资源 :设计应用程序以使资源与代码分离,使它们能够独立维护和本地化 隔离可本地化的资源文件 :需要本地化的文件(例如包含要翻译的文本的图像)也应该被隔离,并放置在标有语言名称的文件夹中。 设置您的默认语言,并标记所有资源 :始终在应用清单中为您的应用正确设置默认语言。 默认语言确定当用户不说任何受支持的语言时使用的语言。 用使用的语言标记默认语言资源,以便系统能够分辨资源所用的语言。 确定需要本地化的所有应用程序资源 :确定进入新市场时需要更改的所有内容。 检查图像,看它们是否适合文化。 […]

Jenkins + iOS构建

不久前,我需要为iOS项目设置构建管道。 这是一个经典的故事,开发团队解散了,公司需要一些外部软件帮助。 长话短说,这成为我修补iOS构建自动化的借口。 编译良好且有文档证明的开源项目是一回事,编译没有文档且无人问津的iOS项目,至少让我非常兴奋。 该项目是为iPad设计的,我认为我需要一个实际的项目来开发。 事实证明,为Apple设备开发软件仅需要Apple计算机。 不需要手机或平板电脑。 一切都可以通过模拟器来完成。 下一个困难的部分是弄清构建配置和库依赖关系。 这是我第一次听到cocoapods,事实证明它很整洁。 就像NPM用于节点,pip用于python,Cocoapods用于快速/目标C项目。 我不能在这里分享代码,但是可以分享我学到的课程。 资质认证 对于新开发者来说,这可能是最令人困惑的事情,但是实际上,这并不太疯狂。 所有这些都是关于知道谁编写了代码以及谁在分发应用程序。 证书 -每个开发人员都应在developer.apple.com上获得一个帐户,并生成自己的开发证书。 这用于签名代码。 您稍后将使用您的用户名和密码来获取证书。 证书的私钥仅在证书创建期间可用。 那些.p12私钥需要导入Mac的钥匙串中才能对代码进行签名。 标识符 -只是某种Java类,例如命名约定ID即可识别应用程序。 设备 -允许将设备注册到公司帐户,并且配置文件可以指定允许安装该应用程序的设备。 供应配置文件 -证书+应用程序ID +设备的组合。 它用于对应用程序进行签名。 编译中 安装Xcode和CLI工具。 安装分发证书和该证书的私钥。 Fastlane是人们多年来构建的实用程序的组合,可帮助实现iOS项目构建的自动化。 Jenkins Side自动化 对于Jenkins服务器端,在Jenkins管理内创建一个slave node 。 您可以: 在Mac上创建SSH帐户,让skin进入ssh。 要么 使用webstart方法,从Mac上从Jenkins的master下载slave.jar并手动启动。 可以为slave.jar创建自动启动。 在工作中,使用jenkin的插件将文件从jenkin的文件系统复制到Mac从节点。 为了执行构建, #!/ bin / bash -l export LANG =“ zh_CN.UTF-8” #秘密文件本地存储在构建服务器上 […]

Swift UI动画库Ramotion

Swift UI动画库 由@ramotion开发的Swift库,UI组件和自定义动画的精选列表 有关更多详细信息:-https://github.com/Ramotion/swift-ui-animation-components-and-libraries 内容 折叠单元 折叠单元是一个内容不断扩展的单元,其动画灵感来自于折叠纸卡材料设计。 动画标签栏 Animated Tab Bar是一个Swift UI模块库,用于向iOS Tabbar项目和图标添加动画。 扩大收藏 Expanding Collection是一个动画的材质设计UI卡监视/弹出控制器。 圆形菜单 圆形菜单是一个简单,优雅的UI菜单,具有圆形布局和材质设计动画。 纸开关 Paper Switch是一个Swift材质设计UI模块,在打开开关时会在父视图上绘制。 纸上入职 iOS库Paper Onboarding是用Swift编写的材质设计UI滑块。 卷盘搜寻 Reel Search是一个Swift UI控制器,可让您从列表中选择选项。 导航堆栈 Navigation Stack是一个具有堆栈建模的UI导航控制器的库。 自适应标签栏 自适应TabBar是一个“递减”模块,用于将自定义状态添加到本机或自定义UI元素。 预览过渡 预览过渡是带有动画过渡的简单预览库UI控制器。 滑行集合 滑行集合是UICollectionView Swift Controller的平滑,流畅,可自定义的决定。 流体滑块 带有弹出气泡的滑块小部件,该弹出部件显示在Swift上编写的所选精确值。 伸长率预览 延伸率预览是用于iOS的优雅的UI推式样式视图控制器。 花环景观 Garland View在多个内容列表之间无缝过渡。

使用Xcode 8的FastLane的新Build设置来理解

我已经构建并负责管理我们iOS移动研究工作的构建管道。 我们运行3个不同的版本: Alpha , Beta ,将每个版本发布到不同的输出: HockeyApp,TestFlight,AppStore 这些释放点中的每一个均由对不同git分支的提交触发。 提交开发内容将自动将构建版本发送给Microsoft HockeyApp ,提交给master的提交将自动构建应用程序的两个版本,一个版本自动发送给Apple TestFlight ,同时准备一个稍有不同的构建版本,我们可以手动将其部署到Apple App Store 。 为了使事情变得更加有趣,我们的一些项目使用了两个独立的应用程序目标,这使我们共有六种不同的配置。 当我将构建服务器和项目过渡到Swift 3和Xcode 8时,构建配置不再能很好地工作。 苹果对新版本的Xcode中的代码签名和配置方式进行了一些更改,因此我不得不更新流程。 构建通道的核心是快速通道,我们使用它来自动执行该过程的大多数步骤。 手动签名 我最初的希望是,可以将项目文件设置为“自动签名”,然后当它到达CI服务器时,服务器将重写项目文件中的所有必要字段,以将其转换为手动签名。 这是可能的,但是如果您在项目中同时拥有框架和应用程序目标,则将变得相当困难-在某些软件中就是这种情况。 因此,我们坚持使用手动签名进行所有操作。 借助“手动签名”,我们需要手动管理我们的配置文件-可能会有些麻烦-但至少我们有一个很小的团队,因此目前可以管理。 我的目标之一是确保快速通道过程是非破坏性的,这意味着您可以在开发机器上运行它,并且不会破坏您的项目。 因此,高级流程是存储现有的构建设置,然后根据需要重新连接项目文件,进行构建,然后将项目还原到以前的状态。 捆绑ID和其他唯一字段 我们的三个构建路径中的每一个都有一组唯一的字段。 例如,每个应用程序的捆绑ID必须是唯一的。 另外,每个捆绑包ID都有其自己的唯一供应配置文件供应-连接到与该内部版本关联的Apple开发者帐户。 因此,对于发行版,我们使用主要的开发人员帐户,而在beta和alpha测试中,我们使用企业帐户进行签名。 现在,配置文件存储在以下构建设置中: PROVISIONING_PROFILE_SPECIFIER,因此使用xcodebuild,grep和awk的组合提取此值 #使用XcodeBuild | Grep | Awk | 提取提取配置文件名称的信息 EXISTING_PROFILE = sh(“ xcodebuild -project#{PROJECT_FILE_PATH} -scheme#{SCHEME} -showBuildSettings | grep PROVISIONING_PROFILE_SPECIFIER | sed […]

Apple推送通知证书(iOS推送通知-第一部分)

2.生成证书签名请求。 您可以从Mac上的钥匙串访问应用程序生成此文件。 按照下面给出的快照: 3.注册您的Apple设备 在Apple开发人员控制台上,单击设备→全部,然后按照下面给出的快照进行操作:

通过iOS上的网络链接共享文件

iOS爱好者的绝妙新闻! 新的软件更新使您可以通过Web链接直接从Lima应用程序共享文件。 通过点击文件,您可以使用新的“共享链接”按钮并直接从智能手机与他人共享文件。 您可以通过电子邮件发送所提供的链接,进行消息发送,复制和粘贴它,以及根据需要共享任何图片,电影或文档。 收到链接时 另一方面,您的朋友会收到一个访问内容的链接。 然后,他/她可以从任何设备“下载”文件。 而已! 这么简单 您可以同时发送多个文件 一次共享几个文件之前,要做的第一件事是将文件压缩在一起。 这样,Lima会将它们视为一个文件。 如果更改文件名或将其移动到另一个文件夹,则将使链接不可访问。

夏季第一天-测试驱动开发

今年夏天,我手上有很多时间,所以我将尝试学习尽可能多的东西。 然后,我将写下我的日常成就和发现。 我是奥本大学的软件工程系学生。 我是一名大四学生,将于今年12月毕业。 我在Co-Op担任iOS开发人员方面有相当多的经验,并且对Android和Web开发感到满意。 我今年夏天的目标是为求职面试官做准备,并尽可能多地学习。 我真的很想深入iOS世界,很少有我真正想要从事的项目。 因此,事不宜迟,这里是我今天学到的东西。 我正在开发一个应用程序,该应用程序将使用Spotify为专辑,歌曲和歌手提供的应用程序网址来规避Spotify上10,000首歌曲的限制。 这个想法是,如果您将相册添加到我的应用程序中的列表中,则只需单击我的应用程序中的相册,即可将您带到Spotify中的相册。 这样,您可以根据需要添加任意数量的相册。 我要做的第一件事是使用“测试驱动开发”编写应用程序。 我听说过罗伯特·马丁(Robert Martin)的“ 清洁代码”中的做法(强烈建议未读过的任何人),但我从未用它来构建任何东西。 我主要关心的是测试异步网络代码。 但是,经过一番挖掘,我找到了Apple的这篇文章: 测试期望的异步操作 异步操作是不能在当前代码流中直接执行的操作。 可能是…… developer.apple.com 通过使用XCTestExpectations,您可以使测试等待一定的时间,以查看应用程序是否具有XCTAssert函数。 如果确实符合XCTAssert,则会对其进行评估,然后测试通过或失败。 这样就不会浪费时间,测试只需占用网络通话的时间。 然后,我开始将我的应用程序与Spotify集成在一起。 我决定从登录页面开始,因此我按照Spotify开发人员网站上的说明将我的应用程序与他们的平台集成在一起。 我已成功登录并且会话正常运行。 该应用程序将打开Spotify以登录到该应用程序,然后将其重定向回您的应用程序。 我了解到可以使用“应用程序URL”执行此操作。但是,我不知道如何执行此操作,但是可以使用以下文章来学习: 如何使用自定义URL打开iOS应用 本教程向您展示如何使用自定义工具从iOS应用程序内或从野生动物园浏览器中打开另一个iOS应用程序… kitefaster.com 我还在Github上设置了我的应用程序,并将其开源,以供所有人使用。 链接在这里: harrysummers /无限图书馆 通过在GitHub上创建一个帐户为Infinite-Library开发做出贡献。 github.com

核心数据:正确入门

核心数据是Apple为macOS和iOS设计的框架,可持久存储对象。 它本质上是SQLite的抽象。 Apple提供了有关Core Data的综合指南,但鉴于其复杂性,可能需要一段时间才能通过。 在这篇文章中,如果您要构建现代应用程序,我将介绍正确入门的基础知识。 我还将介绍核心数据的一些重要方面,这些方面可能并不明显,但在许多教程中经常被忽略。 设定 因此,您刚刚在Xcode中创建了一个新项目,并选中了“使用核心数据”复选框(如果没有,则将丢失文件,请查看下一段以获取详细信息)。 默认情况下,Xcode将与Core Data相关的方法添加到您的AppDelegate类。 如今,这样做是一种不好的做法。 在我看来,您的AppDelegate应该只管理应用程序的生命周期。 多年来,Core Data变得越来越复杂和强大,因此最好将数据存储代码放在单独的类中。 绝对从AppDelegate中删除以下内容: //标记下的所有内容:-如果使用Swift,则为核心数据堆栈; #pragma标记下的所有内容;如果使用Objective-C,则为核心数据 堆栈 。 未选中“使用核心数据” 如果在创建项目时未选中“使用核心数据”复选框,则您的AppDelegate应该是干净的,您只需要创建一个文件:数据模型即可。 在项目浏览器中右键单击您的主项目文件夹,然后单击“新建文件…”,选择“ iOS”>“核心数据”,然后单击“数据模型”,然后单击“下一步”,然后按照步骤保存文件。 实体 我不会花很多时间谈论创建实体和关系,因为它很简单,没有技巧,并且有很多很棒的指南,例如tutsplus博客或objc.io博客。 还可以查看江豪的关于创建实体和关系的文章。 打开.xcdatamodeld文件,您应该具有如下所示的内容: 只需单击屏幕底部的“添加实体”按钮,即可随意添加一些属性,更改实体名称并使用编辑器。 现在,最重要的部分是将您的实体映射到类。 选择您的实体,然后在导航栏中单击“编辑器”,然后单击“创建NSManagedObject子类…”: 选择对象模型,然后选择实体并创建文件。 如果使用Swift,将为您创建两个文件(如果使用Objective-C,则为四个文件)。 一个类将是NSManagedObject的子类 。 此类仅应包含对象的方法,另一个应为该对象的扩展,并且应包含属性(请注意,相反的方法也可以,您可以在NSManagedObject子类上具有属性,而在扩展上具有方法)。 我的理解和对此可能是错的,因为我们将它们分开以保持清洁。 例如,您可以拥有一个插件,该插件可以在更改模型时自动重新生成实体类,而不会覆盖您的方法。 数据存储单例 现在,您应该创建一个新的单例类,该类将为您的应用程序提供数据管理方法(因为我们已从AppDelegate中删除了这些方法)。 如果您没有时间阅读我的文章,可以在这里找到一个很好的Objective-C示例:https://gist.github.com/NachoMan/922496。 但是请知道,此代码是非ARC的,因此,如果要在iOS应用中使用它,则只需摆脱–(void)dealloc方法。 如果您有时间,请查看下面的“ 线程”部分,这很重要! 苹果还展示了在Objective-C和Swift中可用的稍微复杂一点的单例。 如果您有几分钟的时间,那么让我们逐一介绍一下单例所需的方法(在Swift中): 物产 让我们从一个具有以下属性的新类开始(自行替换字符串): ManagedObjectModel ManagedObjectModel本质上是从.xcdatamodeld文件加载的数据模型。 只需将“ MyApp”替换为模型文件的实际名称即可。 现在您可能想知道扩展名为什么是“ momd” ,这是因为我们要引用模型的编译版本,而您无法在“项目浏览器”中查看该版本。 将以下内容添加到您的DataManager类中: […]