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(@"授权通过了");
});
}];
获取用户授权界面如下图所示: