Sur*_*gch 5 android ios swift server-side-swift
学习新技术是一个耗时的过程。它适用于带有 Java 的 Android。这又是针对带有 Swift 的 iOS 的。我现在面临着需要为 Android 和 iOS 应用程序提供服务器后端的挑战。但是,如果可能的话,我想避免学习一门新语言的大量时间投入。据我所知,服务器代码可以用 Java 或 Swift 编写,但 Swift 似乎是一种更简洁的语言,所以这就是我选择走这条路的原因。
我想制作一个概念验证示例,其中运行 Swift 的服务器能够与 Android 和 iOS 应用程序进行通信。应用程序发送请求并接收响应。
这个问题和我在下面的回答是我对服务器端 Swift 的介绍。
一个基本的例子涉及三件事:
这个答案的重点是 Swift 服务器。
这些说明基于名为Server-Side Swift的免费 Udacity 课程的第一单元。我建议采取整个事情。从那以后一直有更新,但它解释的很慢很清楚。
在本例中,我们将使用具有静态 IP 的 VPS。如果你没有,你可以从很多地方得到一个。LowEndBox有便宜的选择。我在这个例子中使用 Ubuntu Linux。您应该会收到服务器的 IP 地址以及 root 密码。
根据您的 VPS 已安装的内容,您可能想要/需要安装以下依赖项。
sudo apt-get install nano(文本编辑器,比 更直观vim)sudo apt-get install git swiftenv这将帮助您下载 Swift 服务器并管理不同的版本环境。该安装方向是很清楚。选择 Git 选项。
git clone https://github.com/kylef/swiftenv.git ~/.swiftenv
Run Code Online (Sandbox Code Playgroud)
如果您没有git或未curl安装,则首先需要它们:
sudo apt-get install curlsudo apt-get install git如说明所述,您应该将这些行添加到~/.bash_profile文件的末尾(或者在我的情况下是~/.bashrc)。
# swiftenv
export SWIFTENV_ROOT="$HOME/.swiftenv"
export PATH="$SWIFTENV_ROOT/bin:$PATH"
eval "$(swiftenv init -)"
Run Code Online (Sandbox Code Playgroud)
这将允许您随时swiftenv从命令行使用。要应用设置,请使用. ~/.bash_profile(或. ~/.bashrc)从命令行重新加载 bash 文件。
您可以直接下载 Swift,但使用swiftenv.
swiftenv install 4.0.2
Run Code Online (Sandbox Code Playgroud)
您可以替换4.0.2为您想要的任何 Swift 版本。在此处检查当前版本。
您现在应该可以通过运行来启动 Swift
swift
Run Code Online (Sandbox Code Playgroud)
这将有希望给你这样的东西
Welcome to Swift version 4.0.2 (swift-4.0.2-RELEASE). Type :help for assistance.
1>
Run Code Online (Sandbox Code Playgroud)
您可以在此处输入 Swift 代码。当你玩完后,输入:exit退出。
如果出现错误,则可能需要安装更多依赖项。一路上这样的事情发生在我身上好几次。只需谷歌一下错误,然后安装你需要的任何东西sudo apt-get install。
这是我们将放置与我们的 Android 和 iOS 应用程序通信的实际 Swift 服务器代码的地方。
为项目创建一个目录并cd进入其中。
mkdir MyFirstSwiftServer
cd MyFirstSwiftServer
Run Code Online (Sandbox Code Playgroud)
在命令行上使用 Swift Package Manager来设置我们的新项目。
swift package init --type executable
Run Code Online (Sandbox Code Playgroud)
Kitura 框架提供了使客户端-服务器通信成为可能的工具。Kitura 来自 IBM。还有许多其他的(参见比较)。Perfect很受欢迎,但我看过的唯一教程很难理解。不管怎样,我现在选择 Kitura 是因为Udacity 系列很容易理解。
在MyFirstSwiftServer我们刚刚创建的目录中打开Package.swift文件。
nano Package.swift
Run Code Online (Sandbox Code Playgroud)
编辑它以包含 Kitura 依赖项和目标。您可以在此处找到最新版本。
// swift-tools-version:4.0
// The swift-tools-version declares the minimum version of Swift required to build this package.
import PackageDescription
let package = Package(
name: "MyFirstSwiftServer",
dependencies: [
// Dependencies declare other packages that this package depends on.
.package(url: "https://github.com/IBM-Swift/Kitura.git", from: "2.1.0")
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "MyFirstSwiftServer",
dependencies: ["Kitura"]),
]
)
Run Code Online (Sandbox Code Playgroud)
这也是您将包含SwiftlyJSON 的地方,但在撰写本文时,有一个错误阻止它工作。不过,无论如何,我们的最小示例不需要它。
打开main.swift文件
nano Sources/MyFirstSwiftServer/main.swift
Run Code Online (Sandbox Code Playgroud)
然后粘贴下面的代码。这只是对 Udacity 课程第 1 课第 11 部分中使用的代码稍加修改。
import Kitura
// Create a new router
let router = Router()
// Handle HTTP GET requests to /
router.get("/") {
request, response, next in
response.send("Hello, Client!")
next()
}
// Add an HTTP server and connect it to the router
Kitura.addHTTPServer(onPort: 8090, with: router)
// Start the Kitura runloop (this call never returns)
Kitura.run()
Run Code Online (Sandbox Code Playgroud)
请注意,我们使用了 port 8090。我们将在连接到服务器时使用它。
在您的项目根文件夹中,使用以下命令构建项目
swift build
Run Code Online (Sandbox Code Playgroud)
然后运行编译的可执行文件
./.build/debug/MyFirstSwiftServer
Run Code Online (Sandbox Code Playgroud)
您可以使用 Web 浏览器进行测试,然后转到
http://93.184.216.34:8090 // replace 93.184.216.34 with your vps ip address
Run Code Online (Sandbox Code Playgroud)
你应该看到
Hello, Client!
Run Code Online (Sandbox Code Playgroud)
伟大的!服务器正在工作。
在 Android Studio 中创建以下布局
将以下行添加到清单中。
<uses-permission android:name="android.permission.INTERNET" />
Run Code Online (Sandbox Code Playgroud)
对于 Android 9+,您还需要允许 clear text。(请注意,对于生产应用程序,您应该使用 https 连接而不是 http 连接。)将以下内容添加到清单中:
<application
android:usesCleartextTraffic="true"
...
>
Run Code Online (Sandbox Code Playgroud)
复制代码。大部分内容改编自Android AsyncTask HTTP GET 请求教程。不要忘记用您的服务器替换 ip 地址。
public class MainActivity extends AppCompatActivity {
// replace 93.184.216.34 with your vps server ip address
private static final String SERVER = "http://93.184.216.34:8090/";
private TextView tvServerResponse;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvServerResponse = findViewById(R.id.textView);
Button contactServerButton = findViewById(R.id.button);
contactServerButton.setOnClickListener(onButtonClickListener);
}
View.OnClickListener onButtonClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
HttpGetRequest request = new HttpGetRequest();
request.execute();
}
};
public class HttpGetRequest extends AsyncTask<Void, Void, String> {
static final String REQUEST_METHOD = "GET";
static final int READ_TIMEOUT = 15000;
static final int CONNECTION_TIMEOUT = 15000;
@Override
protected String doInBackground(Void... params){
String result;
String inputLine;
try {
// connect to the server
URL myUrl = new URL(SERVER);
HttpURLConnection connection =(HttpURLConnection) myUrl.openConnection();
connection.setRequestMethod(REQUEST_METHOD);
connection.setReadTimeout(READ_TIMEOUT);
connection.setConnectTimeout(CONNECTION_TIMEOUT);
connection.connect();
// get the string from the input stream
InputStreamReader streamReader = new InputStreamReader(connection.getInputStream());
BufferedReader reader = new BufferedReader(streamReader);
StringBuilder stringBuilder = new StringBuilder();
while((inputLine = reader.readLine()) != null){
stringBuilder.append(inputLine);
}
reader.close();
streamReader.close();
result = stringBuilder.toString();
} catch(IOException e) {
e.printStackTrace();
result = null;
}
return result;
}
protected void onPostExecute(String result){
super.onPostExecute(result);
if (result == null) return;
tvServerResponse.setText(result);
}
}
}
Run Code Online (Sandbox Code Playgroud)
运行应用程序。按下按钮,希望你应该看到
成功!Android 上的客户端-服务器通信。
在 Xcode 中创建以下布局
这对于生产应用程序来说并不理想,但它会帮助我们避免错误,因为我们的 VPS 目前仅支持未加密的 http 连接。
将以下键添加到您的 Info.plist 文件中。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
有关在 Swift 中发出 HTTP 请求的更多信息,请参阅此问答。
import UIKit
class ViewController: UIViewController {
// replace 93.184.216.34 with your vps server ip address
let server = "http://93.184.216.34:8090"
@IBOutlet weak var serverResponseLabel: UILabel!
@IBAction func sendRequestButtonTappled(_ sender: UIButton) {
guard let url = URL(string: server) else {return}
// background task to make request with URLSession
let task = URLSession.shared.dataTask(with: url) {
(data, response, error) in
if let error = error {
print(error)
return
}
guard let data = data else {return}
guard let dataString = String(data: data, encoding: String.Encoding.utf8) else {return}
// update the UI if all went OK
DispatchQueue.main.async {
self.serverResponseLabel.text = dataString
}
}
// start the task
task.resume()
}
}
Run Code Online (Sandbox Code Playgroud)
运行应用程序。按下按钮,希望你应该看到
成功!iOS 上的客户端-服务器通信。
| 归档时间: |
|
| 查看次数: |
4172 次 |
| 最近记录: |