OAuth2,Swift 3,Instagram

Edw*_*ter 6 ios instagram swift swift3 oauth2

IG似乎有很多变化.许多OAuth2 repos,似乎都有bug,或者真的不容易转换为Swift3.想知道是否有人有解决方案转移到Swift3并在Instagram上使用最新的变化?

解决方案最受欢 OAuth2实现似乎是一个更复杂的事情.令人惊讶的是,IG没有提供他们自己的示例文档,介绍如何使用iOS.他们只有基于Web的解决方案的文档.

也许在那里酿造的东西?他们有员工数以万计的编码员.但就目前而言,寻找一个(我敢说?)简单的解决方案.

太感谢了.:-)

Dav*_*eek 13

对于Swift 3:

更新:2017年4月17日:由于依赖关系破坏,Pods的安装不再有效.因此,我已经翻录了所需的内容,并使用桥接头创建了一个新的Github项目,并将所有需要的文件存储在项目中.如果您克隆或下载github项目,您将立即登录到Instagram.

要在项目中使用这些文件,只需将SimpleAuth文件夹中的所有文件拖放到项目中,确保标记 copy item if needed

在此输入图像描述

您还需要Disable implicit oAuth在Instagram开发人员控制台中禁用.

在此输入图像描述

然后,您将我的代码从桥接头复制/粘贴到您或您使用我的代码中.在Tar​​get的Build Settings中设置Bridging Header.

在此输入图像描述

其他一切都和以前一样:

我有Instagram帐户的结构:

struct InstagramUser {

    var token: String = ""
    var uid: String = ""
    var bio: String = ""
    var followed_by: String = ""
    var follows: String = ""
    var media: String = ""
    var username: String = ""
    var image: String = ""
}
Run Code Online (Sandbox Code Playgroud)

接收令牌的功能:

typealias JSONDictionary = [String:Any]
var user: InstagramUser?
let INSTAGRAM_CLIENT_ID = "16ee14XXXXXXXXXXXXXXXXXXXXXXXXX"
let INSTAGRAM_REDIRECT_URI = "http://www.davidseek.com/just_a_made_up_dummy_url" //just important, that it matches your developer account uri at Instagram

extension ViewController {

    func connectInstagram() {

        let auth: NSMutableDictionary = ["client_id": INSTAGRAM_CLIENT_ID,
                                         SimpleAuthRedirectURIKey: INSTAGRAM_REDIRECT_URI]

        SimpleAuth.configuration()["instagram"] = auth            
        SimpleAuth.authorize("instagram", options: [:]) { (result: Any?, error: Error?) -> Void in

            if let result = result as? JSONDictionary  {

                var token = ""
                var uid = ""
                var bio = "" 
                var followed_by = ""
                var follows = ""
                var media = ""
                var username = ""
                var image = ""

                token = (result["credentials"] as! JSONDictionary)["token"] as! String
                uid = result["uid"] as! String

                if let extra = result["extra"] as? JSONDictionary,
                    let rawInfo = extra ["raw_info"] as? JSONDictionary,
                    let data = rawInfo["data"] as? JSONDictionary {

                    bio = data["bio"] as! String

                    if let counts = data["counts"] as? JSONDictionary {
                        followed_by = String(describing: counts["followed_by"]!)
                        follows = String(describing: counts["follows"]!)
                        media = String(describing: counts["media"]!)
                    }
                }

                if let userInfo = result["user_info"] as? JSONDictionary {
                    username = userInfo["username"] as! String
                    image = userInfo["image"] as! String
                }

                self.user = InstagramUser(token: token, uid: uid, bio: bio, followed_by: followed_by, follows: follows, media: media, username: username, image: image)


            } else {
                // this handles if user aborts or the API has a problem like server issue
                let alert = UIAlertController(title: "Error!", message: nil, preferredStyle: UIAlertControllerStyle.alert)
                alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil))
                self.present(alert, animated: true, completion: nil)
            }

            if error != nil {
                print("Error during SimpleAuth.authorize: \(error)")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Instagram还说:

重要

即使我们的访问令牌没有指定过期时间,您的应用程序也应该处理用户撤销访问权限或Instagram在一段时间后使令牌过期的情况.如果令牌不再有效,则API响应将包含"error_type = OAuthAccessTokenException".在这种情况下,您需要重新验证用户以获取新的有效令牌.换句话说:不要假设您的access_token永远有效.

所以处理接收的情况 OAuthAccessTokenException