<object returned empty description>

本文详细解释了在iOS开发过程中遇到的使用po输出导致空对象的问题,并提供了解决方案:通过nslog输出需要测试的字符串来避免空对象返回。此外,文章还介绍了iOS开发中的关键概念和最佳实践。
出现这种的原因肯定是你打断点调试的时候用的po 输出的,字面意思就是返回了空的对象,如果要避免这种情况,你就用nslog输出你要测试的字符串就行了。
/* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0 and the Server Side Public License, v 1; you may not use this file except * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ import { Observable } from 'rxjs'; import { MaybePromise } from '@kbn/utility-types'; import type { KibanaExecutionContext } from '../execution_context'; /** @public */ export interface HttpSetup { /** * APIs for manipulating the basePath on URL segments. * See {@link IBasePath} */ basePath: IBasePath; /** * APIs for denoting certain paths for not requiring authentication */ anonymousPaths: IAnonymousPaths; externalUrl: IExternalUrl; /** * Adds a new {@link HttpInterceptor} to the global HTTP client. * @param interceptor a {@link HttpInterceptor} * @returns a function for removing the attached interceptor. */ intercept(interceptor: HttpInterceptor): () => void; /** Makes an HTTP request. Defaults to a GET request unless overridden. See {@link HttpHandler} for options. */ fetch: HttpHandler; /** Makes an HTTP request with the DELETE method. See {@link HttpHandler} for options. */ delete: HttpHandler; /** Makes an HTTP request with the GET method. See {@link HttpHandler} for options. */ get: HttpHandler; /** Makes an HTTP request with the HEAD method. See {@link HttpHandler} for options. */ head: HttpHandler; /** Makes an HTTP request with the OPTIONS method. See {@link HttpHandler} for options. */ options: HttpHandler; /** Makes an HTTP request with the PATCH method. See {@link HttpHandler} for options. */ patch: HttpHandler; /** Makes an HTTP request with the POST method. See {@link HttpHandler} for options. */ post: HttpHandler; /** Makes an HTTP request with the PUT method. See {@link HttpHandler} for options. */ put: HttpHandler; /** * Adds a new source of loading counts. Used to show the global loading indicator when sum of all observed counts are * more than 0. * @param countSource$ an Observable to subscribe to for loading count updates. */ addLoadingCountSource(countSource$: Observable<number>): void; /** * Get the sum of all loading count sources as a single Observable. */ getLoadingCount$(): Observable<number>; } /** * See {@link HttpSetup} * @public */ export type HttpStart = HttpSetup; /** * APIs for manipulating the basePath on URL segments. * @public */ export interface IBasePath { /** * Gets the `basePath` string. */ get: () => string; /** * Prepends `path` with the basePath. */ prepend: (url: string) => string; /** * Removes the prepended basePath from the `path`. */ remove: (url: string) => string; /** * Returns the server's root basePath as configured, without any namespace prefix. * * See {@link BasePath.get} for getting the basePath value for a specific request */ readonly serverBasePath: string; /** * The server's publicly exposed base URL, if configured. Includes protocol, host, port (optional) and the * {@link IBasePath.serverBasePath}. * * @remarks * Should be used for generating external URL links back to this Kibana instance. */ readonly publicBaseUrl?: string; } /** * APIs for working with external URLs. * * @public */ export interface IExternalUrl { /** * Determines if the provided URL is an internal url. * * @param relativeOrAbsoluteUrl */ isInternalUrl(relativeOrAbsoluteUrl: string): boolean; /** * Determines if the provided URL is a valid location to send users. * Validation is based on the configured allow list in kibana.yml. * * If the URL is valid, then a URL will be returned. * Otherwise, this will return null. * * @param relativeOrAbsoluteUrl */ validateUrl(relativeOrAbsoluteUrl: string): URL | null; } /** * APIs for denoting paths as not requiring authentication */ export interface IAnonymousPaths { /** * Determines whether the provided path doesn't require authentication. `path` should include the current basePath. */ isAnonymous(path: string): boolean; /** * Register `path` as not requiring authentication. `path` should not include the current basePath. */ register(path: string): void; } /** * Headers to append to the request. Any headers that begin with `kbn-` are considered private to Core and will cause * {@link HttpHandler} to throw an error. * @public */ export interface HttpHeadersInit { [name: string]: any; } /** * Fetch API options available to {@link HttpHandler}s. * * @internalRemarks these docs are largely copied from TypeScript's included dom types. * @public */ export interface HttpRequestInit { /** * A BodyInit object or null to set request's body. */ body?: BodyInit | null; /** * The cache mode associated with request, which is a string indicating how the request will interact with the * browser's cache when fetching. */ cache?: RequestCache; /** * The credentials mode associated with request, which is a string indicating whether credentials will be sent with * the request always, never, or only when sent to a same-origin URL. */ credentials?: RequestCredentials; /** {@link HttpHeadersInit} */ headers?: HttpHeadersInit; /** * Subresource integrity metadata, which is a cryptographic hash of the resource being fetched. Its value consists of * multiple hashes separated by whitespace. */ integrity?: string; /** Whether or not request can outlive the global in which it was created. */ keepalive?: boolean; /** HTTP method, which is "GET" by default. */ method?: string; /** * The mode associated with request, which is a string indicating whether the request will use CORS, or will be * restricted to same-origin URLs. */ mode?: RequestMode; /** * The redirect mode associated with request, which is a string indicating how redirects for the request will be * handled during fetching. A request will follow redirects by default. */ redirect?: RequestRedirect; /** * The referrer of request. Its value can be a same-origin URL if explicitly set in init, the empty string to * indicate no referrer, and "about:client" when defaulting to the global's default. This is used during fetching to * determine the value of the `Referer` header of the request being made. */ referrer?: string; /** * The referrer policy associated with request. This is used during fetching to compute the value of the request's * referrer. */ referrerPolicy?: ReferrerPolicy; /** * Returns the signal associated with request, which is an AbortSignal object indicating whether or not request has * been aborted, and its abort event handler. */ signal?: AbortSignal | null; /** * Can only be null. Used to disassociate request from any Window. */ window?: null; } /** @public */ export interface HttpFetchQuery { /** * TypeScript note: Technically we should use this interface instead, but @types/node uses the below stricter * definition, so to avoid TypeScript errors, we'll restrict our version. * * [key: string]: * | string * | number * | boolean * | Array<string | number | boolean> * | undefined * | null; */ [key: string]: string | number | boolean | string[] | number[] | boolean[] | undefined | null; } /** * All options that may be used with a {@link HttpHandler}. * @public */ export interface HttpFetchOptions extends HttpRequestInit { /** * The query string for an HTTP request. See {@link HttpFetchQuery}. */ query?: HttpFetchQuery; /** * Whether or not the request should automatically prepend the basePath. Defaults to `true`. */ prependBasePath?: boolean; /** * Headers to send with the request. See {@link HttpHeadersInit}. */ headers?: HttpHeadersInit; /** * Whether or not the request should include the "system request" header to differentiate an end user request from * Kibana internal request. * Can be read on the server-side using KibanaRequest#isSystemRequest. Defaults to `false`. */ asSystemRequest?: boolean; /** * When `true` the return type of {@link HttpHandler} will be an {@link HttpResponse} with detailed request and * response information. When `false`, the return type will just be the parsed response body. Defaults to `false`. */ asResponse?: boolean; context?: KibanaExecutionContext; } /** * Similar to {@link HttpFetchOptions} but with the URL path included. * @public */ export interface HttpFetchOptionsWithPath extends HttpFetchOptions { /* * The path on the Kibana server to send the request to. Should not include the basePath. */ path: string; } /** * A function for making an HTTP requests to Kibana's backend. See {@link HttpFetchOptions} for options and * {@link HttpResponse} for the response. * * @param path the path on the Kibana server to send the request to. Should not include the basePath. * @param options {@link HttpFetchOptions} * @returns a Promise that resolves to a {@link HttpResponse} * @public */ export interface HttpHandler { <TResponseBody = unknown>( path: string, options: HttpFetchOptions & { asResponse: true } ): Promise<HttpResponse<TResponseBody>>; <TResponseBody = unknown>(options: HttpFetchOptionsWithPath & { asResponse: true }): Promise< HttpResponse<TResponseBody> >; <TResponseBody = unknown>(path: string, options?: HttpFetchOptions): Promise<TResponseBody>; <TResponseBody = unknown>(options: HttpFetchOptionsWithPath): Promise<TResponseBody>; } /** @public */ export interface HttpResponse<TResponseBody = unknown> { /** The original {@link HttpFetchOptionsWithPath} used to send this request. */ readonly fetchOptions: Readonly<HttpFetchOptionsWithPath>; /** Raw request sent to Kibana server. */ readonly request: Readonly<Request>; /** Raw response received, may be undefined if there was an error. */ readonly response?: Readonly<Response>; /** Parsed body received, may be undefined if there was an error. */ readonly body?: TResponseBody; } /** * Properties that can be returned by HttpInterceptor.request to override the response. * @public */ export interface IHttpResponseInterceptorOverrides<TResponseBody = unknown> { /** Raw response received, may be undefined if there was an error. */ readonly response?: Readonly<Response>; /** Parsed body received, may be undefined if there was an error. */ readonly body?: TResponseBody; } /** @public */ export interface ResponseErrorBody { message: string; statusCode: number; attributes?: Record<string, unknown>; } /** @public */ export interface IHttpFetchError<TResponseBody = unknown> extends Error { readonly name: string; readonly request: Request; readonly response?: Response; /** * @deprecated Provided for legacy compatibility. Prefer the `request` property instead. */ readonly req: Request; /** * @deprecated Provided for legacy compatibility. Prefer the `response` property instead. */ readonly res?: Response; readonly body?: TResponseBody; } /** @public */ export interface HttpInterceptorResponseError extends HttpResponse { request: Readonly<Request>; error: Error | IHttpFetchError; } /** @public */ export interface HttpInterceptorRequestError { fetchOptions: Readonly<HttpFetchOptionsWithPath>; error: Error; } /** * An object that may define global interceptor functions for different parts of the request and response lifecycle. * See {@link IHttpInterceptController}. * * @public */ export interface HttpInterceptor { /** * Define an interceptor to be executed before a request is sent. * @param request * @param controller {@link IHttpInterceptController} */ request?( fetchOptions: Readonly<HttpFetchOptionsWithPath>, controller: IHttpInterceptController ): MaybePromise<Partial<HttpFetchOptionsWithPath>> | void; /** * Define an interceptor to be executed if a request interceptor throws an error or returns a rejected Promise. * @param httpErrorRequest {@link HttpInterceptorRequestError} * @param controller {@link IHttpInterceptController} */ requestError?( httpErrorRequest: HttpInterceptorRequestError, controller: IHttpInterceptController ): MaybePromise<Partial<HttpFetchOptionsWithPath>> | void; /** * Define an interceptor to be executed after a response is received. * @param httpResponse {@link HttpResponse} * @param controller {@link IHttpInterceptController} */ response?( httpResponse: HttpResponse, controller: IHttpInterceptController ): MaybePromise<IHttpResponseInterceptorOverrides> | void; /** * Define an interceptor to be executed if a response interceptor throws an error or returns a rejected Promise. * @param httpErrorResponse {@link HttpInterceptorResponseError} * @param controller {@link IHttpInterceptController} */ responseError?( httpErrorResponse: HttpInterceptorResponseError, controller: IHttpInterceptController ): MaybePromise<IHttpResponseInterceptorOverrides> | void; } /** * Used to halt a request Promise chain in a {@link HttpInterceptor}. * @public */ export interface IHttpInterceptController { /** Whether or not this chain has been halted. */ halted: boolean; /** Halt the request Promise chain and do not process further interceptors or response handlers. */ halt(): void; }
最新发布
12-18
GetSupportedMetadata Description: This method provides a computer readable description of the metadata that the selected analytics modules can generate. The type parameter allows to select a single analytics module. By default the output shall relate to all analytics modules that exist in the device. The response shall provide a sample XML frame. The sample frame shall include all potentially generated elements by the selected analytics modules. Note that this e.g. does not need to include all possible class type enumerations. SOAP action: http://www.onvif.org/ver20/analytics/wsdl/GetSupportedMetadata Input: [GetSupportedMetadata] Type - optional; [QName] Optional reference to an AnalyticsModule Type returned from GetSupportedAnalyticsModules. Output: [GetSupportedMetadataResponse] AnalyticsModule - optional, unbounded; [MetadataInfo] Type - required; [QName] Reference to an AnalyticsModule Type. SampleFrame [Frame] Sample frame content starting with the tt:Frame node. UtcTime - required; [dateTime] Colorspace [string] Default color space of Color definitions in frame. Valid values are "RGB" and "YCbCr". Defaults to "YCbCr". Source [string] Optional name of the analytics module that generated this frame. PTZStatus - optional; [PTZStatus] Transformation - optional; [Transformation] Object - optional, unbounded; [Object] ObjectId [integer] UUID [string] Object unique identifier. Parent [integer] Object ID of the parent object. eg: License plate object has Vehicle object as parent. ParentUUID [string] Object UUID of the parent object. eg: License plate object has Vehicle object as parent. Appearance - optional; [Appearance] Transformation - optional; [Transformation] Shape - optional; [ShapeDescriptor] BoundingBox [Rectangle] CenterOfGravity [Vector] Polygon - optional, unbounded; [Polygon] Extension - optional; [ShapeDescriptorExtension] Color - optional; [ColorDescriptor] Class - optional; [ClassDescriptor] ClassCandidate - optional, unbounded; [ClassCandidate] Type [ClassType] - enum { 'Animal', 'Face', 'Human', 'Vehical', 'Other' } Likelihood [float] Extension - optional; [ClassDescriptorExtension] OtherTypes - unbounded; [OtherType] Type [string] Object Class Type Likelihood [float] A likelihood/probability that the corresponding object belongs to this class. The sum of the likelihoods shall NOT exceed 1 Type - optional, unbounded; [StringLikelihood] For well-defined values see tt:ObjectType. Other type definitions like tt:VehicleType may be applied as well. Extension - optional; [AppearanceExtension] GeoLocation - optional; [GeoLocation] VehicleInfo - optional, unbounded; [VehicleInfo] Type [StringLikelihood] Brand - optional; [StringLikelihood] Model - optional; [StringLikelihood] Color - optional; [ColorDescriptor] LicensePlateInfo - optional; [LicensePlateInfo] PlateNumber [StringLikelihood] A string of vehicle license plate number. PlateType - optional; [StringLikelihood] A description of the vehicle license plate, e.g., "Normal", "Police", "Diplomat" CountryCode - optional; [StringLikelihood] Describe the country of the license plate, in order to avoid the same license plate number. IssuingEntity - optional; [StringLikelihood] State province or authority that issue the license plate. HumanFace - optional; [HumanFace] HumanBody - optional; [HumanBody] ImageRef - optional; [anyURI] Image - optional; [base64Binary] BarcodeInfo - optional; [BarcodeInfo] Data [StringLikelihood] Information encoded in barcode Type - optional; [StringLikelihood] Acceptable values are defined in tt:BarcodeType PPM - optional; [float] Refers to the pixels per module SphericalCoordinate - optional; [SphericalCoordinate] Label - optional, unbounded; [LabelInfo] Likelihood [float] Authority [string] ID Behaviour - optional; [Behaviour] Removed - optional; Idle - optional; Extension - optional; [BehaviourExtension] Speed - optional; [float] Direction - optional; [GeoOrientation] Direction the object is moving. Yaw describes the horizontal direction in the range [-180..180] where 0 is towards the right of the device and 90 is away from the device. Pitch describes the vertical direction in the range [-90..90] where 90 is upwards. Extension - optional; [ObjectExtension] ObjectTree - optional; [ObjectTree] Rename - optional, unbounded; [Rename] from [ObjectId] ObjectId [integer] UUID [string] Object unique identifier. to [ObjectId] ObjectId [integer] UUID [string] Object unique identifier. Split - optional, unbounded; [Split] from [ObjectId] ObjectId [integer] UUID [string] Object unique identifier. to - unbounded; [ObjectId] ObjectId [integer] UUID [string] Object unique identifier. Merge - optional, unbounded; [Merge] from - unbounded; [ObjectId] ObjectId [integer] UUID [string] Object unique identifier. to [ObjectId] ObjectId [integer] UUID [string] Object unique identifier. Delete - optional, unbounded; [ObjectId] ObjectId [integer] UUID [string] Object unique identifier. Extension - optional; [ObjectTreeExtension] Extension - optional; [FrameExtension] MotionInCells - optional; [MotionInCells] Columns - required; [integer] Number of columns of the cell grid (x dimension) Rows - required; [integer] Number of rows of the cell grid (y dimension) Cells - required; [base64Binary] A “1” denotes a cell where motion is detected and a “0” an empty cell. The first cell is in the upper left corner. Then the cell order goes first from left to right and then from up to down. If the number of cells is not a multiple of 8 the last byte is filled with zeros. The information is run length encoded according to Packbit coding in ISO 12369 (TIFF, Revision 6.0). Extension - optional; [FrameExtension2] SceneImageRef - optional; [anyURI] SceneImage - optional; [base64Binary]根据这个说明完善一下int __tan__GetSupportedMetadata(struct soap *soap, struct _tan__GetSupportedMetadata *req, struct _tan__GetSupportedMetadataResponse *res)这个函数,目前只需要输出车辆数据
10-11
根据以下的测试步骤和测试说明文档,请给出onvif server响应getsupportedmetadata的全部流程,给出每个接口输入的请求和返回的内容,各个接口之间的联系便于绘制框架流程图ANALYTICS-4-1-4-v21.06 GET SUPPORTED METADATA STEP 1 - Get Device service address StepStart: 2025-11-03T09:04:32.5671193Z http://192.168.0.240:2020/onvif/device_service STEP PASSED STEP 2 - Check that the DUT returned Device service address StepStart: 2025-11-03T09:04:32.5683188Z STEP PASSED STEP 3 - Get Services StepStart: 2025-11-03T09:04:32.5817984Z Transmit done Receive done STEP PASSED STEP 4 - Get Media2 service address StepStart: 2025-11-03T09:04:32.676164Z http://192.168.0.240:2020/onvif/service STEP PASSED STEP 5 - Check that the DUT returned Media2 service address StepStart: 2025-11-03T09:04:32.6776575Z STEP PASSED STEP 6 - Get Analytics Configurations (Media2) StepStart: 2025-11-03T09:04:32.6950262Z Transmit done Receive done STEP PASSED STEP 7 - Check if GetAnalyticsConfigurations returned at least one Video Analytics Configuration item StepStart: 2025-11-03T09:04:32.8387952Z STEP PASSED STEP 8 - Get AnalyticsEngine service address StepStart: 2025-11-03T09:04:32.8399782Z http://192.168.0.240:2020/onvif/service STEP PASSED STEP 9 - Check that the DUT returned AnalyticsEngine service address StepStart: 2025-11-03T09:04:32.8414817Z STEP PASSED STEP 10 - Get Supported Analytics Modules(Analytics) [ConfigurationToken = video_analytics_2] StepStart: 2025-11-03T09:04:32.8565951Z Transmit done Receive done STEP PASSED STEP 11 - Get Supported Metadata(Analytics) StepStart: 2025-11-03T09:04:32.9569048Z Transmit done Receive done STEP PASSED STEP 12 - Check that MetadataInfo list contains at lest one item StepStart: 2025-11-03T09:04:33.0464978Z STEP PASSED STEP 13 - Check that bounding boxes and shapes of Object with ObjectId='101' in AnalyticsModule Type='http://www.onvif.org/ver10/schema:CellMotionEngine' are located in the top left quarter of the image StepStart: 2025-11-03T09:04:33.0531706Z STEP PASSED STEP 14 - Check that all MetadataInfo items contain different Type values StepStart: 2025-11-03T09:04:33.0625564Z STEP PASSED STEP 15 - Check that MetadataInfo item contains Type value from the following list: http://www.onvif.org/ver10/schema:CellMotionEngine http://www.onvif.org/ver10/schema:TamperEngine http://www.onvif.org/ver10/schema:LineDetector StepStart: 2025-11-03T09:04:33.0711766Z STEP PASSED STEP 16 - Get Supported Metadata(Analytics) StepStart: 2025-11-03T09:04:33.0819798Z Transmit done Receive done STEP PASSED STEP 17 - Check that bounding boxes and shapes of Object with ObjectId='101' in AnalyticsModule Type='http://www.onvif.org/ver10/schema:CellMotionEngine' are located in the top left quarter of the image StepStart: 2025-11-03T09:04:33.1672368Z STEP PASSED STEP 18 - Check that GetSupportedMetadata returned only one MetadataInfo item StepStart: 2025-11-03T09:04:33.1696188Z STEP PASSED STEP 19 - Check that MetadataInfo item contains Type value = 'http://www.onvif.org/ver10/schema:CellMotionEngine' StepStart: 2025-11-03T09:04:33.171436Z STEP PASSED STEP 20 - Compare MetadataInfo items with type = 'http://www.onvif.org/ver10/schema:CellMotionEngine' StepStart: 2025-11-03T09:04:33.1860089Z STEP PASSED STEP 21 - Get Supported Metadata(Analytics) StepStart: 2025-11-03T09:04:33.1880902Z Transmit done Receive done STEP PASSED STEP 22 - Get Supported Metadata(Analytics) StepStart: 2025-11-03T09:04:33.2683673Z Transmit done Receive done STEP PASSED TEST PASSED 5.4.4 GET SUPPORTED METADATA Test Case ID: ANALYTICS-4-1-4 Specification Coverage: GetSupportedMetadata (ONVIF Analytics Service Spec) Feature under test: GetSupportedMetadata (Analytics) WSDL Reference: analytics.wsdl Test Purpose: To verify getting supported metadata using GetSupportedMetadata request. Pre-Requisite: Analytics Service was received from the DUT. Media2 Service was received from the DUT. Analytics Modules is supported by the DUT. Supported Metadata feature is supported by the DUT. Test Configuration: ONVIF Client and DUT Test Procedure: 1.Start an ONVIF Client. 2.Start the DUT. 3.ONVIF Client retrieves full list of supported Analytics Modules by following the procedure mentioned in Annex A.13 with the following input and output parameters •out fullAnalyticsModuleDescriptionList - a list of supported Analytics Module Description 4.Set analyticsModuleTypeList := list of @Name values from fullAnalyticsModuleDescriptionList 5.ONVIF Client retrieves a list of supported metadata by following the procedure mentioned in Annex A.14 with the following input and output parameters •out analyticsModuleList1 - Analytics Module List with Metadata Info 6.If analyticsModuleList1 is empty, FAIL the test and skip other steps. 7.If analyticsModuleList1 contains at least two elements with the same @Type, FAIL the test and skip other steps. 8.For each Analytics Module analyticsModule from analyticsModuleList1 repeat the following steps: 8.1 If analyticsModule.@Type is not equal to at least one Type from analyticsModuleTypeList, FAIL the test and skip other steps. 8.2 ONVIF Client checks that object bounding boxes and shapes are located in the top left quarter of the image by following the procedure mentioned in Annex A.25 with the following input and output parameters •in analyticsModule.SampleFrame - sample frame of analytics module 9.For each Analytics Module Type analyticsModuleType from analyticsModuleTypeList repeat the following steps: 9.1 ONVIF Client invokes GetSupportedMetadata request with parameters •Type := analyticsModuleType 9.2 DUT responds with GetSupportedMetadataResponse message with parameters •AnalyticsModule list =: analyticsModuleList2 9.3 If analyticsModuleList2 contains more than one element, FAIL the test and skip other steps. 9.4 If analyticsModuleList2[0].@Type is not equal to analyticsModuleType, FAIL the test and skip other steps. 9.5 If set of fields in analyticsModuleList2[0] is not equal to set of filels in corresponding AnalyticsModule from analyticsModuleList1 (see Note at the end of the test), FAIL the test and skip other steps. 9.6 ONVIF Client checks that object bounding boxes and shapes are located in the top left quarter of the image by following the procedure mentioned in Annex A.25 with the following input and output parameters •in analyticsModuleList2[0].SampleFrame - sample frame of analytics module Test Result: PASS – • DUT passes all assertions. FAIL – • The DUT did not send GetSupportedMetadataResponse messages. Note: Presence of all fields without their values are compared at step 8.5, @Type value is used as key.
11-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值