IOS开发笔记(12)IOS如何访问通讯录

关于iOS的通讯录开发权限的说明笔记 由于接手同事的通讯录相关模块的开发工作,涉及到通讯录权限的确认,故笔记如下:(不涉及代码实现,仅对权限作说明记录) 如下表所示,iOS关于通讯录的开发有两种方式: 由于我们采用的是第一种方式【调用的系统通讯录UI获取联系人信息】,故不存在权限校验问题。 但是此方式下,由于不同系统采用不同框架,系统UI展示也存在些许不同。 iOS9以下( 真机测试:iPhone4s/ ios 阅读详情

http://blog.youkuaiyun.com/xiaofansong/article/details/9045487



目录(?)[+]

  1. 引言最近一个项目要求app能读取手机的通讯录
  2. 实现方法
  3. 备注
  4. 备注二

引言:最近一个项目要求app能读取手机的通讯录。

其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的。幸好ios6.0 以后给了个权限控制。当打开app的时候你可以选择拒绝。


实现方法:

  1. //读取所有联系人  
  2.   
  3. -(void)ReadAllPeoples  
  4.   
  5. {  
  6.       
  7.     //取得本地通信录名柄  
  8.       
  9.     ABAddressBookRef tmpAddressBook = nil;  
  10.       
  11.     if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {  
  12.         tmpAddressBook=ABAddressBookCreateWithOptions(NULL, NULL);  
  13.         dispatch_semaphore_t sema=dispatch_semaphore_create(0);  
  14.         ABAddressBookRequestAccessWithCompletion(tmpAddressBook, ^(bool greanted, CFErrorRef error){  
  15.             dispatch_semaphore_signal(sema);  
  16.         });  
  17.       
  18.     dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);  
  19.     dispatch_release(sema);  
  20.     }  
  21.     else  
  22.     {  
  23.         tmpAddressBook =ABAddressBookCreate();  
  24.     }  
  25.     //取得本地所有联系人记录  
  26.       
  27.       
  28.     if (tmpAddressBook==nil) {  
  29.         return ;  
  30.     };  
  31.     NSArray* tmpPeoples = (NSArray*)ABAddressBookCopyArrayOfAllPeople(tmpAddressBook);  
  32.       
  33.     for(id tmpPerson in tmpPeoples)  
  34.           
  35.     {  
  36.           
  37.         //获取的联系人单一属性:First name  
  38.           
  39.         NSString* tmpFirstName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonFirstNameProperty);  
  40.           
  41.         NSLog(@"First name:%@", tmpFirstName);  
  42.           
  43.         [tmpFirstName release];  
  44.           
  45.         //获取的联系人单一属性:Last name  
  46.           
  47.         NSString* tmpLastName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonLastNameProperty);  
  48.           
  49.         NSLog(@"Last name:%@", tmpLastName);  
  50.           
  51.         [tmpLastName release];  
  52.           
  53.         //获取的联系人单一属性:Nickname  
  54.           
  55.         NSString* tmpNickname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNicknameProperty);  
  56.           
  57.         NSLog(@"Nickname:%@", tmpNickname);  
  58.           
  59.         [tmpNickname release];  
  60.           
  61.         //获取的联系人单一属性:Company name  
  62.           
  63.         NSString* tmpCompanyname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonOrganizationProperty);  
  64.           
  65.         NSLog(@"Company name:%@", tmpCompanyname);  
  66.           
  67.         [tmpCompanyname release];  
  68.           
  69.         //获取的联系人单一属性:Job Title  
  70.           
  71.         NSString* tmpJobTitle= (NSString*)ABRecordCopyValue(tmpPerson, kABPersonJobTitleProperty);  
  72.           
  73.         NSLog(@"Job Title:%@", tmpJobTitle);  
  74.           
  75.         [tmpJobTitle release];  
  76.           
  77.         //获取的联系人单一属性:Department name  
  78.           
  79.         NSString* tmpDepartmentName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonDepartmentProperty);  
  80.           
  81.         NSLog(@"Department name:%@", tmpDepartmentName);  
  82.           
  83.         [tmpDepartmentName release];  
  84.           
  85.         //获取的联系人单一属性:Email(s)  
  86.           
  87.         ABMultiValueRef tmpEmails = ABRecordCopyValue(tmpPerson, kABPersonEmailProperty);  
  88.           
  89.         for(NSInteger j = 0; ABMultiValueGetCount(tmpEmails); j++)  
  90.               
  91.         {  
  92.               
  93.             NSString* tmpEmailIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpEmails, j);  
  94.               
  95.             NSLog(@"Emails%d:%@", j, tmpEmailIndex);  
  96.               
  97.             [tmpEmailIndex release];  
  98.               
  99.         }  
  100.           
  101.         CFRelease(tmpEmails);  
  102.           
  103.         //获取的联系人单一属性:Birthday  
  104.           
  105.         NSDate* tmpBirthday = (NSDate*)ABRecordCopyValue(tmpPerson, kABPersonBirthdayProperty);  
  106.           
  107.         NSLog(@"Birthday:%@", tmpBirthday);  
  108.           
  109.         [tmpBirthday release];  
  110.           
  111.         //获取的联系人单一属性:Note  
  112.           
  113.         NSString* tmpNote = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNoteProperty);  
  114.           
  115.         NSLog(@"Note:%@", tmpNote);  
  116.           
  117.         [tmpNote release];  
  118.           
  119.         //获取的联系人单一属性:Generic phone number  
  120.           
  121.         ABMultiValueRef tmpPhones = ABRecordCopyValue(tmpPerson, kABPersonPhoneProperty);  
  122.           
  123.         for(NSInteger j = 0; j < ABMultiValueGetCount(tmpPhones); j++)  
  124.               
  125.         {  
  126.               
  127.             NSString* tmpPhoneIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpPhones, j);  
  128.               
  129.             NSLog(@"tmpPhoneIndex%d:%@", j, tmpPhoneIndex);  
  130.               
  131.             [tmpPhoneIndex release];  
  132.               
  133.         }  
  134.           
  135.         CFRelease(tmpPhones);  
  136.           
  137.     }  
  138.       
  139.     //释放内存   
  140.       
  141.     [tmpPeoples release];  
  142.       
  143.     CFRelease(tmpAddressBook);  
  144.       
  145. }  
//读取所有联系人

-(void)ReadAllPeoples

{
    
    //取得本地通信录名柄
    
    ABAddressBookRef tmpAddressBook = nil;
    
    if ([[UIDevice currentDevice].systemVersion floatValue]>=6.0) {
        tmpAddressBook=ABAddressBookCreateWithOptions(NULL, NULL);
        dispatch_semaphore_t sema=dispatch_semaphore_create(0);
        ABAddressBookRequestAccessWithCompletion(tmpAddressBook, ^(bool greanted, CFErrorRef error){
            dispatch_semaphore_signal(sema);
        });
    
    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
    dispatch_release(sema);
    }
    else
    {
        tmpAddressBook =ABAddressBookCreate();
    }
    //取得本地所有联系人记录
    
    
    if (tmpAddressBook==nil) {
        return ;
    };
    NSArray* tmpPeoples = (NSArray*)ABAddressBookCopyArrayOfAllPeople(tmpAddressBook);
    
    for(id tmpPerson in tmpPeoples)
        
    {
        
        //获取的联系人单一属性:First name
        
        NSString* tmpFirstName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonFirstNameProperty);
        
        NSLog(@"First name:%@", tmpFirstName);
        
        [tmpFirstName release];
        
        //获取的联系人单一属性:Last name
        
        NSString* tmpLastName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonLastNameProperty);
        
        NSLog(@"Last name:%@", tmpLastName);
        
        [tmpLastName release];
        
        //获取的联系人单一属性:Nickname
        
        NSString* tmpNickname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNicknameProperty);
        
        NSLog(@"Nickname:%@", tmpNickname);
        
        [tmpNickname release];
        
        //获取的联系人单一属性:Company name
        
        NSString* tmpCompanyname = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonOrganizationProperty);
        
        NSLog(@"Company name:%@", tmpCompanyname);
        
        [tmpCompanyname release];
        
        //获取的联系人单一属性:Job Title
        
        NSString* tmpJobTitle= (NSString*)ABRecordCopyValue(tmpPerson, kABPersonJobTitleProperty);
        
        NSLog(@"Job Title:%@", tmpJobTitle);
        
        [tmpJobTitle release];
        
        //获取的联系人单一属性:Department name
        
        NSString* tmpDepartmentName = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonDepartmentProperty);
        
        NSLog(@"Department name:%@", tmpDepartmentName);
        
        [tmpDepartmentName release];
        
        //获取的联系人单一属性:Email(s)
        
        ABMultiValueRef tmpEmails = ABRecordCopyValue(tmpPerson, kABPersonEmailProperty);
        
        for(NSInteger j = 0; ABMultiValueGetCount(tmpEmails); j++)
            
        {
            
            NSString* tmpEmailIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpEmails, j);
            
            NSLog(@"Emails%d:%@", j, tmpEmailIndex);
            
            [tmpEmailIndex release];
            
        }
        
        CFRelease(tmpEmails);
        
        //获取的联系人单一属性:Birthday
        
        NSDate* tmpBirthday = (NSDate*)ABRecordCopyValue(tmpPerson, kABPersonBirthdayProperty);
        
        NSLog(@"Birthday:%@", tmpBirthday);
        
        [tmpBirthday release];
        
        //获取的联系人单一属性:Note
        
        NSString* tmpNote = (NSString*)ABRecordCopyValue(tmpPerson, kABPersonNoteProperty);
        
        NSLog(@"Note:%@", tmpNote);
        
        [tmpNote release];
        
        //获取的联系人单一属性:Generic phone number
        
        ABMultiValueRef tmpPhones = ABRecordCopyValue(tmpPerson, kABPersonPhoneProperty);
        
        for(NSInteger j = 0; j < ABMultiValueGetCount(tmpPhones); j++)
            
        {
            
            NSString* tmpPhoneIndex = (NSString*)ABMultiValueCopyValueAtIndex(tmpPhones, j);
            
            NSLog(@"tmpPhoneIndex%d:%@", j, tmpPhoneIndex);
            
            [tmpPhoneIndex release];
            
        }
        
        CFRelease(tmpPhones);
        
    }
    
    //释放内存 
    
    [tmpPeoples release];
    
    CFRelease(tmpAddressBook);
    
}

解释下代码:由于ios6.0系统的升级,对客户隐私有了一个较大的提示。
以前
  1. tmpAddressBook =ABAddressBookCreate();这样就可以读取了,但是现在要做一个判断了。可以具体看看代码。  
 tmpAddressBook =ABAddressBookCreate();这样就可以读取了,但是现在要做一个判断了。可以具体看看代码。
  1. 把通讯录取出来放在一个array里面。这样你就可以对数组进行你的要求了。  
把通讯录取出来放在一个array里面。这样你就可以对数组进行你的要求了。
  1.   
 
  

备注:

苹果中文语言貌似有点问题。ios6.0  会提示你的app访问日历。。。。
然后网上查了下资料。可以参照微信访问通讯录的形式,给客户一个提示
他是在plist中  添加一项 在XCode里显示的是Privacy - Contacts Usage Description。后面的string就是你要想提示的文字内容
“Privacy - Location Usage Description”。这个是定位位置提示。其他类似。

备注二:

分享一个测试经验,也是从网上看到的。
一把苹果的app访问位置或者通讯录,第一次都会有一个提示让你选择。
但是第二次及以后,即时删掉,也不会再出现了。
如果想再次出现,可以  设置-通用-还原-还原位置与隐私
这样你再次点击你的app就会再次出现了。

iOS小技能:通讯录 一、通讯录有2个框架可以访问用户的通讯录: AddressBookUI.framework:提供了联系人列表界面、联系人详情界面、添加联系人界面等;一般用于选择联系人 AddressBook.framework:纯C语言的API,仅仅是获得联系人数据;没有提供UI界面展示,需要自己搭建联系人展示界面;里面的数据类型大部分基于Core Foundation框架,要经常进行类型转换。使用麻烦。p s:... 阅读详情

相关推荐

iOS开发中使app获取本机通讯录的实现代码实例

一、在工程中添加AddressBook.framework和AddressBookUI.framework 二、获取通讯录 1、在infterface中定义数组并在init方法中初始化 代码如下: NSMutableArray *addressBookTemp;   – (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {     addressBookTemp = [NSMutableArray array]; } 2、定义一个model,用来存放通讯录中的各个属性 新建一个继承自N

iOS开发之-----iOS如何访问通讯录

引言:最近一个项目要求app能读取手机的通讯录。 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的。幸好ios6.0 以后给了个权限控制。当打开app的时候你可以选择拒绝。   实现方法: //读取所有联系人 -(void)ReadAllPeoples { //取得本地通信录名柄 ABAddressBookRef tmpAddressBo

yezibao晨木木的iOS专栏 1485

强化学习_06_pytorch-TD3实践(BipedalWalkerHardcore-v3)

DDPG的critic会高估, 从而导致actor策略失败。TD3是增加了三个关键技巧优化DDPG。经过优化后的TD3(Twin Dalayed DDPG 双延迟深度确定性策略梯度算法)适合于具有高维连续动作空间的任务。

RL小站 2690

十二,iOS通讯录好友信息的获取

iOS,通讯录具体信息获取

wang6177的专栏 875

蓝牙 - 如何在Windows下抓取蓝牙数据

选择Windows Instarller(64-bit),最好不要选择PortableApps版,因为后面需要通过btvs.exe来启动Wireshark,如果是绿色可移植版,会启动失败。在安装完以后,找到btvs.exe文件,位于路径:C:\BTP\v1.14.0\x86下,这个视安装版本不同路径名不同。在第一台机器上启动btvs.exe,第二台机器上手动启动wireshark,并将第一台机器的IP地址作为参数。1,同一机器上,Wireshark安装后,会自动直接启动,如上面使用方式一样。

guoqx的专栏 2万+

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

【代码】获取高级行情数据,并通过 qmt 进行实际下单交易,自动实现止盈止损管理

XD1996CD的博客 4110

iOS6 中如何获得通讯录访问权限

在iOS 6中,以前工作正常的访问通讯录的iPhone程序可能会出错,现象是程序启动时不提醒用户是否允许程序访问通讯录,同时在“设置->隐私->通讯录”中看不到你的程序。另外,对通讯录进行操作的代码会报类似于以下消息的错误:Could not compile statement for query (ABCCopyArrayOfAllInstancesOfClassInSourceMatching

keyboardOTA的专栏 2万+

【扫地机器人】详细介绍扫地机器人软硬件测试和场景化测试

本文提出2025版扫地机器人全生命周期测试方案,涵盖实验室仿真、硬件台架、客户实景等全流程验证。测试以"清洁率≥95%、覆盖率≥98%、MTBF≥1000h"为核心指标,采用数字孪生与120套真实场景结合的双V模型。重点包括:传感器精度(LDS误差<±10mm)、清洁系统性能(10g粉尘吸入率≥99%)、动力续航(800次循环容量保持≥80%)等硬件测试;以及SLAM重定位(误差<5cm)、AI识别(mAP>92%)等软件验证。方案特别针对宠物家庭(毛发缠绕率≤3%)、

2501_92897788的博客 2286

iOS文件处理

//----------------------获取沙盒信息-----------------         //获取应用程序根目录         NSString *path1 = NSHomeDirectory();                  //获取docment的目录         NSArray *patharr = NSSearchPathForDirectoriesIn

yezibao晨木木的iOS专栏 855

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1094

优雅谈大模型:“System2”与“System 1”

研究人员探索了三种System 2方法——RaR、S2A 和 BSM,这些方法已经成功提炼到新的LLM,这个新的模型与System 1相比,产生了更好的结果,而且成本低于System 2。然而这种方法是有局限性,只能适用于特定的任务。

鲁班模锤 5160

关于iOS系统中通讯录的访问

在早些时候,当iOS 6还没出来,我们访问通讯录只要如下简单的代码: ABAddressBookRef addressBook = ABAddressBookCreate(); 不过在iOS 6上,这个API返回空值。苹果提供了如下API: // Call ABAddressBookCreateWithOptions to create an instance of Addres

JasonLee的专栏 1万+

开源数字人、虚拟直播部署教程

对,你无看错,是欧美的。在直播带货案例里,我们把模型导入到ue4,我们给模型在ue4里预设了四个动作(站着、站着说话、坐着、坐着说话),三个表情(平静、开发、愤怒),三个镜头(全局、近矩说话、看显示器播放商品展示)。我们只需要把目标主播的直播给录制下来,提取样本数据,然后训练一个从粉丝的不同刺激的组合,到主播的不同响应方式的多元逻辑回归的数学模型参数即可。

南七小僧的学海无涯 4562

iOS获取通讯录的方法

iOS中通讯录的用法。CNContactStore类是iOS中的一个框架,用于访问和管理设备上的通讯录数据。它提供了一种统一的方式来获取、添加、更新和删除联系人和群组,以及监听通讯录数据的变化。在iOS开发中,CNContactStore类具有重要性,因为它允许应用程序与设备上的通讯录进行交互,从而实现诸如获取联系人信息、同步联系人数据、发送通讯录相关的通知等功能。通过CNContactStore类,开发人员可以轻松地构建与通讯录相关的功能,提高应用程序的用户体验和功能性。

我叫柱子哥 4669

【Claude】Disabled organization 错误:组织被禁用的原因与 API Key 绕过方法

如果环境变量存在,下一步是找出它在哪里被设置的。"Disabled organization" 错误的本质不是账户被封,而是认证优先级冲突。环境变量优先级最高始终覆盖 OAuth 订阅认证报错信息具有误导性:"组织被禁用"指的通常是 API Key 所属的组织,而不是你的个人账户旧 Key 是隐形炸弹:即使你已经不再使用某个组织的 API,只要环境变量中残留该 Key,它就会持续覆盖你的订阅认证非交互模式更敏感claude -p模式下,只要有环境变量,就会强制使用它,完全忽略/login。

博客 8873

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

ios开发 之 通讯录操作

在ios开发中,  通讯录操作还是比较常见的, 尤其是在社交项目中更为突出.  目前系统提供了两个框架对通讯录进行操作: 1. 兼容iOS9以前的框架 #import 2.iOS9以后的新框架 #import  为了项目能兼容老版本, 本文主要整理AddressBook>的使用: 一.  判断通讯录权限 /

曾治铭的博客 5321

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

iOS -- 访问通讯录

在iOS中 通讯录访问使用的是相对底层的C代码。   首先需要导入系统框架:AddressBook.framework 注意:   在程序第一次需要访问通讯录的时候,必须先询问系统是否允许当前程序访问通讯录,等待作答。iOS7以后,如果不写询问,可能崩溃。。 询问方法:参数   granted==YES,表示允许使用, granted==NO,表示不允许使用  ABAddre

转身扭到脖子的专栏 1075

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Swift iOS 9通讯录访问

原创Blog,转载请注明出处 http://blog.youkuaiyun.com/hello_hwc?viewmode=list 我的stackoverflow 前言:在iOS 9之前,一直使用AddressBook这个framework来访问用户通讯录。但是在iOS 9中,AddressBook被废弃了,转而使用Contacts Framework。 文档 Contacts Framework

Leo的专栏 4179

《iOS开发笔记--系统通讯录的访问与添加联系人》

苹果提供了访问系统通讯录的框架,以便开发者对系统通讯录进行操作。(此demo为纯代码),想要访问通讯录,需要添加AddressBookUI.framework和AddressBook.framework两个框架,添加的地点这里就不在赘述了。在控制器内部首先import两个头文件, 和 这里只是记录访问通讯录,包括:1)查看联系人  2)向通讯录内添加联系人。 - (void)viewDi

1503

通讯录访问

通讯录访问。联系人信息查看。联系人信息修改。联系人的添加和删除

qq_32510689的博客 2729

iOS 访问通讯录

1.构建UI,引入AddressBook的框架   2.向用户申请通讯录的授权  1 - (void)viewDidLoad 2 { 3 [super viewDidLoad]; 4 5 // 请求访问通讯录的权限 6 [self requestAccessAddressBook]; 7 } 8 9 // 请求访

omgd的学习笔记 649

IOS开发笔记 IOS如何访问通讯录

IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的。 幸好ios6.0 以后给了个权限控制。当打开app的时候你可以选择拒绝。 实现方法: [plain] view plaincopy //读取所有联系人      -(void)ReadAllPeoples    

奥特曼超人的博客专栏 3618

iOS开发--系统通讯录的访问与添加联系人

  公司项目有访问通讯录的需求,所以开始了探索之路。从开始的一无所知,到知识的渐渐清晰。这一切要感谢广大无私分享的 “coder”,注:我是尊称的语气!   苹果提供了访问系统通讯录的框架,以便开发者对系统通讯录进行操作。(此demo为纯代码),想要访问通讯录,需要添加AddressBookUI.framework和AddressBook.framework两个框架,添加的地点这里就不...

407
上一篇: IOS开发笔记(11)IOS开发之NSLog使用技巧
下一篇: Python入门教程 超详细1小时学会Python
wd_cloud
博客等级 码龄19年 733粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值