我正在努力创建一个"与Instagram连接"这个按钮可以让我获得当前用户的Instagram ID。使用这些教程:[1] - [2],我设法为Twitter做同样的事情,但我无法将其转换为Instagram。这是我的代码:
User.swift
--------------
import UIKit
var _currentInstagramUser: InstagramUser?
let currentInstagramUserKey = "kCurrentInstagramUserKey"
class InstagramUser: NSObject {
var instagramid: String?
var instagramusername: String?
var dictionary: NSDictionary
init(dictionary: NSDictionary) {
self.dictionary = dictionary
instagramid = dictionary["id"] as? String
instagramusername = dictionary["username"] as? String
}
class var currentInstagramUser: InstagramUser? {
get {
if _currentInstagramUser == nil {
var data = NSUserDefaults.standardUserDefaults().objectForKey(currentInstagramUserKey) as? NSData
if data != nil {
var dictionary = NSJSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as! NSDictionary
_currentInstagramUser = InstagramUser(dictionary: dictionary)
}
}
return _currentInstagramUser
}
set(user) {
_currentInstagramUser = user
println(user)
//SAVE USER TO DATABASE &&& Remember User
if _currentInstagramUser != nil {
var data = NSJSONSerialization.dataWithJSONObject(user!.dictionary, options: nil, error: nil)
NSUserDefaults.standardUserDefaults().setObject(data, forKey: currentInstagramUserKey)
NSUserDefaults.standardUserDefaults().synchronize()
} else {
NSUserDefaults.standardUserDefaults().setObject(nil, forKey: currentInstagramUserKey)
}
NSUserDefaults.standardUserDefaults().synchronize()
}
}
}
InstagramClient.swift
-----------------------
let instagramConsumerKey = "###"
let instagramConsumerSecret = "###"
let instagramBaseURL = NSURL(string: "https://api.instagram.com")
class InstagramClient: BDBOAuth1RequestOperationManager {
var instagramLoginCompletion: ((user: InstagramUser?, error: NSError?) -> ())?
class var SharedInstance: InstagramClient {
struct Static {
static let instance = InstagramClient(baseURL: instagramBaseURL, consumerKey: instagramConsumerKey, consumerSecret: instagramConsumerSecret)
}
return Static.instance
}
func loginWithCompletionForInstagram(completion: (user: InstagramUser?, error: NSError?) -> ()) {
instagramLoginCompletion = completion
//Fetch Request Token & Redirect Authorization Page of Twitter
InstagramClient.SharedInstance.requestSerializer.removeAccessToken()
InstagramClient.SharedInstance.fetchRequestTokenWithPath("oauth/access_token", method: "POST", callbackURL: NSURL(string: "tatchinsta://oauth"), scope: nil, success: { (requestToken: BDBOAuth1Credential!) -> Void in
println("Success")
var authURL = NSURL(string: "https://instagram.com/oauth/authorize/?client_id="###"&redirect_uri="###"&response_type=\(requestToken.token)")
UIApplication.sharedApplication().openURL(authURL!)
}){ (error: NSError!) -> Void in
println(error)
self.instagramLoginCompletion?(user: nil, error: error)
}
}
func instagramOpenURL(url: NSURL) {
fetchAccessTokenWithPath("oauth/access_token", method: "POST", requestToken: BDBOAuth1Credential(queryString: url.query) , success: { (accessToken: BDBOAuth1Credential!) -> Void in
println("got access token")
InstagramClient.SharedInstance.requestSerializer.saveAccessToken(accessToken)
InstagramClient.SharedInstance.GET("https://api.instagram.com/v1/users/self/?access_token=ACCESS-TOKEN", parameters: nil, success: { (operation: AFHTTPRequestOperation!, response:AnyObject!) -> Void in
println("user: \(response)")
var user = InstagramUser(dictionary: response as! NSDictionary)
InstagramUser.currentInstagramUser = user
self.instagramLoginCompletion?(user: user, error: nil)
}, failure: { (operation:AFHTTPRequestOperation!, error:NSError!) -> Void in
println("error")
self.instagramLoginCompletion?(user: nil, error: error)
})
}) { (error: NSError!) -> Void in
println("Failed to receive access token")
self.instagramLoginCompletion?(user: nil, error: error)
}
}
}
AppDelegate.swift
------------------
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
InstagramClient.SharedInstance.instagramOpenURL(url)
return true
}
ViewController.swift
--------------------
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func instagramLoginButton(sender: AnyObject) {
InstagramClient.SharedInstance.loginWithCompletionForInstagram() {
(user: InstagramUser?, error: NSError?) in
if user != nil {
//user exists
} else {
//login error
}
}
}
当我点击"用Instagram登录"按钮(所以loginWithCompletionForInstagram)函数,我收到的错误日志是:
Error Domain=com.alamofire.error.serialization.response Code=-1011 "Request failed: bad request (400)" UserInfo=0x7f96bb900150 {com.alamofire.serialization.response.error.response=<NSHTTPURLResponse: 0x7f96b9442ed0> { URL: https://api.instagram.com/oauth/access_token } { status code: 400, headers {
"Cache-Control" = "private, no-cache, no-store, must-revalidate";
Connection = "keep-alive";
"Content-Language" = en;
"Content-Length" = 94;
"Content-Type" = "application/json";
Date = "Fri, 24 Apr 2015 23:55:20 GMT";
Expires = "Sat, 01 Jan 2000 00:00:00 GMT";
Pragma = "no-cache";
Server = nginx;
"Set-Cookie" = "csrftoken=f021070d367caacba3c1c63b38ac9394; expires=Fri, 22-Apr-2016 23:55:20 GMT; Max-Age=31449600; Path=/, mid=VTrX6AAAAAHQfPFksK-b-EDV7C0t; expires=Thu, 19-Apr-2035 23:55:20 GMT; Max-Age=630720000; Path=/";
Vary = "Cookie, Accept-Language";
} }, NSErrorFailingURLKey=https://api.instagram.com/oauth/access_token, com.alamofire.serialization.response.error.data=<7b22636f 6465223a 20343030 2c202265 72726f72 5f747970 65223a20 224f4175 74684578 63657074 696f6e22 2c202265 72726f72 5f6d6573 73616765 223a2022 596f7520 6d757374 2070726f 76696465 20612063 6c69656e 745f6964 227d>, NSLocalizedDescription=Request failed: bad request (400)}