26、探索SiriKit与ARKit:提升应用交互与增强现实体验

探索SiriKit与ARKit:提升应用交互与增强现实体验

1. SiriKit简介

SiriKit能让应用与Siri相连,使用户可以通过语音指令与应用进行交互。不过,SiriKit所能处理的领域范围有限,主要包括消息传递、乘车预订、VoIP通话或支付等。

1.1 支付模拟操作

当Siri询问是否要发送支付时,说“Send”,Siri会提示已发送支付,但实际上并未真正完成支付,因为还未编写代码来定义收款方或从账户中提取资金的方式。

1.2 自定义应用界面

虽然可以使用UILabel自定义MainInterface.storyboard,但也能轻松添加代表应用logo的图片或文本,这样用户就能在Siri中识别应用。

1.3 项目定制
  • 模板代码处理 :创建项目的目标文件时,Xcode会生成用于消息传递领域发送消息的模板代码。若要将其用于其他领域(如照片或健身),需删除IntentHandler.swift文件中的大部分代码。
  • Info.plist文件编辑 :编辑Extension和ExtensionUI文件夹中的Info.plist文件,定义应用将处理的特定领域意图,如INSendPaymentIntent或INSendMessageIntent。
  • 用户界面定制 :若要在Siri中定制用户界面,需修改MainInterface.storyboard文件和IntentViewController.swift文件。

通过将SiriKit添加到应用中,借助Siri的自然语言处理能力,能让应用更易用。

2. ARKit基础
2.1 增强现实概念

增强现实(AR)是一种将虚拟对象叠加在实际物理对象上的技术。例如,热门游戏Pokemon Go通过iPhone相机将Pokemon角色叠加在实际场景中。AR的应用场景广泛,如指向街道可查看周边街道名称和商家名称,在大型公共场所(如机场候机楼或博物馆)提供带箭头的步行导航。

过去,创建AR应用需要编写数学方程来跟踪现实世界对象并定位虚拟对象。现在,苹果通过新的软件框架ARKit让创建AR应用变得更加容易,结合SceneKit等其他框架,能快速轻松地创建AR应用。需要注意的是,只能在iPhone 6s及以上机型或iPad Pro上测试和运行ARKit应用。

2.2 ARKit工作原理

ARKit通过识别周围的特征点来工作。当它识别出iOS设备相机所拍摄的物理对象后,就能将虚拟对象叠加在相机显示的真实图像上。

2.3 创建AR项目示例
  1. 创建项目 :创建一个新的iOS项目,选择“Augmented Reality App”项目模板,点击“Next”。
  2. 设置项目信息 :当Xcode询问项目名称时,输入“ARTest”,确保“Content Technology”弹出菜单显示“SceneKit”(SpriteKit适用于2D图像,Metal适用于喜欢自己编写代码创建图形的高级用户,大多数情况下建议使用SceneKit显示3D图像),然后点击“Finish”。此时,Xcode会创建一个标准的iOS项目,包含AppDelegate.swift文件、ViewController.swift文件和Main.storyboard用户界面。
3. AR项目代码分析
3.1 ViewController.swift文件

打开ViewController.swift文件,会看到以下关键代码:

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {
    @IBOutlet var sceneView: ARSCNView!

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
        sceneView.showsStatistics = true
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        let configuration = ARWorldTrackingConfiguration()
        sceneView.session.run(configuration)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        sceneView.session.pause()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
  • 导入框架 :导入UIKit用于创建iOS应用,SceneKit用于显示三维对象,ARKit用于为应用添加增强现实功能。
  • 采用协议 :ViewController类采用ARSCNViewDelegate协议,该协议允许将SceneKit图像作为增强现实对象叠加在现实世界对象上。
  • IBOutlet :ViewController.swift文件中包含一个名为sceneView的IBOutlet,点击Main.storyboard文件,可看到用户界面上已存在一个ARKit SceneKit View,用于在相机背景上显示3D SceneKit图像。
  • 创建增强现实 :在viewWillAppear函数中,第一行代码创建一个名为configuration的常量,代表ARWorldTrackingConfiguration对象,用于跟踪iOS设备的方向和位置以及检测现实世界表面;第二行代码将增强现实图像叠加在相机显示的视图上。
  • 显示统计信息 :在viewDidLoad函数中,设置sceneView.showsStatistics = true可在屏幕底部显示每秒帧数(fps)和计时数据。
3.2 虚拟对象文件

在Navigator面板中,可看到一个art.scnassets文件夹,展开后包含ship.scn和texture.png两个文件。ship.scn文件包含一个可修改外观的三维对象,texture.png文件包含应用在ship.scn形状上的图形。

  • 文件格式转换 :.scn是SceneKit文件格式,大多数3D数字成像程序可保存为.dae(Digital Asset Exchange)文件格式。若将.dae文件添加到Xcode,可通过将其添加到Navigator面板,然后选择“File ➤ Export”并保存为.scn文件进行转换。若要创建.dae文件,可使用免费的开源软件Blender(www.blender.org),也可在互联网上找到免费的公共领域.dae文件。
3.3 虚拟对象外观修改

点击ship.scn文件,在Xcode窗口中点击平面图像,再点击“Show the Materials Inspector”图标(或选择“View ➤ Utilities ➤ Show the Materials Inspector”),可打开Materials Inspector面板,用于修改形状的外观。点击“Diffuse”弹出菜单,可看到当前选择的是texture.png文件,点击“Black”或“White”可移除纹理,观察移除纹理后ship.scn文件外观的变化。

3.4 运行AR项目

确保“Diffuse”弹出菜单再次显示texture.png,通过USB电缆将iOS设备连接到Mac,将iOS设备相机指向任意位置,ship.scn文件的虚拟图像应会叠加在相机拍摄的现实世界对象上。移动iOS设备时,可看到ship.scn图像的不同角度,屏幕底部会显示增强现实图像的统计信息(如fps)。在Xcode中,选择“Product ➤ Stop”或点击停止图标可停止ARTest项目的运行。通过添加不同的纹理文件或替换ship.scn文件,可在iOS设备相机中显示自定义图像。

4. 显示特征点和世界原点

修改ViewController.swift文件,注释掉定义ship.scn文件并加载场景的两行代码,添加以下代码以显示特征点和世界原点:

//let scene = SCNScene(named: "art.scnassets/ship.scn")!
//sceneView.scene = scene
sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]

特征点以黄色小点显示,用于突出ARKit识别的表面区域;世界原点以x、y、z轴显示,x轴向右,y轴向上,z轴指向屏幕外朝向用户。ARKit在光线清晰、有多物体可见的条件下效果最佳,光线不佳或相机指向空白墙壁或地板会影响其识别表面区域的能力。

完整的viewDidLoad函数如下:

override func viewDidLoad() {
    super.viewDidLoad()
    // Set the view's delegate
    sceneView.delegate = self
    // Show statistics such as fps and timing information
    sceneView.showsStatistics = true
    // Create a new scene
    //let scene = SCNScene(named: "art.scnassets/ship.scn")!
    // Set the scene to the view
    //sceneView.scene = scene
    sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
}

运行修改后的ARTest项目,可看到原点和代表特征点的黄色小点。

5. 绘制增强现实对象
5.1 可用几何形状

除了使用自定义图像,还可显示简单的几何形状,如:
| 形状名称 | 描述 |
| ---- | ---- |
| SCNBox | 绘制一个盒子 |
| SCNCapsule | 绘制一个两端为半球形的圆柱体 |
| SCNCone | 绘制一个圆锥体 |
| SCNCylinder | 绘制一个圆柱体 |
| SCNFloor | 绘制一个可选择性反射场景的无限平面 |
| SCNPlane | 绘制一个特定宽度和高度的矩形平面 |
| SCNPyramid | 绘制一个金字塔 |
| SCNSphere | 绘制一个球体 |
| SCNTorus | 绘制一个环形物体 |
| SCNTube | 绘制一个中心有孔的圆柱体 |

5.2 定义几何形状

显示几何形状时,需要定义三个特征:
- 物理尺寸 :如高度和宽度。
- 外观 :如颜色。
- 相对于世界原点的位置

定义好对象的大小、外观和位置后,需要定义一个节点将其放置在相机显示的视图上。在ViewController.swift文件的现有viewDidLoad函数中,在sceneView.debugOptions行下方添加以下代码:

let node = SCNNode()
node.geometry = SCNPyramid(width: 0.1, height: 0.2, length: 0.1)
node.geometry?.firstMaterial?.diffuse.contents = UIColor.cyan
node.position = SCNVector3(0, -0.2, 0)
sceneView.scene.rootNode.addChildNode(node)
  • 创建节点 :第一行代码创建一个节点,用于定义几何形状的出现位置。
  • 定义形状 :第二行代码定义一个SCNPyramid,指定其宽度、高度和长度。
  • 设置颜色 :第三行代码将形状的颜色设置为青色。
  • 设置位置 :第四行代码定义金字塔相对于世界原点的位置,在本例中,金字塔的底部位于原点下方 -0.2 处。
  • 添加节点 :第五行代码将节点添加到场景中,一个青色金字塔将出现在世界原点正下方。

可以尝试更改node.position的值以及金字塔的宽度、高度和长度,将金字塔的颜色从青色改为红色或黄色,或者选择其他形状(如SCNBox、SCNTub或SCNCone)进行实验。

graph LR
    A[创建AR项目] --> B[设置项目信息]
    B --> C[查看ViewController.swift文件]
    C --> D[导入框架]
    C --> E[采用协议]
    C --> F[设置IBOutlet]
    C --> G[创建增强现实配置]
    C --> H[显示统计信息]
    D --> I[UIKit创建iOS应用]
    D --> J[SceneKit显示3D对象]
    D --> K[ARKit添加增强现实功能]
    G --> L[ARWorldTrackingConfiguration跟踪设备和检测表面]
    G --> M[运行配置显示增强现实图像]
    H --> N[显示fps和计时数据]
    C --> O[修改虚拟对象外观]
    O --> P[打开Materials Inspector面板]
    P --> Q[修改Diffuse纹理]
    C --> R[显示特征点和世界原点]
    R --> S[添加debugOptions代码]
    C --> T[绘制几何形状]
    T --> U[定义节点和形状属性]
    U --> V[设置颜色和位置]
    U --> W[添加节点到场景]
6. 重置世界原点
6.1 问题描述

首次运行AR应用时,会将世界原点定义在iPhone或iPad的当前位置。后退几步,可在屏幕上看到原点,但在再次运行应用之前,世界原点将保持固定。

6.2 创建ARReset项目

创建一个新的Single View App项目,命名为“ARReset”。

6.3 修改ViewController.swift文件

在ViewController.swift文件中添加SceneKit和ARKit框架,修改ViewController类以采用ARSCNViewDelegate协议:

import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {
    @IBOutlet var sceneView: ARSCNView!
    let configuration = ARWorldTrackingConfiguration()

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
        sceneView.showsStatistics = true
        sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        sceneView.session.run(configuration)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        sceneView.session.pause()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func resetAR(_ sender: UIButton) {
        sceneView.session.pause()
        sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
    }
}
6.4 修改Info.plist文件

点击Info.plist文件,添加“Privacy – Camera Usage Description”键,否则应用将无法访问相机,无法运行。

6.5 修改Main.storyboard文件
  1. 点击Main.storyboard文件,添加一个ARKit SceneKit View到用户界面。
  2. 将一个UIButton拖到ARKit SceneKit View下方的屏幕底部,使其宽度与视图一致,将按钮标题设置为“Reset”。
  3. 选择“Editor ➤ Resolve Auto Layout Issues ➤ Reset to Suggested Constraints”。
6.6 创建IBOutlet和IBAction
  1. 打开Assistant Editor,从ARSCNView Control-drag创建一个名为sceneView的IBOutlet。
  2. 从UIButton Control-drag创建一个名为resetAR的IBAction方法,并添加以下代码:
@IBAction func resetAR(_ sender: UIButton) {
    sceneView.session.pause()
    sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
}

运行该应用,后退几步可看到世界原点显示在前方。移动到新位置,点击“Reset”按钮,再后退,此时世界原点应会重新定义在新位置。

7. 绘制自定义形状

若ARKit提供的常见几何形状(如圆柱体、圆锥体、金字塔、盒子和球体)无法满足需求,可通过定义起点并添加线条来创建自定义形状,这种方式创建的形状称为Bezier路径。

7.1 创建Bezier路径的步骤
  1. 定义Bezier路径 :创建一个BezierPath对象。
let path = UIBezierPath()
  1. 定义起点 :使用move方法定义绘制的起点。
path.move(to: CGPoint(x: 0, y: 0))
  1. 绘制线条 :使用addLine方法定义线条的终点。
path.addLine(to: CGPoint(x: 0.2, y: 0.2))
  1. 创建形状 :根据定义的Bezier路径线条创建一个SCNShape。
let shape = SCNShape(path: path, extrusionDepth: 0.1)
7.2 显示自定义形状

将自定义形状定义为一个节点,设置其颜色和位置,然后将节点添加到增强现实视图中:

let node = SCNNode()
node.geometry = shape
node.geometry?.firstMaterial?.diffuse.contents = UIColor.yellow
node.position = SCNVector3(0,0, -0.4)
sceneView.scene.rootNode.addChildNode(node)
7.3 修改ARReset项目

修改ARReset项目的ViewController.swift文件,使其完整内容如下:

import UIKit
import SceneKit
import ARKit

class ViewController: UIViewController, ARSCNViewDelegate {
    @IBOutlet var sceneView: ARSCNView!
    let configuration = ARWorldTrackingConfiguration()

    override func viewDidLoad() {
        super.viewDidLoad()
        sceneView.delegate = self
        sceneView.showsStatistics = true
        sceneView.debugOptions = [ARSCNDebugOptions.showWorldOrigin, ARSCNDebugOptions.showFeaturePoints]
        let path = UIBezierPath()
        path.move(to: CGPoint(x: 0, y: 0))
        path.addLine(to: CGPoint(x: 0.2, y: 0.2))
        path.addLine(to: CGPoint(x: 0.4, y: -0.2))
        let shape = SCNShape(path: path, extrusionDepth: 0.1)
        let node = SCNNode()
        node.geometry = shape
        node.geometry?.firstMaterial?.diffuse.contents = UIColor.yellow
        node.position = SCNVector3(0,0, -0.4)
        sceneView.scene.rootNode.addChildNode(node)
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        sceneView.session.run(configuration)
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        sceneView.session.pause()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func resetAR(_ sender: UIButton) {
        sceneView.session.pause()
        sceneView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
    }
}

在连接到Mac的iOS设备上运行修改后的ARReset项目,应会看到一个黄色三角形形状出现在世界原点之后。

graph LR
    A[创建ARReset项目] --> B[修改ViewController.swift文件]
    B --> C[添加框架和采用协议]
    B --> D[设置配置和代理]
    B --> E[显示统计和原点信息]
    A --> F[修改Info.plist文件]
    F --> G[添加相机使用描述]
    A --> H[修改Main.storyboard文件]
    H --> I[添加ARKit视图]
    H --> J[添加重置按钮]
    H --> K[设置约束]
    A --> L[创建IBOutlet和IBAction]
    L --> M[创建sceneView的IBOutlet]
    L --> N[创建resetAR的IBAction]
    N --> O[添加重置代码]
    B --> P[绘制自定义形状]
    P --> Q[创建Bezier路径]
    Q --> R[定义起点]
    Q --> S[绘制线条]
    Q --> T[创建形状]
    P --> U[定义节点和属性]
    U --> V[设置颜色和位置]
    U --> W[添加节点到场景]

通过以上步骤,我们可以深入了解SiriKit和ARKit的使用方法,创建出具有语音交互和增强现实功能的应用。无论是利用SiriKit提升应用的交互性,还是借助ARKit实现虚拟与现实的融合,都能为用户带来全新的体验。在实际开发中,可以根据具体需求进一步探索和优化这些技术,创造出更具创意和实用性的应用。

探索SiriKit与ARKit:提升应用交互与增强现实体验

8. 总结与拓展

在前面的内容中,我们详细介绍了SiriKit和ARKit的相关知识及操作方法。SiriKit让应用能够与Siri集成,实现语音交互,为用户提供了更加便捷的操作方式。而ARKit则开启了增强现实的大门,让开发者可以轻松创建出将虚拟对象与现实场景相结合的应用。

8.1 技术要点回顾
  • SiriKit
    • 可处理有限领域,如消息传递、乘车预订、VoIP通话和支付等。
    • 定制项目时需处理模板代码、编辑Info.plist文件和修改界面文件。
    • 能通过自定义界面元素让应用在Siri中更易识别。
  • ARKit
    • 基于识别特征点将虚拟对象叠加到现实场景。
    • 创建AR项目有特定的步骤和配置要求。
    • 可通过修改代码显示特征点、世界原点和不同的几何形状。
    • 支持绘制自定义形状,通过Bezier路径实现。
8.2 进一步探索方向
  • SiriKit :可以尝试在不同领域中更深入地应用SiriKit,例如开发更复杂的支付流程或消息处理逻辑。同时,优化语音交互的体验,让用户与应用的沟通更加自然流畅。
  • ARKit
    • 探索更多的3D模型和纹理资源,丰富虚拟对象的外观。
    • 研究如何在不同的光照和环境条件下优化ARKit的性能。
    • 结合其他技术,如机器学习,实现更智能的增强现实应用,例如自动识别现实场景中的物体并做出相应的反应。
9. 应用案例分析

为了更好地理解SiriKit和ARKit的实际应用,下面我们分析一些具体的应用案例。

9.1 SiriKit应用案例
  • 语音支付应用 :一些金融类应用集成了SiriKit的支付功能,用户可以通过语音指令完成转账、缴费等操作。例如,用户只需对Siri说“向张三转账500元”,应用就能自动完成支付流程,大大提高了支付的便捷性。
  • 语音消息应用 :社交类应用利用SiriKit实现语音发送消息的功能。用户在不方便手动输入时,只需说出消息内容,Siri就能将其发送给指定的联系人,提升了消息传递的效率。
9.2 ARKit应用案例
  • 室内装修应用 :一些家居类应用使用ARKit让用户在现实场景中预览家具的摆放效果。用户可以将手机摄像头对准房间,应用会在屏幕上显示虚拟的家具模型,用户可以调整家具的位置、大小和颜色,直观地感受装修后的效果。
  • 教育类应用 :教育类AR应用通过ARKit将抽象的知识以3D模型的形式呈现给学生。例如,在学习地理知识时,学生可以通过手机摄像头查看地球的虚拟模型,了解不同地区的地理特征和地貌。
10. 开发注意事项

在使用SiriKit和ARKit进行开发时,需要注意以下几点。

10.1 SiriKit开发注意事项
  • 权限管理 :确保应用在使用SiriKit的相关功能时,获得了用户的必要授权。例如,在进行支付操作时,需要明确告知用户支付的金额和对象,并获得用户的确认。
  • 错误处理 :考虑到语音识别可能存在误差,需要在应用中添加完善的错误处理机制。当用户的语音指令无法被正确识别时,应用应该能够给出友好的提示,并引导用户重新输入。
10.2 ARKit开发注意事项
  • 设备兼容性 :由于ARKit只能在特定的设备上运行,开发时需要确保应用的目标设备支持ARKit。同时,要考虑不同设备的性能差异,对应用进行优化,以保证在各种设备上都能有良好的体验。
  • 光照和环境条件 :ARKit的性能受光照和环境条件的影响较大。在开发过程中,需要进行充分的测试,确保应用在不同的光照和环境下都能正常工作。例如,在光线较暗的环境中,可以提示用户调整光照条件。
11. 未来趋势展望

随着技术的不断发展,SiriKit和ARKit也将迎来更多的发展机遇和挑战。

11.1 SiriKit未来趋势
  • 更广泛的领域支持 :未来SiriKit可能会支持更多的领域,如医疗、娱乐等。用户可以通过语音指令查询健康信息、预订电影票等。
  • 更智能的语音交互 :借助人工智能和机器学习技术,SiriKit的语音识别和理解能力将不断提升,能够更好地理解用户的意图,提供更加个性化的服务。
11.2 ARKit未来趋势
  • 与其他技术的融合 :ARKit可能会与虚拟现实(VR)、人工智能等技术深度融合,创造出更加沉浸式和智能化的体验。例如,结合人工智能实现虚拟对象的智能交互。
  • 应用场景的拓展 :除了现有的游戏、教育和装修等领域,ARKit在工业设计、旅游、购物等领域的应用也将不断拓展。例如,在旅游中,用户可以通过AR应用了解景点的历史和文化信息。
12. 总结

通过对SiriKit和ARKit的学习和实践,我们可以看到这两项技术为应用开发带来了巨大的潜力。SiriKit让应用更加智能和便捷,而ARKit则为用户带来了全新的视觉和交互体验。

在开发过程中,我们需要掌握相关的技术要点,注意开发中的细节,并关注未来的发展趋势。通过不断地探索和创新,我们可以利用SiriKit和ARKit开发出更加优秀的应用,满足用户日益增长的需求。

技术 优势 应用场景 开发要点
SiriKit 实现语音交互,提升便捷性 支付、消息传递等 处理模板代码、权限管理、错误处理
ARKit 实现增强现实,融合虚拟与现实 游戏、教育、装修等 设备兼容性、光照和环境优化
graph LR
    A[技术总结] --> B[SiriKit要点回顾]
    A --> C[ARKit要点回顾]
    B --> D[领域处理]
    B --> E[项目定制]
    B --> F[界面定制]
    C --> G[工作原理]
    C --> H[项目创建]
    C --> I[对象显示]
    C --> J[自定义形状]
    A --> K[应用案例分析]
    K --> L[SiriKit应用]
    K --> M[ARKit应用]
    L --> N[语音支付]
    L --> O[语音消息]
    M --> P[室内装修]
    M --> Q[教育应用]
    A --> R[开发注意事项]
    R --> S[SiriKit注意]
    R --> T[ARKit注意]
    S --> U[权限管理]
    S --> V[错误处理]
    T --> W[设备兼容性]
    T --> X[光照环境]
    A --> Y[未来趋势展望]
    Y --> Z[SiriKit趋势]
    Y --> AA[ARKit趋势]
    Z --> AB[领域拓展]
    Z --> AC[智能交互]
    AA --> AD[技术融合]
    AA --> AE[场景拓展]

希望本文能够帮助开发者更好地理解和应用SiriKit和ARKit,为开发出更具创新性和实用性的应用提供参考。在不断变化的技术领域中,持续学习和实践是保持领先的关键。让我们一起探索这些技术的无限可能,为用户带来更加精彩的应用体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值