Tag: swift

尝试! Swift Indiaで登坛します🇮🇳#tryswiftindia

尝试! 迅捷会议 尝试! Swift是一个沉浸式社区,聚集了有关Swift语言最佳实践,Swift中的应用程序开发… www.tryswift.co 今年11月19日(日),インドのバンガロールで开催予定の尝试! 斯威夫特印度にて登坛することになりました🎤🇮🇳 最近的7月15日日にベラルーシのシンスクで开催されたMobile Optimized 2017にて登坛しました🎤🇧🇾 MobileOptimized 2017で登坛します! 来周末の7月15日(土),ベラルーシの首都ミンスクで开催されるMobileOptimized 2017で登坛します🎤🇧🇾 medium.com いま iOSDC Japan 2017で非常に盛り上がっていて気になっているのですが, 试试! Swift印度での登坛が决まったのでCfPは见送りました。今朝ざっと见て250本以上の応募が集まっていてすごいですね。iOSDCは个人スポンサーチケットを买っているので楽しみにしています☺️

我如何自学iOS 11,Swift 4和Metal2 API,ARKit,并在2Weeks中制作了原型。

学习新知识很困难,但是当您通过实际编写不同的小型应用程序连续获得小额成功时,事情会变得更容易。 我强烈推荐两周前我已经从udemy购买的这门课程,我没有推荐这门课程的佣金。 https://www.udemy.com/ios-11-app-development-bootcamp/ 它具有iOS11,Swift 4和ARKit,以及许多其他功能,例如营销和设计。 我学习金属的方法是在一开始就编写一些小东西。 首先,我了解系统体系结构到底发生了什么。 Swift中的Metal 3D图形简介 前苹果工程师沃伦·摩尔(Warren Moore)最近被Swift语言用户小组拦下,对3D进行了介绍。 news.realm.io 然后我去学习有关Metal和Swift3的本教程 Swift 3的Metal教程第1部分:入门 更新:本教程已针对Xcode 8.2和Swift 3进行了更新。在iOS 8中,苹果发布了自己的GPU API … www.raywenderlich.com 入门金属–第2部分:入门 在本视频教程中,您将开始学习有关GPU并行处理和Metal管道的知识。 videos.raywenderlich.com Swift 3的Metal教程第3部分:添加纹理 更新:本教程已针对Xcode 8.2和Swift 3进行了更新。欢迎回到我们的Swift 3 Metal教程系列! 在… www.raywenderlich.com Swift 3的金属教程第4部分:照明 更新:本教程已针对Xcode 8.2和Swift 3进行了更新。欢迎回到我们的iOS Metal教程系列! 在里面… www.raywenderlich.com 带有Swift第5部分的iOS Metal教程:切换到MetalKit 更新9/30/16:本教程已针对Xcode 8和Swift 3进行了更新。欢迎我们的iOS Metal教程的第5部分…… www.raywenderlich.com 然后我尝试使用GPU计算 计算处理| Apple开发人员文档 编辑描述 developer.apple.com 这样我就可以使用GPU计算1024 […]

在没有钥匙串和UserDefaults的情况下实施应用内购买

每个开发人员最终面临的应用内购买实施步骤之一是选择合适的购买记录持久性策略,这将使应用重新启动后可以访问付费内容。 坚持购买的最明显方法是在UserDefaults中存储一些值,该值将指示某些内容是否已解锁。 Owen Brown和Pietro Rea在UserDefaults上的两个教程中展示了这种方法,其中UserDefaults用于存储布尔标志以指示非消耗性产品的购买状态,以及Date实例以保留订阅到期日期。 由于缺少数据完整性保护,因此通常会批评这种解决方案,因为UserDefaults存在的内容作为普通二进制plist存储在应用程序捆绑包的“首选项”文件夹中,因此用户可以使用iMazing,iFunBox或iExplorer等软件进行编辑由AndrésIbañez在他2014年的帖子中展示。 尽管这是事实,但我想提一下,自从iOS 8.3开始,Apple在文件系统访问中引入了严格的权限限制,从而消除了从非越狱设备上从外部访问应用程序内部文件的权限。 说到越狱,值得提醒的是,近几年来它的流行性一直在下降,以至于先驱者说越狱已经死了。 从个人观察,我可以说,为最新的iOS版本发布越狱需要花费更多的精力。 从iOS 10开始,黑客至少需要6个月的时间才能越狱,普通的iOS用户可以使用。 这就是为什么我认为应用程序用户的任何重要部分篡改应用程序文件的机会都非常低的原因。 尽管如此,使用Keychain代替UserDefaults并不需要花费很多精力,如Axel Kee在他的帖子中所示。 原理是相同的-存储类似“购买”的字符串,作为购买产品的标识符。 值得一提的是,由于iOS 11(以及iOS 10.3 Beta)在卸载应用后会删除钥匙串中与应用相关的所有记录,因此,如果您希望在应用安装之间坚持进行应用内购买,则钥匙串将无济于事不再。 但是,还有另一种方法可以检查用户是否购买了某些东西,而无需依赖UserDefaults或Keychain而是使用收据,该收据在每次购买时都会由OS自动更新。 即使为此目的使用收据的想法已在Apple的“应用内购买编程指南”中明确记录,但似乎这种方法在第三方教程中并未引起注意。 造成这种情况的一个原因可能是这种持久性策略仅适用于非消耗性产品和自动续订的订阅。 如果您正在实施消耗性或非续订性订阅,那么您将拥有钥匙串或iCloud。 应用收据使用的第二个障碍是其复杂的结构,需要大量的技巧才能读取必要的信息。 Bill Morefield的教程很好地展示了在没有第三方依赖的情况下在Swift中读取应用收据所需要的内容。 值得庆幸的是,来自Cocoanetics的人们创建了一个Kvitto库,使使用应用程序收据的工作变得轻松。 最近,我使用应用程序收据作为购买的永久记录,在名为电子工程师助手的应用程序中成功实现了非消耗性购买和自动续订。 InAppPurchaseManager读取收据的方法如下所示: 该方法的前4行检查是否存在IN_APP_PURCHASE环境变量,该变量可在使用模拟器时轻松模拟各种应用内购买。 您可以在Axel Kee的这篇文章中阅读有关使用环境变量模拟应用内购买的更多信息。 该方法的其余部分只是通过比较产品标识符来解析收据以找到相关条目,并使用switch语句内的元组以及三元运算来返回适当的购买状态。 另一种值得签出的方法是paymentQueue(_:updatedTransactions:) : 在这种方法中,我仅将事件转发到BehaviorRelay (RxSwift库中的类),并在处理完所有交易后从应用收据中读取购买状态。 您可以在此要点中查看我的InAppPurchaseManager的完整代码。 多亏了RxSwift , Kvitto和应用程序收据,实现了应用程序内购买的实现并没有造成太大麻烦。

在Swift项目中设置C库依赖关系(第1/2部分)

可以很简单。 建立C库依赖关系的一种简单方法是在Xcode中建立一个快速项目时使用公共标头。 第一步:创建一个快速项目 Xcode->新建->项目->可可触摸框架->语言:Swift->下一步。 我将项目命名为CDependencyTutorial 。 第二步:设置项目依赖项 我有一个名为ExampleCLibrary的静态C框架。 将ExampleCLibrary.xcodeproj拖到CDependencyTutorial项目中。 第三步:调整一些项目设置 选择目标CDependencyTutorial- > general- >链接的框架和库-> Add libExampleCLibrary.a 。 转到构建阶段->标头->将ExampleCLibrary.h拖到Public中。 转到CDependencyTutorial.h ,添加 要下载该项目吗? 点击这里。 如果您想知道我是如何解决此问题的,请查看第2部分。您是Twitter用户,想与我讨论吗? 我的推特:@humlelu。

iOS的Menerapkan MVP

MVP merupakan sebuah设计模式yang merupakan singkatan dari模型视图演示者。 Selain MVP terdapat设计模式Yang Menurut Saya Cukup Bagus,Yaitu MVVM。 Mengapa kali ini saya membahas MVP? Alasannya Adalah karena saya sedang terlibat projek yang menerapkan MVP。 简单! 😀 阿帕杨膜MVP spesial?。 iOS用户界面UIViewController,UIViewController ini biasanya berisi barisan kode campuran antara kode UI,kode bisnis,dll sehingga membuat UIViewController berisi banyak sekali barisan kode。 MVP成员membuat pemisahan […]

斯威夫特如何穿越客观海(第1部分)

Objective-C是一个流动性很强的实体,它不会很快消失。 尽管Swift的机翼可以帮助它在天空中飞翔,但它有时可能会潜入Objective-C捕捉食物。 这是一系列Swift和Objective-c互操作性块的开始。 Swift向Objective-C公开了自己的私人代码 Swift有一个称为private的私有访问修饰符,这意味着只有其作用域内的事物才能使用它。 Objective-c没有隐私,而是隐藏的; 如果知道方法/变量的名称,则可以访问它。 假设我们有一些快速的代码,如下所示: 类静音:NSObject { 私人var名称=“ moe” 私人功能sayName()->字符串{ 返回名称 } } 因为没有公共访问权限,所以班上没有人可以访问它。 Mute()。name //不编译 您可以通过添加@objc来将Swift的真实隐私换成Objective-C的那种隐私 类静音:NSObject { @objc私人var名称=“ moe” @objc private func sayName()->字符串{ 返回名称 } } //这样调用 m.value(forKey:“ name”)//“ moe” m.value(forKey:“ sayName”)//“ moe” m.perform(“ sayName”)。takeRetainedValue()//“ moe” m.performSelector(onMainThread:“ sayName”,带有:nil,waitUntilDone:true) 在我的脑海中,您可以在目标操作模式(也就是任何选择器式API)中使用此策略。 var button = UIButton(frame:CGRect(x:0,y:0,width:100,height:100)) func initButton(){ self.addSubview(button) button.addTarget(self,action:#selector(tappedButton),用于:.touchUpInside) } @objc私人功能tappedButton(){ 打印(“做某事”) […]

Xcode扩展

在今年的WWDC期间,Apple宣布了Xcode Source Editor Extensions,这是一种扩展我们最喜欢的工具的功能的简便新方法。 如果您对如何利用其功能提高生产力感到好奇,请继续阅读。 软件开发行业中许多聪明的人都认为我们的职业是一种手工艺。 这种隐喻的一个方面尤其是真实的-工具。 伟大的工匠需要伟大的工具,但是随着谚语的流逝, “一个坏工人总是责备他的工具” 。 Christoph Gockel提醒我们,我们应该“为工作选择合适的工具”,如果没有,我们应该创建自己的工具,这正是我们要做的。 Xcode曾经有大量的第三方插件。 “习惯于”,因为Xcode 8将不再支持它们。 这是一个非常令人遗憾的消息,但是这样做的理由特别充分(与安全性和可靠性有关)。 苹果还知道工程师不喜欢抽空并阻止我们做一些不负责任的事情,例如剥离IDE的代码签名,他们为我们提供了一种构建自己的自定义工具的新方法。 WWWC演讲很好地描述了新的可能性,但是在App’n’roll,我们知道最好的学习方法是弄脏双手。 JSON模型 你们中的许多人可能在应用程序中使用了网络,因此您有时会不得不解析JSON并为其编写模型。 IDE可以为我们完成这项任务,因此我们决定为其编写扩展。 为了简单起见,我们必须做一些假设。 首先,我们希望当前编辑的文件的内容必须为JSON。 其次,我们将忽略与嵌套对象有关的边缘情况。 重要说明:我们的示例是使用Xcode 8.0 beta 2创建的,因此它可能无法始终按预期运行。 如果您仍在使用El Capitan,则必须遵循Xcode 8.0 Beta发行说明中的​​说明-Xcode 8.0 beta中的已知问题-IDE,源代码编辑器扩展。 另外,请记住在运行扩展程序时要耐心等待。 如果您打开项目的速度太快(在扩展加载之前),则无法从测试Xcode实例的菜单中使用它。 让我们首先创建一个新的macOS项目(确保选中“单元测试”框),然后将新目标添加到默认应用程序中-Xcode Source Editor Extension : 这将为我们和两个新类创建一个Info.plist 。 在深入研究代码之前,我们先来看一下Plist 。 要更改Xcode菜单中显示的名称,您必须编辑Bundle Name和XCSourceEditorCommandName。 首先为我们生成的类会向XCSourceEditorExtension进行确认,并会在加载扩展时通知我们。 我们不会在项目中对其进行修改。 第二类向XCSourceEditorCommand确认-一种仅具有一个方法的协议- 执行(使用invocation: , complementHandler :)将在我们调用命令时执行。 该扩展名将为我们提供当前文件的内容以及修改它的方法。 […]

Swift中的禁止@inline属性

最初发布于 swiftrocks.com 。 @inline属性是Swift中那些晦涩的事物之一-在苹果的文档中找不到它,它不能帮助您编写更@inline代码,也无济于事,只能帮助编译器做出优化决策,但这与一个非常重要的问题有关。应用性能的一个方面。 在编程中, 函数内联是一种编译器优化技术,它通过直接用方法的内容替换对某些方法的调用来消除调用某些方法的开销,基本上是假装该方法根本就不存在。 这极大地提高了性能。 例如,考虑以下代码: func calculateAndPrintSomething() { var num = 1 num *= 10 num /= 5 print(“My number: \(num)”) } print(“I’m going to do print some number”) calculateAndPrintSomething() print(“Done!”) 假定在其他任何地方都没有使用calculateAndPrintSomething() ,那么很明显,该方法不需要存在于已编译的二进制文件中,其目的只是为了使代码更易于阅读。 通过函数内联,Swift编译器可以通过将其替换为内容来消除调用无用方法的开销: //The compiled binary version of the above example print(“I’m going to do print some number”) var num = […]

Xcode,终极的调试和破解工具

调试一直是我在计算机上的一部分经验,甚至在学习编码之前也是如此。 但是,展开二进制文件和修改程序行为的满意度从未如此轻松。 通常,调试包括从十六进制编辑器来回切换到调试器,应用程序,终端,计算器等,更不用说程序退出了,您必须遵循很长的配方,直到调试会话突然结束。 不好… 但是几个月前,以破解适用于macOS的Twitter为借口,我决定最小化此问题并优化此流程。 这就是Xcode进行救援的时候。 设定 首先,我们需要创建一个以Cocoa框架为目标的Xcode项目。 调试 我们将使用嵌入式lldb控制台进行动态调试。 想象一下,适用于macOS的Twitter是我们要调试的应用程序。 通常,我们需要运行lldb并从调试器启动该进程,相反,每次我们单击Run按钮时,Xcode都会为您执行此操作。 为此,请在我们框架方案的“运行”配置中选择Twitter应用程序作为可执行文件。 这样,将编译我们的框架,并在进程附加了lldb的情况下启动Twitter应用程序。 注入代码 到目前为止,我们所做的可能已经足够了,我们可以轻松地创建针对应用程序的调试会话,还可以利用Xcode提供的自动完成功能。 但是注入代码呢? 代码注入通常涉及编译动态库并修补二进制文件,以便它链接到我们的库。 尽管如此,调试注入的代码仍然是一项繁琐的任务,并且尽管我们始终可以使部分代码自动化,但该过程缓慢而重复。 现在,借助Xcode灵活的配置方案和一些魔术,我们可以轻松修补正在检查的应用程序的运行时,而无需修改其二进制文件(双赢)。 例如,让我们注入一些代码,记录每次对viewDidLoad调用。 Cocoa Framework项目模板创建一个名为nameOfTheProject.h的头文件。 我们将创建其各自的.m文件,并将混乱的逻辑放入其中。 照原样,Xcode将编译我们的框架,并在调试器附加到其过程的情况下启动Twitter应用程序。 链接这两者就像使用环境变量运行过程一样容易,该环境变量迫使位于给定路径上的库加载。 这个环境变量是DYLD_INSERT_LIBRARIES ,是我们库${TARGET_BUILD_DIR}/${TARGET_NAME}.framework/Versions/A/${TARGET_NAME}的路径。 在方案的“运行”配置的“ 参数”选项卡中设置环境变量后,单击“运行”按钮。 我们的代码应该已经正确注入到Twitter流程中。 还不够好? Xcode提供的所有其他调试工具也都可用,从视图层次结构到内存图调试器。 加起来 无论您是否进行逆向工程,我都建议您尝试一下,也可以使用TwitterX来获得有关此设置功能的更多信息。

在Swift中实时/热加载

让我们谈谈样式。 我非常高兴能迅速分享一个我称为Styler Durden的造型概念。 它使您可以通过代码实时地为应用程序设置样式……这是实际的: 我正在直接使用Swift代码实时设计我的应用程序! 无需等待xcode编译更改。 这超出了样式,但是我想专注于样式,因为我认为这对我作为iOS开发人员来说是一个主要的痛点。 我怎样才能做到这一点? 我结合使用了分离的样式和一个名为Injection III的出色工具 这是我做样式最多的代码: 导入MulticastDelegateSwift 协议StylesDelegate:类{ func更新(样式:样式) } 类样式{ 让代表= MulticastDelegate () 静态让fontColor = UIColor(红色:0,绿色:0,蓝色:0.1,字母:1) 静态让字体= UIFont.preferredFont(forTextStyle:.title1) 静态let backgroundColor = #colorLiteral(红色:0.9,绿色:0.4,蓝色:0.6,阿尔法:1) func title(_标签:UILabel){ label.textColor = Styles.fontColor label.textAlignment = .center label.font = Styles.font } func字幕(_标签:UILabel){ label.textColor = Styles.fontColor label.textAlignment = .center label.font = Styles.font.withSize(12) label.numberOfLines = 0 } func […]