Windows/macOS插件化

无影客户端插件化文档,简述无影插件化集成方案,帮助客户更快地集成。

本文介绍无影Windows/macOS插件化使用,为客户通过无影客户端集成无影云电脑能力提供支持,结合客户和无影各自的产品优势,合力为用户提供更有价值的虚拟化计算方案,创造更大的客户价值。

前提条件

平台签约

第三方与无影完成商务合作签约,入驻开放平台,获取无影接口使用权限及开放平台接口访问凭证。

无影服务端开放平台对接请参考API Overview

插件服务安装

macOs:https://ecd-client.oss-cn-shanghai.aliyuncs.com/wuying/mac1015/wuying-setup.dmg

Windows:https://ecd-client.oss-accelerate.aliyuncs.com/wuying/windows10/wuying-setup.exe

静默安装

如果有静默安装的需求,可以参考如下方式

重要

安装前需要判断是否已经安装插件服务,判断的方法可以参考附1。

Windows:

wuying-setup.exe /sp- /verysilent /norestart /nocancel
说明

Windows端安装后会有桌面快捷方式和开始菜单,如果不需要,可以删除,参考附3。

macOS:

hdiutil attach wuying-setup.dmg -mountpoint /Volumes/AliyunEds -nobrowse 
&& cp -R /Volumes/AliyunEds/无影云电脑.app /Applications/无影云电脑.app 
&& hdiutil detach /Volumes/AliyunEds

插件化集成

集成方式

命令行集成

找到无影插件化服务stream_launcher,通过以下命令传递执行参数

说明

stream_launcher 的路径查找可以参考附1。

macOS:

stream_launcher --param='{"operation": "xxx", xxxxxx}'

Windows:

stream_launcher.exe --param='{"operation": "xxx", xxxxxx}'

关联文件集成

将整个param参数的json格式内容,保存在一个文本文件,文件名后缀修改为.aspkey,通过系统接口使用默认应用打开此文件,即可自动关联到无影客户端执行对应的操作。

示例文件demo.aspkey

{
  "param": {
    "operation": "xxx"
  }
}

文件关联也可以通过命令行集成

macOS:

stream_launcher --file="xxx/param.aspkey"
open -a stream_launcher "xxx/param.aspkey"

Windows:

stream_launcher.exe --file="xxx/param.aspkey"

URL scheme集成

无影客户端支持通过URL scheme集成打开云电脑,通过wuying:// 前缀关联,直接通过浏览器访问

wuying://?param={"operation": "xxx", xxxxxx}

URL scheme 也可以通过命令行集成

macOS:

stream_launcher --url='wuying://?param={"operation": "xxx", xxxxx}'
open 'wuying://?param={"operation": "xxx", xxxxx}'

Windows:

stream_launcher.exe --url='wuying://?param={"operation": "xxx", xxxx}'
start 'wuying://?param={"operation": "xxx", xxxx}'
/// power shell
Start-Process 'wuying://?param={"operation": "xxx", xxxx}'
说明

Windows支持开放SDK集成,具备更灵活的集成方式,参考 Windows SDK

打开云电脑

通过无影服务端开放平台获取打开云电脑的必要参数Ticket。

说明

获取该参数时必须传入UUID字段,获取UUID获取的方法参考附2。

参数

参数为JSON结构

名称

类型

必填

描述

示例

operation

String

操作名称

openDesktop

  • bizParam

object

透传从无影服务端获取到的连接信息

-- ticket

String

ticket为调用无影开放平台GetConnectionTicket - 获取连接凭证接口返回的ticket信息

-- desktopId

String

云电脑Id

GetConnectionTicket - 获取连接凭证 返回

ecd-7nvbz4ccjly95xxxx

-- desktopName

String

云电脑名称

GetConnectionTicket - 获取连接凭证 返回

xx的云电脑

-- osType

String

系统类型

GetConnectionTicket - 获取连接凭证 返回

windows

  • partnerInfo

object

调用无影服务的合作方的信息

-- partner

String

合作方公司名称

xxx公司

-- partnerApp

String

合作方应用的名称

xxx应用

  • extInfo

object

扩展字段,外部配置参数

-- language

String

设置一次后所有打开的窗口UI都会显示设置的语言(未设置时默认为中文)

“zh” --- 中文

“en” --- 英文

-- cloudDpi

int

云电脑启动时的默认dpi缩放比例

  • 仅限启动Windows系统云电脑时设置。若非有特殊需求,本参数无需设置

  • 参数为100-200之间的整数,例如150代表缩放比例150%

100

-- fullscreen

bool

是否在全屏窗口状态打开云资源

  • 仅限云资源打开请求时设置。若非有特殊需求,本参数无需设置

true

-- isVpc

bool

是否走vpc网络

  • 仅限云资源打开请求时设置。若非有特殊需求,本参数无需设置

false

-- hideFloatingBall

bool

是否隐藏云资源窗口内的悬浮球

  • 仅限云资源打开请求时设置。若非有特殊需求,本参数无需设置

false

  • proxy

object

网络代理配置

-- type

String

代理类型

目前支持系统代理、socket代理、HTTP代理3种方式

system - 系统代理

socket - socket代理

HTTP - HTTP代理

-- host

String

代理的host

127.x.x.x

-- port

int

代理端口号

50550

-- account

String

代理账号

-- password

String

代理密码

示例

JSON格式

{
  "operation": "openDesktop",
  "bizParam": {
    "ticket": "xxxxxxxxxxxxxxxxxxxxxxx",
    "desktopId": "ecd-7nvbz4ccjly95xxxx",
    "desktopName": "xx的云电脑",
    "osType": "windows"
  },
  "partnerInfo": {
    "partner": "wuyingPartnerTest",
    "partnerApp": "WuyingPartnerTestApp"
  },
  "extInfo": {
    "language": "zh",
    "cloudDpi": 150,
    "fullscreen": true,
    "isVpc": true,
    "hideFloatingBall": true,
    "proxy": {
      "type": "system",
      "host": "xxxxxx",
      "port": 1111,
      "account": "xxxx",
      "password": "xxx"
    }
  }

断开云资源

参数

名称

类型

必填

描述

示例

operation

String

操作名称

closeConnection

  • bizParam

object

透传从无影服务端获取到的连接信息

-- id

String

需要关闭的云资源的Id

如果需要关闭云电脑则需要填desktopId

ecd-7nvbz4ccjly95xxxx

  • partnerInfo

object

调用无影服务的合作方的信息

-- partner

String

合作方公司名称

xxx公司

-- partnerApp

String

合作方应用的名称

xxx应用

示例

JSON格式

{
  "operation": "closeConnection",
  "bizParam": {
    "id": "ecd-7nvbz4ccjly95xxxx"
  },
  "partnerInfo": {
    "partner": "wuyingPartnerTest",
    "partnerApp": "WuyingPartnerTestApp"
  }
 }

打开问题反馈

如果有需要无影的支持,需要上传插件化日志时使用

参数

名称

类型

必填

描述

示例

operation

String

操作名称

feedback

  • partnerInfo

object

调用无影服务的合作方的信息

-- partner

String

合作方公司名称

xxx公司

-- partnerApp

String

合作方应用的名称

xxx应用

示例

JSON格式

{
  "operation": "feedback",
  "partnerInfo": {
    "partner": "wuyingPartnerTest",
    "partnerApp": "WuyingPartnerTestApp"
  }
}

打开检测升级页面

需要升级插件化服务时使用

参数

名称

类型

必填

描述

示例

operation

String

操作名称

upgrade

  • partnerInfo

object

调用无影服务的合作方的信息

-- partner

String

合作方公司名称

xxx公司

-- partnerApp

String

合作方应用的名称

xxx应用

示例

JSON格式

{
  "operation": "upgrade",
  "partnerInfo": {
    "partner": "wuyingPartnerTest",
    "partnerApp": "WuyingPartnerTestApp"
  }
}

退出插件化服务

合作方客户端退出登录,调用无影插件化服务退出(仅支持命令行集成)

macOS:

stream_launcher --requestExit

Windows:

stream_launcher.exe --requestExit

附1: 判断插件服务是否已安装以及获取插件服务地址

无影插件服务是否已经安装以及获取stream_launcher插件服务路径,可以参考如下方式

Windows:

#include <Windows.h>
#include <Shlwapi.h>
#include <string>
#include <iostream>

DWORD length = 0;
HRESULT hr = AssocQueryString(0, ASSOCSTR_EXECUTABLE, ".aspkey", NULL, NULL, &length);

if (length == 0) {
    // 未安装无影插件服务
}

char* path = new char[length + 1];
hr = AssocQueryString(0, ASSOCSTR_EXECUTABLE, ".aspkey", NULL, path, &length);
if (SUCCEEDED(hr)) {
  // path 为stream_launcher.exe路径
} else {
  // 未安装无影插件服务
}

macOS:

#import <Foundation/Foundation.h>
#import <CoreServices/CoreServices.h>

NSString *extension = @"aspkey";
CFStringRef exUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, (__bridge CFStringRef)(extension), NULL);
if (exUTI) {
    CFURLRef appURL = LSCopyDefaultApplicationURLForContentType(exUTI, kLSRolesAll, NULL);
    if (appURL) {
        // appPath 为stream_launcher 路径
        NSString *appPath = [(__bridge NSURL*)appURL path];
        CFRelease(appURL);
    } else {
        // 未安装无影插件服务
        NSLog(@"No default application found for .%@ files", extension);
    }
    CFRelease(exUTI);
} else {
    // 未安装无影插件服务
    NSLog(@"Could not find UTI for extension .%@", extension);
}
import Foundation
import CoreServices

let fileExtension = "aspkey"
if let exUTI = UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, fileExtension as CFString, nil)?.takeRetainedValue() {
    if let appURLCF = LSCopyDefaultApplicationURLForContentType(exUTI, .all, nil)?.takeRetainedValue() {
        let appURL = appURLCF as URL
        let appPath = appURL.path
        // appPath 为stream_launcher路径
    } else {
        // 未安装无影插件服务
    }
} else {
    // 未安装无影插件服务
}

附2: 获取UUID

在无影插件化服务启动的时候,在mac平台上,将uuid写入到文件中;在windows平台上,写入到注册表中。

  • macOS:将uuid写入到文件中,文件名为wuying_id,路径为/Users/xxxx/Library/Application\ Support/wuying/wuying_id

  • Windows:将uuid放入到注册表中HKEY_CURRENT_USER中,具体路径为Software\\alibaba\\wuying\\UUID

3: 删除windows快捷方式

Windows端安装后会有桌面快捷方式和开始菜单,如果不需要,可以删除对应文件

wuyingStartMenuPath = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\无影云电脑.lnk";
wuyingDesktopPath = "C:\Users\Public\Desktop\无影云电脑.lnk";