Tag: ios

Apple Developer Enterprise程序设置

Apple Developer Enterprise程序(也称为内部分发)使公司无需前往AppStore并经过Apple的批准程序即可将其应用程序发布给用户。 这样可以确保公众或该公司以外的任何人都不会使用这些应用程序。 为此,您需要遵循一些步骤。 我将向您介绍我为您的客户发布此类应用程序的经验。 更多详细信息可以在这里找到。 要求客户创建一个Apple Enterprise Developer帐户,并为您提供用户名和密码,或者如果他们不愿意共享此类信息,则将您添加到该帐户。 根据我的经验,大多数客户都会向我发送他们的帐户信息,而我会尽一切努力来设置他们的帐户。 这通常是因为客户/客户经理的技术水平不足以处理创建帐户或在iTunesConnect的“用户和角色”下以及Apple Developer门户的“人”下添加用户。 要创建企业帐户,您可以在此处访问Apple的网站。 并非说企业计划的费用为每年299美元。 在您注册该程序之前,Apple从您/您的客户那里需要做的事情很少: 法人实体状态:基本上是为了确保您是合法/合法公司并且您是您的身份。 DUNS号:公司必须具有DUNS号,用于验证公司是否为法人实体。 此唯一编号是由Dun&Bradstreet分配给您的公司的,用作标准的业务ID。 法律授权:您或公司的某人应具有与Apple签订法律协议的法律授权。 例如,公司的创始人,项目负责人或具有公司高层人士授予他们法律权限的人。 Apple ID:您需要确定一个Apple ID才能登录并注册该程序。 此Apple ID是您稍后在登录开发人员帐户和iTunesConnect时所需要的。 客户端创建帐户并为您提供所需的登录信息后,登录到Apple Developer帐户和iTunesConnect,以确保一切正确,并且您具有正确的访问权。 完成所有步骤后,现在您将需要生成分发证书 ,并确保选择“ In-House and Ad Hoc ”。 之后,将要求您使用“钥匙串访问”创建证书签名请求(CSR),这与您要生成常规分发证书时使用的方法相同。 生成该代码,下载并添加到您的钥匙串中。 现在,当您要发布应用程序时,需要将其导出以分发到商店外部。 为此,请转到产品->存档,然后将存档导出为iOS App文件(.IPA文件)。 在客户端上单击导出按钮,选择“保存以进行企业部署”,从弹出菜单中选择一个团队,然后单击“继续”。 那将为您生成IPA文件! 为了发布该应用程序,您将需要3个文件,我们之前生成的IPA文件,一个应用程序图标(.png文件)和一个称为清单文件的文件。 清单是一个XML plist文件,设备本身使用它来查找IPA文件,图标以及有关应用程序本身的其他重要信息,例如您的Web服务器(IPA文件所在的位置)。 您可以在生成IPA文件本身时生成清单文件,然后将提示您输入所需的详细信息,例如“应用程序名称”,“应用程序URL”(应为HTTPS),“图像URL”(也应为HTTPS)。 完成此操作后,您便拥有了所需的所有文件,并设置了生成应用程序IPA文件所需要做的一切。 现在,您需要将应用程序上载到将要运行的服务器上,并将应用程序清单文件传递给用户,以便他们可以下载应用程序。 请确保将所有3个文件放在同一目录中,否则,请更新清单文件以反映每个文件的位置。 如有任何疑问,请随时发表评论,我会尽快回复! 祝你好运,分配愉快!

始终注意技术建议的含义

这个周末,我浏览了Medium,发现了一篇有关“从模型到控制器传递数据的3种方式”的文章。 评论表明人们喜欢它,因为它谈到了重要的基础知识:如何传递信息? 这可能是有史以来最重要的面向对象编程问题。 您如何耦合组件? 提到的3种方式是: 回调, 代表团, 和通知。 实际上,这是耦合任何组件的3种不同方式。 了解这些技巧(以及其他技巧)对编写代码非常重要。 然后我想到这篇文章可能会误导新的Swift开发人员,因为这些示例几乎没有显示如何创建一个好的模型。 采取示例代码进行委派: 类DataModel { 弱var委托:DataModelDelegate? func requestData(){ //接收到数据并将其解析为String 让数据=“来自任何地方的数据” 委托?.didRecieveDataUpdate(数据:数据) } } 这是一个基于委托的回调的网络请求。 当然,它说明了代表团。 但这是网络控制器代码。 这不是模型代码。 您在这里看到任何代表实体的东西吗? 实际上,您将发现的唯一具有模型风格的东西是数据。 模型对象是本质上是某种东西的对象。 上面看到的是仅封装序列的服务对象。 除了委托属性,它是无状态的。 它本身几乎不是应用程序状态的一部分。 在简单的情况下,从模型代码中提取网络请求代码可能没有回报。 但这不会扩展。 而且,如果您将此示例视为起义的iOS或Mac开发人员的第一件事,那么您将产生误导。 假设您的代码已经具有模型对象,并且您想应用上面概述的委托技术。 因此,您采用了这个简单的代码段,您可以将其粘贴到其中而没有任何冲突,然后就可以完成了。 成功的申请似乎足以证明。 但是现在您的代码变得更糟了。 因为您的模型对象现在也是网络请求网关。 它做了两个非常重要但又非常不同的事情。 也许危害仅会在几个月后显现出来,并且,如果您一开始就全力以赴地使自己陷入这种情况,那么您可能不知道问题的根源,并且将无法自己修复。 当您阅读以代码为中心的“ X最好的Y方式”时,请弄清楚作者正在(不知不觉中)向您出售什么样的世界观或术语。 只有相距甚远,您才能获得建议,而不会盲目地改变自己的想法。 如果您找不到作者为什么如此做的令人信服的理由,也许她只是做事草率而已,并不在乎。 您必须对所学内容的质量负责。 作者无法从Genesis入手,也无法解释整个人类历史如何在这种超级编码技巧中达到顶峰。 在写作时,您必须将某些事情视为理所当然。 问题是:如果您(读者)没有自己的见解,那么您首先看到的东西对您的影响最大。 如果遗漏的东西是您工艺的重要概念,那么很难知道发生了什么。 您不能收集一些代码片段,除非收集一些作者关于如何正确执行操作的观点。 如果您的收藏夹中的各个部分发生冲突,而您没有注意到它或不明白为什么,那么将很难编写具有凝聚力的代码并应用任何这些技巧。 因为最终,没有任何事情是孤立的。 您(人类)始终是过程的一部分,您的困惑将在代码中体现出来。 […]

dispatch_sync()有陷阱

每个文档: 作为一种优化,此函数在可能的情况下在当前线程上调用该块。 如果您尝试提供其他队列并在主队列上调用此函数,则这是一个陷阱,它实际上会将所有帧从主队列堆叠到目标队列中,如下所示: dispatch_sync(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^{ [RestAPI registerDevice:^{ }]; }); 致电之前: 块内: 请注意,属于主队列的帧现在堆叠在后台队列中。 当您尝试在块中添加信号量时,这会变得混乱,例如: + (void)registerDevice:(void (^)(void))completionBlock { while (true){ __block BOOL success = NO; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [[AFHTTPSessionManager sharedInstance] POST:@”register” parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { success = YES; DDLog(@”[REGISTER SUCCESS] %@”, responseObject); dispatch_semaphore_signal(semaphore); } failure:^(NSURLSessionDataTask *task, NSError *error) { DDLog(@”[REGISTER FAILED] %@”, […]

解决编码挑战

模糊#2 可能的解决方案 简介:从模糊1移至模糊2 模糊1是Firehose软件工程程序中对面向对象编程(OOP)的介绍。 模糊1只不过是简单地输出由阵列阵列组成的图像(黑白),该阵列用于表示图像的各个像素。 这并不难。 为了清楚起见,您需要使计算机输出以下内容: 要在“模糊1”中做到这一点,您需要做的就是一起擦几根棍子,瞧,你起了火。 不,但是认真,这是关键成分 您需要一个带有参数的类。 Image类本质上是特定对象的方法和变量的模板定义。 Image类本质上为我们正在做的事情起了个名字。 但是,由于在这种情况下,我们要处理一组像素,因此需要找到一种方式来存储和表示计算机可以理解的方式。 因此,对于我们的情况,最简单的操作是创建一个数组数组。 您将需要一个使用该参数的初始化器 从那里您只需要应用一种将输出参数的方法类型 这些是这样的: 这就是它的长短。 但是,模糊2所需要的远不止于此。 经过大约1个月的时间,实际的解决方案似乎比我想象的要容易。 同时,我学习了很多有关如何编写代码的知识。 什么是Blur2? 模糊2要求您采用给定的阵列数组,并对单个像素(单元)进行模糊处理,并对紧接其周围的像素进行模糊处理。 为了更清楚地了解这一点,请看以下图片: 因此,作为编码人员,您需要查看代码,然后解密它所需要的内容,以及如何将您的想法转化为一系列代码,这些代码序列将输出使模糊原始图像周围单个像素的图像。 因此,如果以上面的两个像素转换为例,您可以看到您的代码最终应该输出与右侧图像相同的结果-您将从左侧的图像开始,但是随即完成右边的内容。 这是我首先要做的 起初我冻结了。 只是冻结。 “这到底意味着什么?” 如果您以前曾经有过这种感觉,那么您将确切地知道这是什么样的。 但是,从那时起,我花时间尝试将问题分解为合理的步骤序列,这些步骤可以根据我现有的代码知识以及其他开发人员的经验来解决。 这是我冷静下来后所做的事情 规则1:总是用简单的英语写出你想做的事情。 由于这样做之后才有意义,因此首先想出一个解决问题的计划即可为您提供参考。 显然,接下来的工作将是您需要阅读的所有代码,但是查看您想做什么并检查推理中可能存在的差距是一个不错的起点。 所以这是我的原始想法: 所以我得到了需要模糊处理的图像。 大。 我已经将我的数组连接在一起以组成一个数组数组,所以现在我需要弄清楚要模糊的实际像素在哪里 我想遍历所有像素和所有行以确定这些实际像素在哪里并将坐标存储在某处 从那里,我需要找到一种方法来模糊所标识位置的上下左右像素。 这是我犯的错误 :我在互联网上查看了其他人对此的想法,而自己本人并没有全力以赴。 这可能会更快,并且可能会在短期内带您到达目的地,但稍后会遇到问题。 对我来说,我并不完全理解其他人使用的所有代码。 我最终花了很多时间测试和检查他们的代码,而不是尝试自己开发代码。 这让我放慢了脚步,因为我没有专注于寻找对我有用的东西。 第一步 我需要先让我的代码遍历每个单元格和每一行,因此我建立了一个允许这样做的系统: 此方法有一个目标:找出1的坐标,这需要几个步骤。 换句话说,这是在寻找已经模糊的实际像素的坐标。 您会注意到, 如果cell == […]

具有构建模块化SDK的经验

在conichi中,我们正在努力改善酒店的客人体验:加快入住和退房流程,带来移动支付的可能性等。 为了构建此基础架构,我们一直在研究三个主要项目,其中最重要的一个是我们的移动SDK,我们正在将其集成到合作伙伴的应用程序中。 我们一直在构建SDK时,要牢记它应该是模块化的。 所谓模块化,是指每个合作伙伴都应该可以使用他们所需的唯一功能来构建其SDK。 我们如何使代码成为可能 首先,我们分离了核心功能,并基于对配置对象的依赖注入进行了初始化过程: @interface CNISDKConfiguration:NSObject @属性(非原子,副本,只读)NSString * apiKey; @属性(非原子,副本,只读)NSString * apiSecret; @property(非原子,赋值,只读)CNISDKLogLevel logLevel; +(instancetype)configurationWithBlock:(void(^)(id 配置))configurationBlock; @结束 该对象允许基于块的可变初始化,并且遵循NSCoding协议,以避免任何引用的相关问题。 我从Parse框架实现中汲取了这个想法。 下一步是为“工具包”创建统一的界面: @protocol CNISDKKit +(void)enableWithConfiguration:(CNISDKConfiguration *)配置; +(instancetype)sharedInstance; -(无效)开始; @结束 该协议要求使用以下方法来启用Kit并对其进行配置,启动基础Kit的任务以及能够访问共享实例。 每个Kit都有自己的初始化参数,开发人员还可以在初始化期间将其作为依赖项注入传递 @protocol CNISDKKitConfiguration @结束 不幸的是,我还没有为Kit的配置对象提供任何统一的属性或方法,但是这个简单的协议至少可以为我们提供类型安全性和有关此对象外观的高级信息。 由于唯一的核心模块应该初始化Kit,因此我们创建了一个对象,该对象表示Kit及其配置之间的一对一关系 @interface CNISDKKitBundle:NSObject @property(非原子,强,只读)Class 套件; @property(非原子,强,可为空,只读)id 配置; +(instancetype)bundleWithKit:(Class )工具包配置:(nullable id )配置; @结束 并为核心配置添加了一个新属性-一系列工具 @interface CNISDKConfiguration:NSObject 。 。 。 @property(非原子,强,只读,可为空)NSArray * […]

Dropanon

为什么我构建一个React Native App Dropanon出生于我寻找解决两个目标的方法时: 在React Native中从头开始构建一个应用程序 通过Apple App Store提交过程获取应用 该产品本身是出于我对在线匿名性的个人爱好而诞生的,而我的联合创始人则非常讨厌别人发表Yelp评论来建立自己的在线品牌。 什么是Dropanon? Dropanon是一个基于位置的匿名消息传递应用程序,当前可在iOS应用商店(Android即将推出)上使用。 用户可以将单词,表情符号或链接放在他们的位置。 每个液滴的半径为75米,只能在该半径范围内读取。 认为它像涂鸦。 液滴在地图视图上可视化,并在提要/列表视图中读取。 该地图将仅可视化距用户最多500米的跌落。 施加此限制是为了限制客户端需要发出的请求的数量,并鼓励用户四处走走和探索。 每滴都是匿名的。 存储的唯一标识符是RFC4122 v1唯一用户ID(使用React Native UUID1)。 此UUID仅用于允许用户标记或阻止其他用户(这是App Store的要求)。 当前,液滴将永远存在并按时间顺序显示给用户。 我们已经收到的一些反馈是使滴剂暂时消失-在一定时间,数分钟或数天后使它们消失。 这是我们将来可能会做的事情,但就目前而言,您的贡献将继续存在。 怎么样 Dropanon使用React Native和Reflux构建。 持久性由Firebase处理(对于地理查询,则由GeoFire处理)。 从启动开始的基本应用程序流程如下: 初始化应用程序和加载视图。 这在顶级React组件App.js中处理。 在componentDidMount() ,这里发生了很多事情,例如检查用户是否已入职或是否已授予正确的权限(在使用应用程序时的位置)。 所有的Reflux商店也在此处初始化,并附加了侦听器。 如果缺少权限,用户尚未注册或发生其他问题,我们将适当处理。 由App.js初始化的Reflux商店开始处理各自的任务。 这些在逻辑上分为: ErrorStore , FirebaseStore , GeoStore和TimerStore 。 ErrorStore.js ErrorStore负责错误。 任何捕获到的错误都将传递给它,然后传递回App.js ,然后在顶部显示一个错误栏,告诉用户出了什么问题。 可以通过点击横幅关闭横幅。 FirebaseStore.js 所有滴都保存到Firebase的实时数据库之一并从其中读取。 Firebase允许我们省去编写自己的后端的工作,很快我们就可以运行并运行原型。 […]

Fitbod Beta测试计划—常见问题解答

自启动fitbod以来,测试小组不仅在确保质量,无错误的发行版中,而且在塑造fitbod今天的工作方式以及影响我们未来的产品路线图方面发挥了关键作用。 如果您有兴趣参加Fitbod Beta计划,请发送电子邮件至feedback@fitbod.me给我们 如何安装Beta版本 一旦我们将您加入Beta计划,您将收到Apple发出的邀请电子邮件,加入fitbod beta组。 系统将提示您从App Store安装免费的TestFlight应用程序。 接受邀请后,您就可以下载fitbod的测试版。 如果您已经在设备上安装了实时应用程序,则该应用程序的Beta版本将替换该实时版本,从而保持数据完整。 我们目前不在testflight中使用“兑换”按钮。 Testflight中最新的beta版本在哪里 请注意,您可以在Testflight中下载Beta版本,直到我们在App Store中发布为止,该版本将对公众开放。 如果您在测试飞行中看不到beta版本,则iTunes可能存在问题。 尝试再次单击iTunes电子邮件中的链接。 Elite订阅如何与Beta测试一起使用? 在Beta版中升级到Elite订阅始终是免费的,并且不会向您收费。 Apple为TestFlight和App Store构建了两个单独的应用程序内购买系统。 Beta版订阅也会很快过期,因此您可能需要重新订阅几次。 Beta测试有哪些风险? 作为fitbod Beta成员,您可以在公开发布之前尽早使用新功能。 请了解,使用Beta版发布时,遇到错误,故障和崩溃的风险会增加。 如果您想使用经过良好测试的应用商店版本,只需回复此电子邮件,表明您希望从Beta组中删除。

FileMaker iOS App SDK变得简单

2018年3月-剪辑管理器,FM日历,PrinterSwitch,DoSQL,AutoSender的开发人员宣布myFMbutler Mobile App Builder立即可用。 关于移动App Builder 当FileMaker,Inc.推出FileMaker iOS App SDK时,它想简化FileMaker自定义应用程序在组织中的分发方式。 过去,FileMaker Go应用程序以及所有FileMaker文件和链接是分开分发的。 由于有了FileMaker iOS App SDK,您只需要分发一个包含完整FileMaker解决方案的应用程序即可。 因为使用FileMaker iOS App SDK需要对命令行指令和Xcode有充分的了解,所以这对于许多人来说可能是个问题。 多亏了myFMbutler Mobile App Builder,现在简化了整个应用程序构建过程。 现在,您无需打开Xcode就可以构建应用程序。 通过Mobile App Builder,您可以通过其易于使用的界面使用iOS App SDK创建和管理FileMaker移动自定义应用程序,而无需任何编程知识。 [ 下载Mobile App Builder ] 特征 为iOS创建本机移动自定义应用 建立内部和企业分布 为App Store构建 自动创建所有必需的应用程序图标 支持FileMaker iOS插件 重用和共享构建设置 系统要求 macOS 10.12或更高版本 Xcode 9 FileMaker iOS App SDK 16.0.x(需要FileMaker开发人员订阅) 苹果(企业)开发人员计划会员 […]

结构— Fastlane安装问题

因此,我尝试通过Fabric应用程序安装Fastlane,因为这似乎是安装它的最简单方法。 fastlane命令本身似乎可以很好地安装,但是尝试运行任何fastlane工具(例如snap)会导致错误-即因为未安装这些工具。 解: 卸载由Fabric应用程序安装的fastlane版本(有一个方便的按钮)。 通过Ruby Gems手动安装fastlane。

初学者的Xcode调试(1):工具

调试是开发人员的惯常做法,可能会占用大量时间并带来深深的挫败感。 轻松快捷地进行调试始终是一个令人愉快的目标。 让我们探索一些可以立即应用的调试工具! NSLog(Obj -C)/打印(Swift) 在控制台中打印是一种常用的调试方法,尤其是在无法添加调试器(例如在生产应用程序中)或尝试调试竞争条件问题的情况下无法使用断点时。 但是,它需要比其他调试方法更长的时间,因为它要求您在每次更改日志消息时都重新运行该应用程序。 您还需要记住在完成调试后清理它们,尤其是当记录的消息包含敏感信息时。 基本断点用法 调试而不接触代码库的一种常见方法是设置断点。 您所需要做的就是单击代码编辑视图左侧的行号,然后会出现一个蓝色的断点箭头。 以下是使用断点的最常用方法: 检查Xcode调试区域左侧面板中的变量; (要查看该实例的属性,请单击变量左侧的箭头。) 键入po (打印对象)或直接在控制台中使用变量名进行print 。 您可以通过单击调试区域右下角的两个按钮来显示或隐藏左右面板。 有时,您可能会发现未显示变量值,但显示了“ 无法读取数据 ”错误,或者即使您知道这是一个谎言,也将这些值显示为nil 。 这通常是由于构建设置中的优化级别所致。 确保在“ 调试 ”配置中将其设置为“ 无 ”。 当您使用Cocoapods并尝试进入Pod的代码时,请确保您在Pods项目的相应Pod目标中检查了优化级别。 基本的断点工具可以解决很多调试需求,但不是全部。 当您要调试竞争条件时,在断点处停止永远不是最好的方法。 另一种情况是您不知道在哪里放置断点。 例如,您希望程序在引发错误的地方停止。 为了调试这些情况,我们需要深入研究更高级的断点用法。 高级断点用法 更多类型的断点 在Xcode的左侧,单击导航区域中的断点图标。 您可以在左下角看到一个“ + ”按钮,它允许您添加不同种类的断点。 以下是一些常用的断点类型: 建议使用“ 异常断点 ”来捕获异常并显示相关信息。 “ Symbolic Breakpoint ”使您可以停止无法访问的方法。 它通常用于阻止第三方库或iOS框架的方法。 例如,您可以使用-[UIViewController viewDidLoad]为该方法创建一个断点。 暂时禁用断点 您可以单击断点以启用/禁用它。 您也可以将断点拖到另一行或将其拖到代码编辑区域,然后释放鼠标将其删除。 编辑断点 […]