服务端Swift

原文:Hello Server Side Swift

作者:Logan Wright

译者:CocoaChina--kmyhy(博客)

自从苹果官方发布了一个 Swift 的 Linux 开源版本之后,服务端 Swift 终于迎来了一个令人激动的前景。我的好奇心终于无法克制,是时候尝试一下服务端 Swift 了!

除了用过几个 Baas 以外,我没有任何后端编程经验,但幸运的是开源社区已经提供了现成的框架。我试了一下Tanner Nelson 推荐的 Vapor 框架。它的使用非常简单,非常适合我当前的任务,在这篇文档中还会使用到 Heroku。我决定使用 Heroku 的原因是我们的后端团队在使用它,它对于前端来说非常友好。

写到这里的时候,为了解决 Heroku 框架运行中的几个小问题,我专门提交了一个 pull request 。如果代码还没被合并的话,请设置你的包管理器从 这里 下载。

安装

要继续本教程,首先,你需要一个 Heroku 账号 ,并安装好 Swift Development Snapshot 。写到这里的时候,在它的正式版中还未包含 swift 包管理器。因此为了使用这个工具,你必须下载开发版的 snapshot。

开始

我们的目标是创建一个简单的 Swift 服务器并运行在 Heroku 上。这不需要在 linux 环境下进行,就像是你在使用本地服务器。你只消创建一个本地的 Xcode 项目,对项目进行一些设置,然后就可以在 Swift 包管理器 中运行它。整过过程分为 4 个步骤:

将 main.swift 拷贝根目录下的 Sources 目录

创建一个 Package.swift 文件

将 .build 目录添加到 import paths

要使用自动补全和语法加亮功能,需要将 Swift 包管理器的 build 目录提交到 import paths 中。注意,在 import paths 的 Debug 中设置的 debug 目录,而 Release 项则输入 release 目录。

用 toolchain 运行 Xcode

如果你使用 Xcode 7.3,你可以用 Xcode > Toolchains 菜单开启一个Xcode 实例,用于打开 swift snapshot。因为我们不能在 Xcode 中进行编译,我们只能以命令行的方式进行编译。

编写服务器

令我高兴的是,为了进行概念验证,我需要编写的代码其实只有寥寥数行。我启动和运行服务器的代码甚至不到 10 行。

要启动服务器,只需在终端中输入一句命令,:

好了,让我们打开浏览器。我的浏览器安装了 json 插件,你的画面或许会有不同。

迁移到云上

服务器在本地顺利运行起来了,但如果放到云端则更好。我迫不及待地想将 App 在云上跑起来。对于我来说这是一个全新的挑战,幸运的是,我得到了 Vincent Toms 的悉心指导。

Heroku 的安装是一件非常愉悦的体验,几分钟后我就创建了一个 Heroku App,接下来我就要上传我的项目了。

出错啦

这只是今天的诸多错误中的一个。我已经预计到事情不可能一帆风顺,因此我查看了 Vapor 的文档,最终发现问题出在所谓的 buildpacks 上。Heorku 提供了一些标准的 buildpacks,但完全没有针对 Swift 的 buildpacks。无奈之下求救于开源社区,刚好看到 Kyle Fuller 的 buildpack 。集成它就简单得多了。

用这个 buildpack 启动后,App 成功加载,接下来就是访问它的 URL。

再次出错

事情不会那么顺利的,是吧?经过 google 一番,仔细查看了一些例子,我发现我还差一个 Procfile。浏览一下这个文件的内容,你就能明白这个文件是干什么用的了。

buildpack 创建了可执行文件,但 Heroku 并不知道。通过 Procfile,我们告诉 Heroku 去运行 SwiftServerIO 可执行文件。上传这个 Procfile。

仍然出错

Heroku 编译的 2 分支仿佛变得无比漫长。我重新打开了浏览器,发现仍然报错。

我以为 Heroku 可能还未启动完成(实际不是),因此我又等了一小会,终于发现出错了。可执行文件生成了, process file 也就绪,一定是别的什么地方出问题了。再次 google,一直到我最终发现我需要设置 App 的规模(scale up)。这要使用到 Heroku 的 toolbelt 中的一个简单命令。

heroku ps:scale web=1

Heroku 在免费情况下只有一个 dyno(Heroku 计费单位,10~50 个请求/秒)。但对于我们的简单服务器来说,这也够了。因此,在我们将 scale web 设置为 1 个 dyno 之后,再次用浏览器查看。

成功了!

成功了!服务器启动,出现了万能的 hello world!经过一番欢呼雀跃之后,让我们真正来问一声好吧!

响应请求

在 main.swfit 文件中添加一小段代码,让服务器在问好的同时能够因人而异。就微微偷一下懒,新加一个路由,让服务器根据输入输出不同的问候语。

一切正常,但根据一般规律,我仍然做好了出错的心理准备。提交修改,push 代码到 Heroku。

Say Hello!

大约一份多钟的编译之后,在浏览器中访问 URL,服务器返回了问候语。你可以在这里查看效果 。

接下来是什么?

可以说,服务端 Swift 的今天离不开社区强大支持。对于我来说,能够从云端获取 JSON 是一个令人兴奋的开始,我已经迫不及待地想看看接下来还会发生什么。

当然在此之前,我不得不和我在 Intrepid Pursuits 的同事们一起,继续编写一个有一个 iOS App。如果你想了解我的最新动态,请在访问我的 Github 或者 Twitter

服务端 Swift

附言

在 这里 下载源代码。

在 Journal 文件夹中,是 step-by-step 指南。

时间: 2024-10-22 15:32:33

服务端Swift的相关文章

Swift3.0服务端开发(二) 静态文件添加、路由配置以及表单提交

今天博客中就来聊一下Perfect框架的静态文件的添加与访问,路由的配置以及表单的提交.虽然官网上有聊静态文件的访问的部分,但是在使用Perfect框架来访问静态文件时还是有些点需要注意的,这些关键点在其官方文档上并未提出.今天我们要做的事情就是通过浏览器访问静态文件,然后在静态文件中使用form表单往指定的路由上进行提交相应的数据. 一.静态文件的添加与访问 1.未使用Xcode管理的Perfect的静态文件根目录的配置 在PHP开发或者Java Web开发中,都有一个根目录来存储相应的静态文

直播技术(从服务端到客户端)二

播放 在上一篇文章中,我们叙述了直播技术的环境配置(包括服务端nginx,nginx-rtmp-module, ffmpeg, android编译,ios编译).从本文开始,我们将叙述播放相关的东西,播放是直播技术中关键的一步,它包括很多技术如:解码,缩放,时间基线选择,缓存队列,画面渲染,声音播放等等.我将分为三个部分为大家讲述整个播放流程: Android 第一部分是基于NativeWindow的视频渲染,主要使用的OpenGL ES2通过传入surface来将视频数据渲染到surface上

JavaScript(React Native、Node.js等)移动、服务端通吃的全栈语言

作者:李宁老师 东北大学计算机专业硕士.曾任沈阳东软股份项目经理.51CTO学院签约讲师.从事软件研究和开发超过20年.长久以来一直从事Java.Android.iOS.C++.Swift.Objective-C以及跨平台游戏引擎(Cocos2d-x.Unity3D等)的开发和技术指导工作.对国内外相关领域的技术.理论和实践有很深的理解和研究. 主要著作包括<Cocos2d-x实战游戏开发指南>(即将出版).<Swift权威指南>.<Android深度探索 卷1和卷2>

奔五的人学IOS:一个好的应用最终还是要由服务端来支撑其功能,兼谈几个免费云空间

学习ios-swift有一段时间了,一些基本控件的使用应该是没有问题了.但一个好的应用最终还是要由服务端来支撑其功能,为了练习各种控件的使用,想找网站上现有的api并且内容又是你想要的,可能性很小,如果是已经有了该api,那一定是已经有了相应的app了. 基于以上原因,想要练习app,那就先弄api吧. 首先就从csdn入手了,考虑弄一个csdn的资讯app,直接抓取csdn的页面吧?这个思路有考虑过,但这个需要由swift来解析页面内容,感觉需要一定的功能才行,查了一下swift还没有类似的解

java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并

实现效果图: eclipse项目中初步整合之前的各个客户端和服务端的窗口与工具类,效果如下图: 已将注册服务器线程RegServer功能放到LoginServer中,使用客户端与服务端的request请求机制,根据请求是注册还是登录,分别进行相应response,客户端根据相应内容判断下一步操作. 发送信息的模式还较为原始,没有使用json方法,但gson包已经导入,支持发送键值对的字符串,及自动解析. 登录对话框LoginDialog类代码如下: package com.swift.frame

Spring Cloud官方文档中文版-服务发现:Eureka服务端

官方文档地址为:http://cloud.spring.io/spring-cloud-static/Dalston.SR3/#spring-cloud-eureka-server 文中例子我做了一些测试在:http://git.oschina.net/dreamingodd/spring-cloud-preparation Service Discovery: Eureka Server 服务发现:Eureka服务端 How to Include Eureka Server 如何创建Eurek

ssh 服务端安全配置

更改ssh服务端配置文件 [[email protected] ~]# vi /etc/ssh/sshd_config Port 59118                 #ssh 连接默认端口为22 ,更改后提高安全级别 PermitRootLogin no         #禁止root用户远程登录 PermitEmptyPasswords no    #禁止空密码登录 UseDNS no                  #不使用DNS GSSAPIAuthentication no  

Android客户端与PHP服务端交互(一)---框架概述

背景 作为一个普通上班族,总是想做一些自认为有意义的事情,于是乎准备成立一个工作室,尽管目前正在筹备阶段,但是之前有些朋友提出一些需求的时候,我发现自己的能力还是有限,直到最近和一些技术牛朋友聊起这事儿,大家不谋而合,也准备加入小团队.只是我作为工作室的“业务员”,感觉有必要都了解一下,这样才好和客户沟通,提出解决方案,也方便大家讨论订方案.譬如之前有商家提出的在线订单,要求客户可以使用APP直接下单,商家处理订单.当时我不是很懂,自己接不了,现在和朋友交流后,准备学习一下. 框架 ① 客户提交

基于NIO的消息路由的实现(四) 服务端通讯主线程(2)断包和粘包的处理

本来我打算单独开一章,专门说明粘包和断包,但是觉得这个事儿我在做的时候挺头疼的,但是对于别人或许不那么重要,于是就在这里写吧. 那么何谓粘包.何谓断包呢? 粘包:我们知道客户端在写入报文给服务端的时候,首先要将需要写入的内容写入Buffer,以ByteBuffer为例,如果你Buffer定义的足够大,并且你发送的报文足够快,此时就会产生粘包现象,举例来说 你发送一个 报文" M|A",然后你有发送了一个"M|B",如果产生粘包,服务端从缓冲区里面读出的就是"