使用Go进行iOS和Android编程

本文概述

尽管不是一种新的语言, 但Go在过去两年中引起了很多兴趣, 并且使用该语言的大型项目的数量正在迅速增长。我写了一篇有关SitePoint语言的介绍性文章, 并提到了有关移动支持的内容, 所以我考虑了一下可能性。

我很高兴看到Android上的Go支持是什么样的, 因为它们都是Google技术, 而且开发人员纷纷要求开发一种支持Java的语言。

Go入门

你将需要安装GoLang 1.5+。

接下来, 安装GoMobile工具, 该工具可以编译并运行适用于Android和iOS的Go应用程序:

go get golang.org/x/mobile/cmd/gomobile
gomobile init

我们将在GoLangInstalldir / src / golang.org / x / mobile / example /中引用gomobile软件包随附的示例应用程序。如果你没有安装它们, 请使用以下命令获取它们:

go get -d golang.org/x/mobile/example/basic

生成并安装本机Go应用程序

对于许多应用程序用例, 编译转到本机应用程序并忽略平台库和接口可能会很好。如果是这样, 则可以使用部分功能来编译现有的Go代码, 这一点很简单。这包括:

  • 应用控制和配置
  • OpenGL ES 2绑定
  • 资产管理
  • 事件管理
  • 实验包包括OpenAL绑定, 音频, 字体, 子画面和运动传感器

我们将使用一个预先存在的gomobile示例来逐步完成该过程, 但是可以将它们替换为你自己的项目文件。

安卓系统

建立Android APK

gomobile build -target=android golang.org/x/mobile/example/basic

部署到设备

gomobile install golang.org/x/mobile/example/basic

iOS

建立iOS IPA

gomobile build -target=ios golang.org/x/mobile/example/basic

部署到设备

在iOS上没有与在Android上等效的部署命令, 因此在创建上述应用之后, 你将必须按照自己喜欢的方式将其复制到设备或仿真器上, 例如ios-ployy工具。

如果想获得更多令人兴奋的内容, 请尝试使用golang.org/x/mobile/example/audio示例进行上述操作。

让我们看一下音频示例(这里我不会重现完整的代码), 你不需要对GoLang过于熟悉(我不是), 这更多地是关于寻找可能的方法。

首先, 你会看到一组导入语句:

import (
...
    "golang.org/x/mobile/app"
    "golang.org/x/mobile/asset"
...
)

如果你浏览在GoLangInstalldir / src / golang.org / x / mobile / *中导入的文件夹和文件, 你会注意到用你的代码编译的各种Java和Objective-C文件。

进一步挖掘, 你将看到对在代码中导入和使用的某些类的引用, 例如app和glctx。

在使用开发中使用Go

我们可以使用Go编写代码并构建一个紧凑且经过优化的本机应用程序, 但由于它所需的所有支持库仅在Java和Objective-C / Swift中可用, 因此目前还不是“原生”应用程序。我们如何改善这种体验?

Go Mobile团队使用本机应用程序中的go包(你的应用程序)创建了另一个选项。完美共享一些常见的Go代码并绑定到本机代码。入门很容易, 但从长远来看, 维护起来可能很复杂。

安卓系统

如果你使用的是Android Studio, 请从GoLangInstalldir / src / golang.org / x / mobile / example / bind / android导入参考项目, 然后打开build.grade(模块:hello)文件以更新你的GOPATH和GO路径, 这是我的(我用Homebrew安装了GoLang):

更新路径

Sync Gradle, 然后将应用程序部署到仿真器或设备。

注意:当前仅基于ARM的设备和仿真器支持此功能。

让我们看一下Java和Go代码:

MainActivity.java

package org.golang.example.bind;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

import go.hello.Hello;

public class MainActivity extends Activity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.mytextview);

        // Call Go function.
        String greetings = Hello.Greetings("Android and Gopher");
        mTextView.setText(greetings);
    }
}

src / golang.org / x / mobile / example / bind / hello / hello.go

package hello

import "fmt"

func Greetings(name string) string {
    return fmt.Sprintf("Hello, %s!", name)
}

go文件通过import go.hello.Hello导入, 并且其中的Greetings函数可通过Hello.Greetings在Java文件中访问。无需太多额外步骤, 就可以在go函数和本机UI元素之间进行绑定。

iOS

将iOS应用程序绑定到Go需要执行不同的步骤。首先执行以下命令:

cd GoLang_Install_dir/src/golang.org/x/mobile/example/bind
gomobile bind -target=ios golang.org/x/mobile/example/bind/hello

这将在我们可以在项目中使用的当前文件夹中创建一个名为Hello.framework的框架包。

在Xcode中打开位于GoLangInstalldir / src / golang.org / x / mobile / example / bind / ios / bind.xcodeproj上的示例iOS项目, 然后将Hello.framework拖到该项目中, 并在需要时选中“复制项目”。这将导致以下文件夹结构:

进入Xcode

生成并运行应用程序, 该应用程序与Android应用程序非常相似, 将Go方法调用到Objective-C代码中。

让我们看一下代码:

#import "ViewController.h"
#import "hello/Hello.h"  // Gomobile bind generated header file in hello.framework

@interface ViewController ()
@end

@implementation ViewController

@synthesize textLabel;

- (void)loadView {
    [super loadView];
    textLabel.text = GoHelloGreetings(@"iOS and Gopher");
}

@end

#import“ hello / Hello.h”导入先前生成的框架文件, 并且textLabel.text = GoHelloGreetings(@“ iOS and Gopher”);调用它公开的用于设置标签变量的函数。

可以在基于Swift的项目中使用相同的自动生成的Objective-C框架文件, 然后使用以下方法:

let msg = Hello.GoHelloGreetings("gopher")

使用Go值得么?

好吧, 简而言之, 可能不是。如果你已经在Go中编写了应用程序, 并且可以使用非本机外观的界面, 那么没有什么可以阻止你的, 因为你会发现构建和部署用Go编写的本机应用程序很容易。如果你愿意采取额外的步骤来遵循绑定选项, 则可以采取进一步的措施, 但仍要在一定的限制内。

如果你不使用Go, 则可能不值得考虑将其作为移动原生编程选项。但是我仍然坚信, 有足够的潜力和兴趣使它在不久的将来成为可能, 当然, 我很乐意在下面听听你的意见。

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?