2016-11-24 9 views
6

मैं अपने ऐप में रनकीपर का उपयोग करके इसे कनेक्ट करने और उससे डेटा लाने के लिए उपयोग कर रहा हूं। एक बटन के क्लिक पर यह मुझे ब्राउज़र पर निर्देशित करता है जहां मैं रनकीपर के वेब ऐप पर लॉगिन करता हूं, एक्सेस टोकन और user_Id लाने के बाद सेवा दबाता हूं और मेरे एपिकेशन पर वापस लौटाता हूं। अब फिर से अगर मैं अपने ऐप में बटन पर क्लिक करने के लिए क्लिक करता हूं, तो यह सीधे मुझे अपने ऐप पर रीडायरेक्ट करने के लिए कहता है, लेकिन मैं जो चाहता हूं वह यह है कि प्रत्येक बार जब मैं कनेक्ट करने के लिए क्लिक करता हूं, तो उसे लॉगिन के लिए पूछना चाहिए। मुझे पता है कि मुझे कैश और कुकीज़ को साफ़ करना है, लेकिन यह नहीं पता कि कैसे।रंकीपर लॉगिन

@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...") 
    } 

    } 
} 

समारोह hitServiceToGetDataFromRunkeeper (accessToken: स्ट्रिंग) {

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) 
    }) 

} 
+0

क्या आप रनकीपर एपीआई साझा कर सकते हैं जिसका आप उपयोग कर रहे हैं? –

+0

क्या आप OAuth 1.0 या OAuth 2.0 का उपयोग कर रहे हैं? OAuth 2.0 – iDeveloper

+0

क्या आप वाकई क्लिक बटन पर अपने कैश/कुकीज़ साफ़ कर रहे हैं? – Ishika

उत्तर

0

आप निम्नलिखित तरीके

let storage = NSHTTPCookieStorage.sharedHTTPCookieStorage() 
for cookie: NSHTTPCookie in storage.cookies! { 
     storage.deleteCookie(cookie) 
} 
NSUserDefaults.standardUserDefaults().synchronize() 

या

let cookieJar : NSHTTPCookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage() 
    for cookie in cookieJar.cookies! as [NSHTTPCookie]{ 
     NSLog("cookie.domain = %@", cookie.domain) 

     if cookie.domain == "www.Your runkeeper url.com" || 
      cookie.domain == "api.Your runkeeper api .com"{ 
      cookieJar.deleteCookie(cookie) 
     } 
    } 

भी हटाने से RunKeeper के UIWebView से कुकी भी हटा सकते हैं runkeepe उपयोगकर्ता डिफ़ॉल्ट से आर टोकन।

+0

यह काम नहीं कर रहा है – Ishika

0

उपयोगकर्ता प्राधिकृत करें आप रनकीपर से कनेक्ट करने का प्रयास करके शुरू करते हैं। उपयोगकर्ता पहले से एप्लिकेशन और पहुँच टोकन अधिकृत हैं, तो अभी भी उपलब्ध है, कनेक्शन तुरंत और क्या होगा किसी भी हस्तक्षेप के बिना:

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

उपयोगकर्ता प्राधिकरण प्रदान नहीं की है, तो या पहुँच टोकन खो गया है/नष्ट कर दिया, आपके प्रतिनिधि विधि की आवश्यकता प्रमाणीकरण कहा जाएगा। इस विधि में, आप OAuth के माध्यम से प्राधिकरण का अनुरोध कर सकते हैं।

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

उद्देश्य में लॉगिन के लिए यह OAuth का उपयोग कर रहा है, इसलिए एक बार लॉगिन सफल हुआ यह टोकन और creds की दुकान तो आप मैन्युअल रूप से कीचेन prefrences स्पष्ट करने की आवश्यकता होगी। नीचे दिए गए कि जांच कर रही है के लिए:

लेखा

निकाला जा रहा है एक खाता और दुकान से अपने टोकन निकालने के लिए:

[[NXOAuth2AccountStore sharedStore] removeAccount:account]; 

ध्यान दें कि जैसा कि ऊपर वर्णित यदि आप एक सेवा की पहुंच का अनुरोध करने के लिए एक UIWebView इस्तेमाल किया , यह संभावना है कि टोकन [NSHTTPCookieStorage sharedHTTPCookieStorage]

में कैश किया गया है आप का उपयोग कुकी कैश से प्रमाणीकरण टोकन निकाल सकते हैं:

जहां myapp.com वह डोमेन है जहां से आपको ऑथ टोकन प्राप्त हुआ - likley AuthorizationURL अनुरोध के समय स्टोर को सौंपा गया है। एक सुविधा के रूप में, आप खाता.userData में टोकन के डोमेन को स्टोर करना चाह सकते हैं ताकि यदि आप कुकीज को हटाना चाहते हैं तो यह आसानी से उपलब्ध है।

संबंधित मुद्दे