Tag: xcode

通过React Native触发iOS 10可操作的推送通知

在本教程中,我们使用Xcode和React Native来配置和创建本地自定义推送通知。 背景 通知内容扩展用于显示iOS应用通知的自定义界面。 React Native可让您仅使用JavaScript构建移动应用 使用React Native创建一个新应用 请按照此处的说明安装React Native并生成一个新项目: 在Xcode中启用推送通知 您可以按照此处的步骤启用本地推送通知: 确保您的捆绑包标识符是唯一的。 尽管还有更多步骤可以启用远程通知,但您所要做的就是切换此开关以启用测试本地推送通知。 在Xcode中链接React Native的PushNotificationIOS库 请按照此处的说明将React Native的PushNotificationIOS库链接到Xcode。 使用Xcode在您的应用中创建新目标 选择您的Xcode项目,然后添加并命名一个Notification Content扩展目标: 告诉Xcode如何找到您的通知 出现新目标。 选择它,然后在其Info.plist中 ,设置UNNotificationExtensionCategory和UNNotificationExtensionInitialContentSizeRatio的值。 测试来自React Native的推送通知 在您的React Native代码中导入库: 从’react-native’导入{PushNotificationIOS}; 触发来自RN的推送。 确保使用上面创建的类别: componentDidMount(){ PushNotificationIOS.requestPermissions(); PushNotificationIOS.presentLocalNotification({ alertBody:“ Hello World”, 类别:“ myNotifcationCategory” }); } 在React Native中启用LiveReload后,当我关闭应用程序并保存RN文件时,可以看到推送通知: 下一步:自定义视图并处理用户操作 在这里,您可以编辑NotificationViewController.swift文件以实现didReceive方法。 使用它来配置您的通知界面并处理用户操作。 在RN中使用userInfo对象将任意信息传递到Xcode ViewController,从而填充MainInterface.storyboard提供的UI字段。

在Swift中处理非可选选项

可选参数可以说是Swift最重要的功能之一,也是将其与Objective-C之类的语言区分开来的关键。 通过被迫处理可能 nil ,我们倾向于编写更具可预测性和较少错误的代码。 但是,有时可选参数会使您陷入困境,因为程序员如您所知(或者至少您是在这种假设下 ),即使使用某个变量,某些变量也总是非零。可选类型。 就像在视图控制器中处理视图时一样: 在这种情况下,Swift程序员将在几乎与制表符和空格相同的程度上存在分歧。 有人说: “由于它是可选的,因此您应该始终使用what或guard let适当地解开它。” 而其他人会朝完全不同的方向说: “由于您知道该变量不会为nil,请强制将其解包(使用!)。 崩溃比最终处于不确定状态要好。” 基本上,我们在这里谈论的是是否进行防御性编程。 我们是否试图从不确定的状态中恢复,还是仅仅放弃并崩溃? 如果我不得不对这个问题给出一个二进制答案,那么我绝对会选择后者。 未定义状态会导致很难发现错误,可能会导致不必要的代码执行,而采用防御性编程只会导致难以推理的代码。 但是,我宁愿不必给出二进制答案,而是研究一些可用于以更细微的方式解决此问题的技术。 让我们潜入吧! 真的可选吗? 变量和属性是可选的,但实际上是程序逻辑所必需的,实际上是体系结构缺陷的征兆。 如果需要某些东西,直到没有它会使您处于未定义状态–它不应是可选的。 尽管在某些情况下(例如与某些系统API进行交互时),确实很难避免使用可选选项-在许多情况下,我们可以使用某些技术来摆脱可选选项。 懒惰胜于非可选的 一种避免使用属性的可选选项的方法是通过使用惰性属性,该属性需要在创建父对象之后创建值(例如,视图控制器中的视图,应在loadView()或viewDidLoad() )。 惰性属性可以是非可选的,但仍不需要在其父级的初始化程序中创建。 它将在首次访问时创建。 让我们从之前更新TableViewController ,以为其tableView使用惰性属性: 没有可选项,没有不确定的状态! 🎉 适当的依赖项管理比非可选的可选项更好 可选项的另一个常见用法是打破循环依赖关系。 有时您会遇到A依赖于B ,但B也依赖于A 。 像这样的设置: 正如我们在上面看到的,我们在UserManager和CommentManager之间具有循环依赖关系,其中它们都不假定彼此拥有所有权,但是它们在逻辑上仍然CommentManager 。 那只是等待发生的错误! 😅 为了解决上述问题,我们改为让CommentComposer充当中间人,并负责通知UserManager和CommentManager已经作出评论: 这样, UserManager可以保留对CommentManager的强引用,而无需任何保留(或依赖)周期: 我们再次删除了所有可选内容,并提供了可预测的代码! 🎉 优雅地崩溃 在上面的示例中,我们看到了一些示例,在这些示例中,我们可以调整代码以通过删除可选项来消除不确定性。 但是,有时这是不可能的。 假设您正在加载包含应用程序配置的本地JSON文件。 这本质上是一个可能失败的操作,因此我们将需要添加一些错误处理。 如果配置无法加载,则继续执行程序会使应用程序处于未定义状态,因此在这种情况下最好崩溃。 这样,我们可以获得崩溃报告,并希望我们的测试和质量检查流程能够早于解决此问题并将其送达用户。 […]

在设备上安装iOS测试版本

本简短说明描述了如何在Xcode版本10.1(10B61)中开发的iOS应用程序安装到要用于测试的iOS设备上。 请注意,您可以改为使用Xcode将应用程序安装到目标设备上,但这并不总是一种选择。 例如,如果您想在同事的设备上安装您的应用,而您没有物理访问权限,则将无法执行此操作。 转到Apple Developer网站。 在“设备”部分中添加您iOS设备的UDID。 从几个月前开始,您现在需要使用Apple Configurator 2应用程序来获取设备的UDID。 在Xcode中找到您一直在使用的开发人员证书来对您的应用程序进行签名。 记下其名称-创建配置文件时将需要它的名称。 添加与您的应用程序包标识符匹配的应用程序标识符。 例如,如果您的捆绑包标识符是“ com.mystartup.myapp”,则将其用作应用程序标识符的ID值。 创建一个配置文件。 这会将开发人员证书链接到供应配置文件。 选择“ iOS应用程序开发”类型。 选择您刚刚创建的应用程序标识符。 选择您的开发人员证书。 选择您希望针对应用程序安装的设备UDID。 给配置文件命名。 下载配置文件,然后双击它以使其在Xcode中可用。 在Xcode中,将配置文件与您的应用程序项目相关联。 禁用自动代码签名管理。 为所有签名配置选择已安装的配置文件-关闭自动代码签名后,这些文件就会出现。 生成应用。 选择产品/归档。 创建存档后,选择新的存档,然后单击“分发应用程序”。 选择开发作为开发方法。 如果要定位到特定的iOS设备,请使用App Thinning。 如果选择此选项,将减小输出文件的整体文件大小。 选择用于签署应用程序的开发人员证书(在上面已注明其名称)以及最近安装的配置文件。 创建完成后,选择一个位置来保存您的构建。 在iOS设备上安装应用程序所需的生成文件的扩展名为.ipa。 在目标设备上安装该应用程序。 安装Apple Configurator 2。 将iOS设备连接到计算机。 将.ipa文件拖放到用户界面中的设备上以进行安装。 如果一切都按计划进行,则应在轻按时启动该应用。 否则,您将遇到问题。

使用Swift在iOS中创建自定义进度栏

当我开始开发自己的iOS应用程序时,经常会遇到需要自定义某些内置UI元素以满足应用程序需求的需求。 对我来说,其中一个就是自定义进度条 。 在本文中,我将介绍构建自定义进度栏的基础知识。 首先,有助于了解内置的UIProgressView。 当我说理解时,我指的是XCode的“属性”检查器中显示的关键属性,例如“ 进度”,“跟踪”和“进度”值 。 进度色 -用于前景层以显示进度。 跟踪色调 —在背景层中使用,以显示进度条的轮廓。 进度值 -保持当前进度状态的指针值 让我们开始构建自定义进度栏部分。 要求是创建一个圆形进度栏。 在自定义视图中使用UIBezierPath()创建路径。 创建两个CAShapeLayer- 一个用于前景,另一个用于背景。 通过操纵StrokeEnd值设置进度。 类声明如下所示: class ProgressBarView:UIView { var bgPath:UIBezierPath! var shapeLayer:CAShapeLayer! var progressLayer:CAShapeLayer! } UIBeizerPath使您可以通过添加一组线,弧,曲线并将其渲染到自定义视图中来创建从简单路径到复杂多边形的所有内容。 因此,首先使用它定义进度条的路径。 对于我们的示例,我创建了一个循环路径。 私人功能createCirclePath(){ 令x = self.frame.width / 2 令y = self.frame.height / 2 让中心= CGPoint(x:x,y:y) bgPath.addArc(withCenter:center,radius:x / CGFloat(2),startAngle:CGFloat(0),endAngle:CGFloat(6.28),顺时针:true) bgPath.close() } 我已使用addArc()方法绘制一个圆,将startAngle和endAngle参数指定为弧度 。 其他方法(如addLine(),addCurve(),addQuadCurve())也可以用于创建路径。 […]

Swift中的通知(NSNotification)

在Swift中,可以通过以下几种方式在应用程序中的实体之间进行通信:通知(NSNotification),键值观察(KVO),委托等。在系列文章中,我将分享如何为工作选择合适的工具以及一些最佳做法。 这是关于通知的。 通常将通知与代表进行比较。 您可以在我的文章 Swift中的Delegate中 找到更多信息 。 Notification对象是包含与更改或事件有关的信息的容器。 通知使用NotificationCenter的集中实例进行广播。 用name标识的Notification对象可以包含对发送通知的object引用,以及userInfo词典中的一些任意信息。 NotificationCenter注册观察者并传递通知。 对象使用NotificationCenter实例发布和观察通知。 每个应用程序(进程)都有一个默认的通知中心,可通过NotificationCenter.default属性访问。 请注意,在macOS上, DistributedNotificationCenter 可用于在进程之间进行通信。 出于演示目的,我创建了URLContainer示例类,该示例类存储URL对象数组。 类 URLContainer { 私人(设置)的var网址:[ URL ] = [] func add(_ url: URL ){ urls.append(url) } } 创建通知 要创建新通知,我们需要一个名称。 名称使用嵌套的NSNotification.Name类型。 引擎盖下的名称实际上是字符串,因此,最好使用唯一的名称。 最佳做法是为名称声明一个常量。 我更喜欢使用常量名称作为字符串,这与Cocoa / Cocoa Touch中使用的便利相同。 // URLContainerextension Notification.Name {static let URLContainerDidAddURL = NSNotification.Name (“ URLContainerDidAddURL ”)} URLContainerDidAddULR是发生更改时发布的通知的名称。 使用Notification.Name扩展名Notification.Name […]

UIScrollView和AutoLayout

自iOS 2.0起,UIScrollView就已经存在了。 但是,也可以使用AutoLayout配置滚动视图! 由于AutoLayout可以为您完成此操作,因此可以大大减少计算内容大小所需的代码量! 另外,它适用于风景和肖像。 配置UIScrollView 将UIScrollView拖到故事板上的视图控制器中。 将UIScrollView固定到整个视图。 配置内容视图 现在,在UIScrollView中创建一个名为ContentView的UIView。 这是我们所有内容的放置位置。 让我们将其固定到滚动视图! 关键的步骤到了。 再添加一个约束以消除那些令人讨厌的自动布局错误。 使内容视图与视图的宽度相等。 和繁荣,你完成了! 测试出来 内容视图中的所有视图应具有足够的约束,因此AutoLayout知道可以扩展多少内容大小。 我决定使用UIStackView来减少约束数量。 修复导航控制器中的填充 快速提示,如果您将此视图控制器嵌入到导航控制器中,则需要取消选中“视图控制器”中的“调整滚动视图插图”; 否则,您将获得额外的填充。 的GitHub 完整项目可在GitHub上获得

iOS:Animate TableView更新

重新加载数据的更好方法 坦白地说: tableView.reloadData仅存在两个原因: 加载初始数据 激怒你的内部完美主义者 大多数数据驱动的应用程序都使用服务器来获取新数据,然后在表视图中显示此数据。 重新加载数据时,集合中的某些项目可能不会更改,或者集合可能仅添加/删除了一些项目,而不会影响所有其他项目。 在tableView上调用.reloadData()将立即更新tableView ,滚动位置将不明确。 不是最佳的用户体验,对不对? 在大多数情况下,您都希望通过漂亮的动画流畅地更新适当的节和行,而没有任何轻拂,跳跃或滚动。

使用Swift4从iOS应用发送电子邮件

用于管理,编辑和发送电子邮件的标准界面。 因此,让我们先从UI开始。 我们将为应用程序准备UI,在这里,我们将使用UITextFields和UIButton如下所示。

对iOS贴纸包进行代码签名

因为我一直忘了如何… 由于某种原因,自动代码签名不适用于我的应用程序。 苹果使贴纸包装的过程比标准应用程序更加复杂。 因为每次执行此操作时都会忘记有效的方法,所以我在下面记录了该过程。 这适用于iOS 11-如果情况发生变化,我将对其进行更新。 显示项目导航器,然后单击顶层,它将是您的应用程序/贴纸包名称。 在“项目”下Xcode的第二列中,单击您的应用名称,然后单击“构建设置”(第三列),并在“代码签名身份”下确保它们都是iOS Developer。 在Xcode的TARGETS下的第二列中,单击您的应用程序名称,然后在General(第三列)下单击: 签名:取消选中“自动管理签名”。 签名(调试):选择通过开发​​者帐户设置的分发配置文件。 这将具有包标识符,例如com.domain.AppName。 签名(发布):与“调试”相同。 现在,单击第三列中的“构建设置”,然后向下滚动到“代码签名身份”。 对于“调试和发布”,请选择“ iOS开发人员”,对于“任何iOS SDK”,请选择“ iOS发行版”。 确保您还在此处选择您的开发团队。 我还停留在步骤3中使用的Provisioning Profile中。 这是把戏! 为标签扩展名创建单独的应用程序ID和配置文件。 对于应用程序ID,请使用通配符版本(例如com.domain.appName。*)。 然后将此应用程序ID用于新的分发配置文件。 两个配置文件使用的证书必须相同。 使用手动签名,并将通配符分发配置文件分配给贴纸包扩展名。 这样可以使您成功存档该应用程序。 当您将其上传到Apple时,您将需要再次手动分配分发配置文件! 我认为问题是由于“ app”和StickerPackExtension具有不同的捆绑标识符,这意味着它们需要不同的供应配置文件。

介绍Bitrise上的模拟器的Xcode构建

您需要创建应用程序的演示版吗? 没问题! 使用 Bitrise 的新步骤构建.app文件, 并将其上传到模拟器。 我们已经推出了新步骤的Beta版: 用于模拟器的Xcode构建 。 此步骤将在iOS模拟器目标位置运行xcodebuild命令并生成一个.app文件,然后可以在模拟器上运行该文件。 .app文件可以上传到Appetize.io进行演示,测试等。 在Xcode build for simulator运行Xcode build for simulator之后,可以添加Appetize.io deploy 。 在此处阅读有关Appetize集成的更多信息。 该步骤所需的输入 : project_path :项目(或工作区)路径 配置:要使用的配置。 scheme :要使用的方案。 Simulator_device :模拟器名称。 (例如:iPhone 6s Plus) Simulator_os_version :操作系统版本。 (最新的11.4等…) Simulator_platform :iOS模拟器/ tvOS模拟器 步骤输出: BITRISE_APP_DIR_PATH:生成(并复制)的应用程序目录 BITRISE_APP_DIR_PATH_LIST :此输出将包括主要目标应用程序的路径+每个相关目标的应用程序路径。 路径以`|字符分隔,例如: /deploy109787178/sample-apps-ios-workspace-swift.app|/deploy109787178/bitfall.sample-apps-ios-workspace-swift-watch.app | /deploy109787178/sample-apps-ios-workspace-swift.app|/deploy109787178/bitfall.sample-apps-ios-workspace-swift-watch.app BITRISE_XCODE_BUILD_RAW_RESULT_TEXT_PATH:这是原始构建结果日志文件的路径。 如果output_tool=xcpretty并且构建失败,则此日志将包含构建输出。 将iOS构建为模拟器的积极方面:您无需对项目进行代码签名(无需证书/无需配置文件)。 😎 让我们知道它是如何工作的,我们感谢所有反馈。 建设愉快! 最初发布在 Bitrise博客上 […]