ios - 跑卫登录

标签 ios swift

我在我的应用程序中使用 runkeeper 将其连接到并从中获取数据。单击一个按钮,它会将我定向到浏览器,我在其中登录 runkeeper 的 Web 应用程序,在获取访问 token 和 user_Id 后点击服务,然后返回到我的应用程序。现在,如果我再次单击应用程序中的按钮进行连接,它会直接要求我重定向回我的应用程序,但我想要的是每次单击连接时,它都应该要求登录。我知道我必须清除缓存和 cookie,但不知道如何清除。

@IBAction func btnRunKeeperClicked(sender: AnyObject) {
   MSYRunKeeper.shareInstance.loginWithRunKeeper { (result, success) in
    print(result)
    if success{
        print(result)
        let accessToken = result["accessToken"] as? String ?? ""
        self.hitServiceToGetDataFromRunkeeper(accessToken)
    }else{
        print("error...")
    }

    }
 }

func hitServiceToGetDataFromRunkeeper(accessToken:String){

    showActivityIndicator(true, inViewConroller: self, animated: true)
    let dict = HelperClass.userDefaultForAny("User_Detail")
    var userID = ""
    var serviceKey = ""
    if(dict != nil){
        userID = (dict!["userID"] as? String)!
        serviceKey = (dict!["service_key"] as? String)!
    }

    var paramDictionary = NSMutableDictionary()
    paramDictionary = ["method":"runkeeperLogin","service_key":serviceKey,"userID":userID,"runkeeperAccessToken":accessToken,"isRunkeeperConnect":"1"]

    print_debug(paramDictionary)

    FSServicesClass.sharedInstance.postWithParamater(paramDictionary, sBlock: { (result) in
        if(NSDictionary(dictionary: result).valueForKey("success")?.integerValue == 1){
            showActivityIndicator(false, inViewConroller: self, animated: true)

            self.btnRunKeeperConnected.setTitle("Connected", forState: .Normal)
            if self.btnFitBitConnected.titleLabel?.text == "Connected"{
                self.btnFitBitConnected.setTitle("Disconnected", forState: .Normal)
            }

            print(result)

            let dict = HelperClass.userDefaultForAny("User_Detail")
            HelperClass.removeFromUserDefaultForKey("User_Detail")

            let dict2 = updateUserDetailForConnetectdAppsAndDevices(dict!, isfitbitConnected: "0", isRunkeeperConnected: "1")

            HelperClass.saveToUserDefault(dict2, key: "User_Detail")
            popAlertMessageController(self, title: "Alert", message: NSDictionary(dictionary: result).valueForKey("errstr") as? String ?? "")

        }else{
            showActivityIndicator(false, inViewConroller: self, animated: true)
            popAlertMessageController(self, title: "Alert", message: NSDictionary(dictionary: result).valueForKey("errstr") as? String ?? "")

        }
        }, fBlock: {(ErrorResult) in
            showActivityIndicator(false, inViewConroller: self, animated: true)
            popAlertMessageController(self, title: "Please try again", message: NSDictionary(dictionary: ErrorResult).valueForKey("errstr")  as? String ?? "")
            //print(ErrorResult)
    })

}

最佳答案

授权用户 您首先尝试连接到 RunKeeper。如果用户之前授权应用程序并且访问 token 仍然可用,则连接将立即发生且无需任何干预:

  [[AppData sharedAppData].runKeeper tryToConnect:self];

如果用户未授予授权或访问 token 已丢失/删除,您的委托(delegate)方法 needsAuthentication 将被调用。在此方法中,您可以通过 OAuth 请求授权。

  - (void)needsAuthentication {
    [[AppData sharedAppData].runKeeper tryToAuthorize];
  }

为了登录目的,它使用 OAuth,因此一旦登录成功,它将存储 token 和凭据,因此您需要手动清除钥匙串(keychain)首选项。为了进行以下检查:

删除帐户

要从商店中删除帐户及其 token :

[[NXOAuth2AccountStore sharedStore]  removeAccount:account];

请注意,如果您如上所述使用 UIWebView 请求访问服务,则 token 很可能已缓存在 [NSHTTPCookieStorage sharedHTTPCookieStorage]

您可以使用以下方法从 cookie 缓存中删除身份验证 token :

for(NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies]) {
    if([[cookie domain] isEqualToString:@"myapp.com"]) {
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] deleteCookie:cookie];
    }
}
[[NSUserDefaults standardUserDefaults] synchronize];

其中 myapp.com 是您从中收到授权 token 的域 -- 可能是在请求时分配给商店的 authorizationURL。为方便起见,您可能希望将 token 的域存储在 account.userData 中,以便在需要删除 cookie 时随时可用。

关于ios - 跑卫登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40778405/

相关文章:

ios - 向 CAShapeLayer 添加渐变

ios - SFSafariViewController 加载空白白页

ios - 快速将字符转换为字符串

ios - SQLITE:INTERSECT/UNION 选择结果和法线数组

ios - 选择器 View 快速出错

ios - 如何将 instantiateViewControllerWithIdentifier 设置为全局变量?

ios - GameCenter排行榜发布后不会更新

ios - 等待异步操作在 Swift 中完成

ios - 无法在 iPad 上禁用旋转

swift - 如何在 SpriteKit 游戏中添加普通按钮?