文档章节

iOS开发之Accounts框架详解

珲少
 珲少
发布于 2018/08/06 18:21
字数 1217
阅读 257
收藏 0
iOS

iOS开发之Accounts框架详解

    Accounts框架是iOS原生提供的一套账户管理框架,其支持Facebook,新浪微博,腾讯微博,Twitter和领英账户管理的功能。需要注意,在iOS 11及以上系统中,将此功能已经删除,因此Accounts.framework实际上已经没有太大的意义,其只在iOS 11之前的系统上可用。

一、Accounts框架概览

从上图可以看出,Accounts框架中最重要的3个类是ACAccountCredential类、ACAccount类和ACAccountStore类。后面我们着重介绍这3个类。

      首先先来看ACAccountType类,这个类用来定义账户类型,如下:

@interface ACAccountType : NSObject
//类型描述
@property (readonly, nonatomic) NSString *accountTypeDescription;
//标识符
@property (readonly, nonatomic) NSString *identifier;
//此类账户是否已经授权
@property (readonly, nonatomic) BOOL     accessGranted;
@end

需要注意,这个类中的属性都是只读的,这也就是说,开发者不能够直接使用这个类进行对象的构建,需要借助ACAccountStore类来创建ACAccountType实例,后面会介绍。

      ACErrorCode定义了错误码的意义,如下:

typedef enum ACErrorCode {
    ACErrorUnknown = 1,//未知错误
    ACErrorAccountMissingRequiredProperty,  // 缺少必选属性错误
    ACErrorAccountAuthenticationFailed,     // 授权失败
    ACErrorAccountTypeInvalid,              // 授权无效
    ACErrorAccountAlreadyExists,            // 账户已经存在
    ACErrorAccountNotFound,                 // 账户未找到
    ACErrorPermissionDenied,                // 没有权限
    ACErrorAccessInfoInvalid,               // 信息失效
    ACErrorClientPermissionDenied,          // 客户端没有权限
    ACErrorAccessDeniedByProtectionPolicy,  // 无法取得证书
    ACErrorCredentialNotFound,              // 证书未找到
    ACErrorFetchCredentialFailed,           // 请求证书失败
    ACErrorStoreCredentialFailed,           // 存储证书失败
    ACErrorRemoveCredentialFailed,          // 删除证书失败
    ACErrorUpdatingNonexistentAccount,      // 更新失败
    ACErrorInvalidClientBundleID,           // 无效的BundleID
    ACErrorDeniedByPlugin,                  // 权限被阻止
    ACErrorCoreDataSaveFailed,              // 数据库存储失败
    ACErrorFailedSerializingAccountInfo,    //序列化数据失败
    ACErrorInvalidCommand,                  //无效的命令
    ACErrorMissingTransportMessageID,       //缺少安全信息
    ACErrorCredentialItemNotFound,          // 证书缺少字段
    ACErrorCredentialItemNotExpired,        // 证书字段失效
} ACErrorCode;

二、进行账户操作

    在iOS 11以下的系统中,在设置中可以找到账户管理选项,如下图:

点击相应的社交平台,通过账号密码可以进行登录。这里一旦设置登录,那么在第三方应用程序中便可以通过Accounts框架来获取授权信息。

    首先,要使用Accounts框架,需要导入相应头文件,如下:

#import <Accounts/Accounts.h>

但应用程序首次使用用户社交平台的账户时,需要获取用户的授权,示例代码如下:

//创建操作对象
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
//通过操作对象 构建社交平台类型示例  这里采用的新浪微博
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierSinaWeibo];
//进行用户授权请求
[accountStore requestAccessToAccountsWithType: accountType options:nil completion:^(BOOL granted, NSError *error) {
   if (error) {
        NSLog(@"error = %@", [error localizedDescription]);
   }      
   dispatch_async(dispatch_get_main_queue(), ^{
      if(granted){
         NSLog(@"授权通过了");
    });
}];

获取用户授权界面如下图所示:

一旦用户授权通过,可以使用如下方法获取到用户的社交平台账户信息:

ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *accountType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierSinaWeibo];
NSArray *twitterAccounts = [accountStore accountsWithAccountType:accountType];

Accounts框架支持的社交平台类型ID如下:

NSString * const ACAccountTypeIdentifierTwitter;//Twitter
NSString * const ACAccountTypeIdentifierFacebook;//Facebook
NSString * const ACAccountTypeIdentifierSinaWeibo;//新浪微博
NSString * const ACAccountTypeIdentifierTencentWeibo;//腾讯微博
NSString * const ACAccountTypeIdentifierLinkedIn;//领英

在调用requestAccessToAccountsWithType方法时,可以传入一个字典参数,某些社交平台的授权需要配置一些额外参数,例如:

//facebook相关
NSString * const ACFacebookAppIdKey;//设置appid
NSString * const ACFacebookPermissionsKey;//设置权限key
NSString * const ACFacebookAudienceKey; //权限key
NSString * const ACFacebookAudienceEveryone;//公开权限
NSString * const ACFacebookAudienceFriends;//好友权限
NSString * const ACFacebookAudienceOnlyMe;//私人权限
//领英相关
NSString * const ACLinkedInAppIdKey;//领英appid
NSString * const ACLinkedInPermissionsKey; //设置权限key
//腾讯微博
NSString *const ACTencentWeiboAppIdKey; //设置appid

三、用户信息相关类解析

ACAccount类解析如下:

@interface ACAccount : NSObject
- (instancetype)initWithAccountType:(ACAccountType *)type;//构造方法
@property (readonly, weak, NS_NONATOMIC_IOSONLY) NSString      *identifier;//标识符
@property (strong, NS_NONATOMIC_IOSONLY)   ACAccountType       *accountType;//账户类型
@property (copy, NS_NONATOMIC_IOSONLY)     NSString            *accountDescription;//账户描述
@property (copy, NS_NONATOMIC_IOSONLY)     NSString            *username;//用户名
@property (readonly, NS_NONATOMIC_IOSONLY)  NSString           *userFullName;//完整名称
@property (strong, NS_NONATOMIC_IOSONLY)   ACAccountCredential *credential;//授权凭证
@end

ACAccountCredential类解析如下:

@interface ACAccountCredential : NSObject
//构造方法
- (instancetype)initWithOAuthToken:(NSString *)token tokenSecret:(NSString *)secret;
- (instancetype)initWithOAuth2Token:(NSString *)token 
                       refreshToken:(NSString *)refreshToken
                         expiryDate:(NSDate *)expiryDate;
//token
@property (copy, nonatomic) NSString *oauthToken;
@end

四、ACAccountStore类解析

@interface ACAccountStore : NSObject
//所有账户列表
@property (readonly, weak, NS_NONATOMIC_IOSONLY) NSArray *accounts;
//根据id获取账户
- (ACAccount *)accountWithIdentifier:(NSString *)identifier;
//根据id获取账户类型对象
- (ACAccountType *)accountTypeWithAccountTypeIdentifier:(NSString *)typeIdentifier;
//获取指定类型的所有账户
- (NSArray *)accountsWithAccountType:(ACAccountType *)accountType;
//进行账户存储
- (void)saveAccount:(ACAccount *)account withCompletionHandler:(ACAccountStoreSaveCompletionHandler)completionHandler;
//进行账户使用权限申请
- (void)requestAccessToAccountsWithType:(ACAccountType *)accountType
                  withCompletionHandler:(ACAccountStoreRequestAccessCompletionHandler)handler NS_DEPRECATED(NA, NA, 5_0, 6_0);
- (void)requestAccessToAccountsWithType:(ACAccountType *)accountType
                                options:(NSDictionary *)options
                             completion:(ACAccountStoreRequestAccessCompletionHandler)completion;
//如果账户权限已经过期 调用此方法进行刷新
- (void)renewCredentialsForAccount:(ACAccount *)account completion:(ACAccountStoreCredentialRenewalHandler)completionHandler;
//删除账户
- (void)removeAccount:(ACAccount *)account withCompletionHandler:(ACAccountStoreRemoveCompletionHandler)completionHandler;
@end

千里之遥始于足下,冰冻三尺非一日之寒

——共勉

© 著作权归作者所有

珲少

珲少

粉丝 886
博文 394
码字总数 475753
作品 0
上海
程序员
私信 提问
iOS与JS交互之UIWebView-JSExport协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JSExport」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端(不...

QiShare
2018/08/31
0
0
【书坊赠书福利——第二期】《iOS 8开发指南》

本周是人邮IT书坊赠书的第二期,第一期参与度极高,微信君在此感谢你们的支持,第一期获奖赠书已全部寄出。 本周赠品 本周,微信君给大家推荐@人民邮电出版社-信息技术分社 刚刚上架的新书《...

生气的散人
2014/09/23
387
0
iOS与JS交互之UIWebView-JavaScriptCore框架

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JavaScriptCore」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前...

QiShare
2018/08/30
0
0
iphone开发技术要学习的内容

一.iOS基础   1 开发环境搭建以及IOS组件、框架的概要介绍。   2 mac操作系统与iOS操作系统   3 xcode IDE开发环境的初始   二.C语言基础   1数据类型、表达式与控制流程语句   ...

和谐中原植物酒
2015/08/24
155
2
【线下活动】深圳 iOSer Meetup —— 让 iOS 更有意思

8 月27日,BearyChat 和极光,「T」社区的小伙伴,一起为大家准备了一场专注于 iOS 相关技术的小型开发者交流活动,在本次「深圳 iOSer Meetup」中,除了三位嘉宾会和大家分享一些干货之外,...

极光推送
2016/08/23
561
1

没有更多内容

加载失败,请刷新页面

加载更多

华为手机翻译功能怎么使用?这三种方法请务必收藏

华为手机翻译功能怎么使用?在我们的生活中会经常遇到翻译问题,许多外语不好的朋友该怎么办呢?华为手机已经为我们解决了这个问题,今天小编就教大家学会使用华为手机中的三种翻译技巧,需要...

翻译小天才
14分钟前
2
0
企业服务软件开发中需要注意的三个问题

在开发企业服务软件时,我们需要分为:业务需求、用户需求、产品需求,三大需求层次,三个层次互相关联,企业服务软件开发首先要服务业务,需要满足业务的需求,再关注用户体验,也就是用户需...

积木创意科技
17分钟前
2
0
C++容器底层数据结构

内置数组: int arr[10][10];memset(arr,0,10*10*sizeof(int)); //初始化int tmp[10][10];memcpy(arr, tmp, 10 * 10 * sizeof(int));//拷贝 void *memcpy(void *destin, void *source,......

SibylY
17分钟前
2
0
Dubbo-自适应拓展机制

背景 在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等,这些都是Dubbo的基础组件。这些基础组件的拓展不是在系统框架启动阶段被加载,而是拓展方...

rock-man
45分钟前
6
0
Kali安装fcitx输入法(五笔)

安装fcitx > sudo apt-get install fcitx-rime fcitx-config-gtk3 重启 > sudo reboot fcitx配置 效果就是这样 配置输入法切换 系统设置...

yeahlife
47分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部