퓨즈[Fusetools]는 UX(XML), Javascript, Uno, Native 언어(Objective-C/Swift and Java)를 사용할 수 있습니다. 일반적인 비즈니스 로직은 Javascript로 모두 처리가 가능하지만 외부 모듈을 붙이거나 UX 또는 Javascript가 지원하지 않는 기능들은 Native 언어를 써야합니다.

기억할 것은 Uno가 중간 매개체 역할을 한다는 것입니다. 즉, Javascript에서 Native 언어의 메소드를 호출하거나(실제로는 Uno의 메소드를 호출합니다) Native 언어의 결과를 Javascript로 전달하기 위해서는 Uno를 이용해야 합니다.

아래 코드들은 Javascript를 시작으로 Native 메소드를 호출하고 다시 Native에서 Uno의 메소드를 호출한 다음 이벤트를 발생시켜서 Javascript까지 이어지는 로직입니다. 상세한 설명은 퓨즈의 공식 문서에 있으니 참고하시기 바랍니다.

https://www.fusetools.com/docs/native-interop/native-interop

[[ MainView.ux ]]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<App>
    <Panel>
        <JavaScript>
            var HelloUno = require("HelloUno");
           
            HelloUno.onMessageFromUno = function(message) {
                console.log("Javascript===" + message);
            };

            function print()
            {
                HelloUno.Log("Hello from JavaScript!!");
            }

            module.exports = {
                print:print
            }
        </JavaScript>
        <Button Text="Click!!">
            <Clicked Handler="{print}" />
        </Button>
    </Panel>
</App>

[[ HelloUno.uno ]]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
using Fuse;
using Fuse.Scripting;
using Fuse.Reactive;
using Uno.UX;
using Uno;
using Uno.Compiler.ExportTargetInterop;

[UXGlobalModule]
public class HelloUno : NativeModule
{
    static readonly HelloUno _instance;

    static NativeEvent _messageFromUnoEvt;

    public HelloUno()
    {
        if(_instance != null) return;

        _instance = this;
        Resource.SetGlobalKey(_instance, "HelloUno");

        AddMember(new NativeFunction("Log", (NativeCallback)Log));

        _messageFromUnoEvt = new NativeEvent("onMessageFromUno");
        AddMember(_messageFromUnoEvt);
    }

    static object Log(Context c, object[] args)
    {
        foreach (var arg in args)
        {
            MobileLog((string)arg);
        }

        return null;
    }

    static void UnoLog(string message)
    {
        debug_log("Uno===" + message);
        _messageFromUnoEvt.RaiseAsync(message);
    }

    [Foreign(Language.Java)]
    static extern(Android) void MobileLog(string message)
    @{
        android.util.Log.d("ForeignCodeExample", "Android===" + message);
        @{UnoLog(string):Call("Hello from Android!!")};
    @}

    [Foreign(Language.ObjC)]
    static extern(iOS) void MobileLog(string message)
    @{
        NSLog(@"iOS===%@", message);
        @{UnoLog(string):Call(@"Hello from iOS!!")};
    @}
}

iOS에서 실행한 결과 (Javascript의 로그는 자동으로 한 줄을 띄웁니다) ::
——————————–
iOS===Hello from JavaScript!!
Uno===Hello from iOS!!

Javascript===Hello from iOS!!
——————————–

#퓨즈 #퓨즈툴 #퓨즈툴즈 #퓨즈툴스 #Fuse #Fusetools #모바일 #앱 #크로스플랫폼 #iOS #Android #안드로이드 #Objective-C #Swift #Java #C++ #우노 #Uno