如何在 iOS 中通过 Twitter API 获取用户电子邮件地址?
Posted
技术标签:
【中文标题】如何在 iOS 中通过 Twitter API 获取用户电子邮件地址?【英文标题】:How to get user email address via Twitter API in iOS? 【发布时间】:2013-11-06 21:40:32 【问题描述】:我尝试了多个 SDK,但无法从任何资源中获取电子邮件 ID。为此,我尝试了FHSTwitterEngine
,但没有得到解决方案。
FHSTwitterEngine *twitterEngine = [FHSTwitterEngine sharedEngine];
NSString *username = [twitterEngine loggedInUsername]; //self.engine.loggedInUsername;
NSString *key = [twitterEngine accessToken].key;
NSString *secrete = [twitterEngine accessToken].secret;
if (username.length > 0)
NSDictionary *userProfile = [[FHSTwitterEngine sharedEngine] getProfileUsername:username];
NSLog(@"userProfile: %@", userProfile);
【问题讨论】:
您的代码示例似乎不完整..? 我喜欢 FHSTwitterEngine 哈哈 【参考方案1】:编辑
Twitter 更新 API 后,现在用户可以使用 TWTRShareEmailViewController
类获取电子邮件。
// Objective-C
if ([[Twitter sharedInstance] session])
TWTRShareEmailViewController* shareEmailViewController = [[TWTRShareEmailViewController alloc] initWithCompletion:^(NSString* email, NSError* error)
NSLog(@"Email %@, Error: %@", email, error);
];
[self presentViewController:shareEmailViewController animated:YES completion:nil];
else
// TODO: Handle user not signed in (e.g. attempt to log in or show an alert)
// Swift
if Twitter.sharedInstance().session
let shareEmailViewController = TWTRShareEmailViewController() email, error in
println("Email \(email), Error: \(error)")
self.presentViewController(shareEmailViewController, animated: true, completion: nil)
else
// TODO: Handle user not signed in (e.g. attempt to log in or show an alert)
注意事项: 即使用户允许访问她的电子邮件地址,也不能保证您会得到一个电子邮件地址。例如,如果有人使用电话号码而不是电子邮件地址注册 Twitter,则电子邮件字段可能为空。发生这种情况时,完成块将传递一个错误,因为没有可用的电子邮件地址。
Twitter Dev Ref
过去
您可以通过NO方式获取 twitter 用户的电子邮件地址。
Twitter API 不提供用户的电子邮件地址作为 OAuth 令牌协商过程的一部分,也不提供其他获取方式。
Twitter Doc.
【讨论】:
这不再正确。用户的邮箱可以通过:/1.1/account/verify_credentials.json?include_email=true 链接不存在@Virussmca dev.twitter.com/rest/reference/get/account/verify_credentials 可用于获取电子邮件 ID,但您的应用必须先列入白名单【参考方案2】:您将不得不使用 Twitter 框架。 Twitter 为此提供了一个漂亮的框架,您只需将其集成到您的应用中即可。
要获取用户电子邮件地址,您的应用程序应该被列入白名单。这是link。转到use this form。您可以向 sdk-feedback@twitter.com 发送邮件,其中包含有关您的应用程序的一些详细信息,例如消费者密钥、应用程序的应用商店链接、隐私政策链接、元数据、如何登录我们的应用程序的说明等。他们将2-3个工作日内回复。
这是我如何通过与 Twitter 支持团队的对话被列入白名单的故事:
发送邮件至sdk-feedback@twitter.com
,提供有关您的应用程序的一些详细信息,例如消费者密钥、应用程序的应用商店链接、隐私政策链接、元数据、如何登录我们的应用程序的说明。在邮件中提及您要在应用内访问用户电子邮件地址。
他们将审核您的应用并在 2-3 个工作日内回复您。
一旦他们说您的应用已列入白名单,请在 Twitter 开发者门户中更新您的应用设置。登录apps.twitter.com 并:
-
在“设置”选项卡上,添加服务条款和隐私政策 URL
在“权限”选项卡上,将令牌的范围更改为请求电子邮件。只有在您的应用被列入白名单后才能看到此选项。
动手编写代码
Twitter 框架的使用:
获取用户电子邮件地址
-(void)requestUserEmail
if ([[Twitter sharedInstance] session])
TWTRShareEmailViewController *shareEmailViewController =
[[TWTRShareEmailViewController alloc]
initWithCompletion:^(NSString *email, NSError *error)
NSLog(@"Email %@ | Error: %@", email, error);
];
[self presentViewController:shareEmailViewController
animated:YES
completion:nil];
else
// Handle user not signed in (e.g. attempt to log in or show an alert)
获取用户资料
-(void)usersShow:(NSString *)userID
NSString *statusesShowEndpoint = @"https://api.twitter.com/1.1/users/show.json";
NSDictionary *params = @@"user_id": userID;
NSError *clientError;
NSURLRequest *request = [[[Twitter sharedInstance] APIClient]
URLRequestWithMethod:@"GET"
URL:statusesShowEndpoint
parameters:params
error:&clientError];
if (request)
[[[Twitter sharedInstance] APIClient]
sendTwitterRequest:request
completion:^(NSURLResponse *response,
NSData *data,
NSError *connectionError)
if (data)
// handle the response data e.g.
NSError *jsonError;
NSDictionary *json = [NSJSONSerialization
JSONObjectWithData:data
options:0
error:&jsonError];
NSLog(@"%@",[json description]);
else
NSLog(@"Error code: %ld | Error description: %@", (long)[connectionError code], [connectionError localizedDescription]);
];
else
NSLog(@"Error: %@", clientError);
希望对你有帮助!!!
【讨论】:
【参考方案3】:如果您想要用户的电子邮件地址,则需要在您自己的应用程序和服务范围内向用户索取。 Twitter API 不提供用户的电子邮件地址作为 OAuth 令牌协商过程的一部分,也不提供其他方式来获取它。
【讨论】:
【参考方案4】:在 Swift 4.2 和 Xcode 10.1 中
它也收到电子邮件。
import TwitterKit
@IBAction func onClickTwitterSignin(_ sender: UIButton)
TWTRTwitter.sharedInstance().logIn (session, error) in
if (session != nil)
let name = session?.userName ?? ""
print(name)
print(session?.userID ?? "")
print(session?.authToken ?? "")
print(session?.authTokenSecret ?? "")
let client = TWTRAPIClient.withCurrentUser()
client.requestEmail email, error in
if (email != nil)
let recivedEmailID = email ?? ""
print(recivedEmailID)
else
print("error--: \(String(describing: error?.localizedDescription))");
let storyboard = self.storyboard?.instantiateViewController(withIdentifier: "SVC") as! SecondViewController
self.navigationController?.pushViewController(storyboard, animated: true)
else
print("error: \(String(describing: error?.localizedDescription))");
【讨论】:
【参考方案5】:斯威夫特 3-4
@IBAction func btnTwitterAction(_ sender: Any)
TWTRTwitter.sharedInstance().logIn(completion: (session, error) in
if (session != nil)
print("signed in as \(String(describing: session?.userName))");
if let mySession = session
let client = TWTRAPIClient.withCurrentUser()
//To get User name and email
client.requestEmail email, error in
if (email != nil)
print("signed in as \(String(describing: session?.userName))");
let firstName = session?.userName ?? "" // received first name
let lastName = session?.userName ?? "" // received last name
let recivedEmailID = email ?? "" // received email
else
print("error: \(String(describing: error?.localizedDescription))");
//To get user profile picture
client.loadUser(withID: session?.userID, completion: (userData, error) in
if (userData != nil)
let fullName = userData.name //Full Name
let userProfileImage = userData.profileImageLargeURL //User Profile Image
let userTwitterProfileUrl = userData?.profileURL // User TwitterProfileUrl
)
else
print("error: \(error?.localizedDescription)");
)
【讨论】:
以上是关于如何在 iOS 中通过 Twitter API 获取用户电子邮件地址?的主要内容,如果未能解决你的问题,请参考以下文章
C ++:我在一种方法中获得了一个迭代器,如何在另一种方法中通过迭代器修改原始列表?
如何在一次 API 调用中通过 Amazon SNS 发送推送通知?