खोज…


टिप्पणियों

NSURLSession वर्ग और संबंधित वर्ग सामग्री डाउनलोड करने के लिए एक एपीआई प्रदान करते हैं। यह एपीआई प्रमाणीकरण का समर्थन करने के लिए प्रतिनिधि विधियों का एक समृद्ध सेट प्रदान करता है और आपके ऐप को निलंबित होने पर या iOS पर, जब आपका ऐप चालू नहीं होता है, तो आपके ऐप को पृष्ठभूमि डाउनलोड करने की क्षमता प्रदान करता है।

उच्च स्तर पर, NSURLSession सत्र और कार्यों की अवधारणा के आसपास आधारित है। एक कार्य एकल URL के लिए एक एकल अनुरोध (या एकल URL पर एक एकल अपलोड) का प्रतिनिधित्व करता है। एक सत्र संबंधित अनुरोधों का एक समूह है।

ऑपरेटिंग सिस्टम एक एकल preexisting सत्र प्रदान करता है - साझा सत्र, जो मूल रूप से NSURLConnection की तरह काम करता है। इसके अतिरिक्त, आप अपने ऐप में आवश्यकतानुसार अपने सत्र बना सकते हैं।

विभिन्न ऐप अलग-अलग तरीकों से सत्र का उपयोग करते हैं। कई ऐप लॉन्च पर एक ही सत्र बनाते हैं और बस इसका पुन: उपयोग करते रहते हैं। अन्य एप्लिकेशन संबंधित कार्यों के एक समूह को रद्द करने में सक्षम होने से लाभ उठाते हैं (उदाहरण के लिए जब आप टैब बंद करते हैं तो एक वेब ब्राउज़र सभी बकाया अनुरोधों को रद्द करता है), और इस प्रकार संबंधित अनुरोधों के प्रत्येक समूह को रखने के लिए एक सत्र बनाते हैं।

NSURLSession का उपयोग करते समय पहला चरण एक सत्र कॉन्फ़िगरेशन ऑब्जेक्ट बनाना है। (आमतौर पर) पुन: प्रयोज्य वस्तु में विभिन्न सत्र सेटिंग्स होती हैं, जिन्हें आप अपनी विशेष आवश्यकताओं के लिए ट्विक कर सकते हैं, जैसे कि अधिकतम संगति, प्रत्येक अनुरोध के साथ भेजने के लिए अतिरिक्त हेडर, चाहे सेलुलर रेडियो (केवल iOS) पर भेजे जाने वाले अनुरोधों को अनुमति देने के लिए, टाइमआउट, क्रेडेंशियल स्टोरेज, न्यूनतम टीएलएस संस्करण और यहां तक कि प्रॉक्सी सेटिंग्स।

सत्र कॉन्फ़िगरेशन के तीन प्रकार हैं, इस पर निर्भर करता है कि आप परिणामी सत्र को कैसे व्यवहार करना चाहते हैं:

  • डिफ़ॉल्ट कॉन्फ़िगरेशन सत्र बनाते हैं जो NSURLConnection की तरह काम करते हैं।
  • पृष्ठभूमि कॉन्फ़िगरेशन सत्र बनाते हैं जिसमें अनुरोध आउट-ऑफ-प्रोसेस होते हैं, जिससे एप्लिकेशन तब भी जारी रहता है जब एप्लिकेशन चल नहीं रहा हो।
  • पंचांग विन्यास ऐसे सत्र बनाते हैं जो डिस्क को कैश नहीं करते हैं, कुकीज़ को डिस्क पर संग्रहीत नहीं करते हैं, आदि और इस तरह से गुप्त ब्राउज़र विंडो जैसी चीजों का समर्थन करने के लिए उपयुक्त हैं।

जब आप एक पृष्ठभूमि कॉन्फ़िगरेशन बनाते हैं, तो आपको एक सत्र पहचानकर्ता प्रदान करना होगा जो आपको बाद में पृष्ठभूमि सत्र को पुनः स्थापित करने की अनुमति देता है (यदि आपका ऐप बाहर निकलता है या ओएस द्वारा निलंबित या समाप्त किया जाता है)। आपके ऐप में समान पहचानकर्ता के साथ सत्र का एक से अधिक उदाहरण नहीं होना चाहिए, इसलिए एक नियम के रूप में, ये कॉन्फ़िगरेशन पुन: प्रयोज्य नहीं हैं। अन्य सभी सत्र विन्यासों का पुन: उपयोग किया जा सकता है, जितने सत्रों को आप बनाना चाहते हैं। इसलिए यदि आपको समान सेटिंग्स के साथ कई सत्र बनाने की आवश्यकता है, तो आप एक बार कॉन्फ़िगरेशन बना सकते हैं और हर बार जब आप एक नया सत्र बनाते हैं तो इसका पुन: उपयोग कर सकते हैं।

एक सत्र बनाने के बाद, आप उस सत्र में कार्य बना सकते हैं। तीन प्रकार के कार्य हैं:

  • डेटा कार्य NSData ऑब्जेक्ट के रूप में डेटा लौटाते हैं। ये सामान्य उपयोग के लिए उपयुक्त हैं, लेकिन पृष्ठभूमि सत्रों में समर्थित नहीं हैं।
  • डाउनलोड कार्य डिस्क पर फ़ाइल के रूप में डेटा लौटाते हैं। ये बड़े अनुरोधों या पृष्ठभूमि सत्रों में उपयोग के लिए उपयुक्त हैं।
  • अपलोड कार्य अपलोड करें NSData ऑब्जेक्ट या डिस्क पर एक फ़ाइल से डेटा अपलोड करें। आप एक डेटा ऑब्जेक्ट या फ़ाइल प्रदान करते हैं जो POST बॉडी प्रदान करती है। शरीर का डेटा / फ़ाइल जो आप कार्य पर प्रदान करते हैं, NSURLRequest ऑब्जेक्ट (यदि प्रदान किया गया है) में प्रदान किए गए किसी भी बॉडी डेटा / फ़ाइल को ओवरराइड करता है।

इन प्रकारों में से प्रत्येक आपको प्रतिक्रिया डेटा अलग-अलग तरीकों से प्राप्त करने देता है - या तो ब्लॉक-आधारित कॉलबैक का उपयोग करके या सत्र पर एक प्रतिनिधि प्रदान करके और प्रतिनिधि विधियों को लागू करके।

इसके अतिरिक्त NSURLSession आपको प्रमाणीकरण से निपटने के लिए प्रतिनिधि तरीके प्रदान करते हैं, कस्टम TLS प्रमाणपत्र हैंडलिंग (क्लाइंट प्रमाणपत्र और सर्वर सत्यापन दोनों के लिए) करते हैं, कैशिंग व्यवहार को बदलते हैं, और इसी तरह।

सरल GET अनुरोध

    // define url
    let url = NSURL(string: "https://urlToGet.com")

    //create a task to get data from a url
    let task = NSURLSession.sharedSession().dataTaskWithURL(url!)
    {

       /*inside this block, we have access to NSData *data, NSURLResponse *response, and NSError *error returned by the dataTaskWithURL() function*/
      (data, response, error) in

      if error == nil 
      {
          // Data from the request can be manipulated here
      }
      else
      {
          // An error occurred 
      }
    }

    //make the request
    task.resume()

उद्देश्य-सी एक सत्र और डेटा टास्क बनाएं

NSURL *url = [NSURL URLWithString:@"http://www.example.com/"];
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

// Configure the session here.

NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
    
[[session dataTaskWithURL:url
        completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    // The response object contains the metadata (HTTP headers, status code)

    // The data object contains the response body

    // The error object contains any client-side errors (e.g. connection
    // failures) and, in some cases, may report server-side errors.
    // In general, however, you should detect server-side errors by
    // checking the HTTP status code in the response object.
}] resume];

पृष्ठभूमि विन्यास की स्थापना

एक पृष्ठभूमि सत्र बनाने के लिए

 // Swift:
 let mySessionID = "com.example.bgSession"
 let bgSessionConfig = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier(mySessionID)
 
 let session = NSURLSession(configuration: bgSessionConfig)
 
 // add tasks here


 // Objective-C:
 NSString *mySessionID = @"com.example.bgSession";
 NSURLSessionConfiguration *configuration =
     [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier: mySessionID];
 NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
                                                       delegate:self]

इसके अतिरिक्त, iOS में, आपको बैकग्राउंड ऐप रिलॉन्च को संभालने के लिए सपोर्ट सेट करना होगा। जब आपके ऐप का application:handleEventsForBackgroundURLSession:completionHandler: विधि (उद्देश्य-सी) या application(_:handleEventsForBackgroundURLSession:completionHandler:) विधि (स्विफ्ट) कहा जाता है, इसका मतलब है कि आपके ऐप को एक सत्र में गतिविधि को संभालने के लिए पृष्ठभूमि में पुन: लॉन्च किया गया है।

उस पद्धति में, आपको प्रदान किए गए पहचानकर्ता के साथ एक नया सत्र बनाना चाहिए और इसे एक प्रतिनिधि के साथ कॉन्फ़िगर करना चाहिए जैसे कि आप सामान्य रूप से अग्रभूमि में होंगे। इसके अतिरिक्त, आपको कुंजी के रूप में सत्र का उपयोग करके, प्रदान किए गए पूर्ण हैंडलर को एक शब्दकोश में संग्रहीत करना चाहिए।

जब प्रतिनिधि का URLSessionDidFinishEventsForBackgroundURLSession: (Obj-C) / URLSessionDidFinishEventsForBackgroundURLSession (स्विफ्ट) विधि आपको यह बताने के लिए कहती है कि कोई और ईवेंट नहीं है, तो आपका ऐप उस सत्र के लिए पूरा हैंडलर देखना चाहिए। पूर्ण हैंडलर को कॉल करें, इस प्रकार ऑपरेटिंग सिस्टम को बताएं कि अब आपके पास सत्र से संबंधित कोई बकाया प्रसंस्करण नहीं है। (यदि आप उस प्रतिनिधि कॉल को प्राप्त करने के बाद भी किसी कारण से कुछ कर रहे हैं, तब तक प्रतीक्षा करें।) जैसे ही आप उस विधि को कॉल करते हैं, पृष्ठभूमि सत्र तुरंत अमान्य हो जाता है।

यदि आपका आवेदन तब एक application:application:didFinishLaunchingWithOptions: प्राप्त करता application:application:didFinishLaunchingWithOptions: कॉल (संभावित संकेत है कि जब आप पृष्ठभूमि की घटनाओं को पूरा करने में व्यस्त थे, तो उपयोगकर्ता ने आपके ऐप को अग्रभूमि कर दिया था), इस पहचानकर्ता के साथ एक पृष्ठभूमि सत्र बनाना सुरक्षित है, क्योंकि इसके साथ पुराना सत्र पहचानकर्ता अब मौजूद नहीं है।

यदि आप विवरण के बारे में उत्सुक हैं, उच्च स्तर पर, जब आप एक पृष्ठभूमि सत्र बनाते हैं, तो आप दो काम कर रहे हैं:

  • डाउनलोड को संभालने के लिए एक बाहरी डेमॉन (nsurlsessiond) में एक सत्र बनाना
  • अपने ऐप के भीतर एक सत्र बनाना जो एनएसएक्सपीसी के माध्यम से उस बाहरी डेमॉन से बात करता है

आम तौर पर, ऐप के एक ही लॉन्च में एक ही सत्र आईडी के साथ दो सत्र बनाना खतरनाक है, क्योंकि वे दोनों पृष्ठभूमि डेमॉन में एक ही सत्र में बात करने की कोशिश कर रहे हैं। यही कारण है कि आधिकारिक दस्तावेज कहता है कि एक ही पहचानकर्ता के साथ कई सत्र न बनाएं। हालाँकि, यदि पहला सत्र एक अस्थायी सत्र था, जिसे handleEventsForBackgroundURLSession हिस्से के रूप में बनाया गया था handleEventsForBackgroundURLSession कॉल, अब अमान्य अमान्य इन-ऐप सत्र और पृष्ठभूमि डेमन में सत्र मौजूद नहीं है।

उद्देश्य-सी में NSURLSession का उपयोग करके तर्कों के साथ एक पोस्ट अनुरोध भेजना

POST अनुरोध निकाय को एन्कोड करने के दो सामान्य तरीके हैं: URL एन्कोडिंग (एप्लिकेशन / x-www-form-urlencoded) और फॉर्म डेटा (मल्टीपार्ट / फॉर्म-डेटा)। अधिकांश कोड समान हैं, लेकिन आपके द्वारा शरीर डेटा का निर्माण करने का तरीका अलग है।

URL एन्कोडिंग का उपयोग करके अनुरोध भेजना

क्या आपके पास अपने छोटे अनुप्रयोग के लिए एक सर्वर है या आपके टीम में पूर्ण-बैक-एंड इंजीनियर के साथ काम कर रहा है, आप अपने iOS एप्लिकेशन के साथ एक बिंदु पर उस सर्वर से बात करना चाहेंगे।

निम्नलिखित कोड में हम उन तर्कों की एक कड़ी की रचना करेंगे जो गंतव्य सर्वर स्क्रिप्ट का उपयोग कुछ ऐसा करने के लिए करेंगे जो आपके मामले के आधार पर बदलता है। उदाहरण के लिए हम स्ट्रिंग भेजना चाहते हैं:

नाम = ब्रेंडन और पासवर्ड = abcde

सर्वर के लिए जब कोई उपयोगकर्ता आपके आवेदन पर हस्ताक्षर करता है, तो सर्वर इस जानकारी को डेटाबेस में संग्रहीत कर सकता है।

आएँ शुरू करें। आप निम्नलिखित कोड के साथ एक NSURLSession POST अनुरोध बनाना चाहते हैं।

// Create the configuration, which is necessary so we can cancel cacheing amongst other things.
NSURLSessionConfiguration * defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
// Disables cacheing
defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration:defaultConfigObject delegate:self delegateQueue:[NSOperationQueue mainQueue]];

NSString * scriptURL = [NSString stringWithFormat:@"https://server.io/api/script.php"];
//Converts the URL string to a URL usable by NSURLSession
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:scriptURL]];
NSString * postDataString = [NSString stringWithFormat:@"name=%@&password=%@", [self nameString], [self URLEncode:passwordString]];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:[postDataString dataUsingEncoding:NSUTF8StringEncoding]];

NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithRequest:urlRequest];
// Fire the data task.
[dataTask resume];

उपरोक्त कोड ने सर्वर पर POST अनुरोध को अभी बनाया और निकाल दिया। याद रखें कि स्क्रिप्ट URL और POST डेटा स्ट्रिंग आपकी स्थिति पर निर्भर करता है। यदि आप इसे पढ़ रहे हैं, तो आपको पता होगा कि उन चर को किससे भरना है।

आपको एक छोटा सा तरीका भी जोड़ना होगा जो URL एनकोडिंग करता है:

- (NSString *)URLEncode:(NSString *)originalString encoding:(NSStringEncoding)encoding
{
    return (__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(
        kCFAllocatorDefault,
        (__bridge CFStringRef)originalString,
        NULL,
        CFSTR(":/?#[]@!$&'()*+,;="),
        CFStringConvertNSStringEncodingToEncoding(encoding));
}

इसलिए, जब सर्वर इस डेटा को संसाधित कर रहा है, तो यह आपके iOS ऐप पर रिटर्न भेज देगा। इसलिए हमें इस रिटर्न को प्रोसेस करने की जरूरत है, लेकिन कैसे?

हम ईवेंट-चालित प्रोग्रामिंग का उपयोग करते हैं और NSURLSession के प्रतिनिधि तरीकों का उपयोग करते हैं। इसका मतलब यह है कि जब सर्वर प्रतिक्रिया भेजता है तो ये विधियां शुरू हो जाएंगी। निम्नलिखित 5 विधियाँ वे हैं जो पूरे अनुरोध के दौरान शुरू हो जाएँगी, हर बार एक बनाया जाता है:

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler;

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data;

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error;

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler;

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler;

नीचे आप संदर्भ में उपयोग किए गए उपरोक्त तरीकों को देखेंगे। उनके प्रत्येक उद्देश्य Apple के लिए बहुत आत्म-व्याख्यात्मक हैं, लेकिन मैंने उनके उपयोग पर वैसे भी टिप्पणी की है:

// Response handling delegates
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler{
    // Handler allows us to receive and parse responses from the server
    completionHandler(NSURLSessionResponseAllow);
}

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{

    // Parse the JSON that came in into an NSDictionary
    NSError * err = nil;
    NSDictionary * jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err];

    if (!err){ // if no error occurred, parse the array of objects as normal
        // Parse the JSON dictionary 'jsonDict' here
    }else{ // an error occurred so we need to let the user know
        // Handle your error here
    }
}

// Error handling delegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    if(error == nil){
        // Download from API was successful
        NSLog(@"Data Network Request Did Complete Successfully.");
    }else{
        // Describes and logs the error preventing us from receiving a response
        NSLog(@"Error: %@", [error userInfo]);

        // Handle network error, letting the user know what happened.
    }
}

// When the session receives a challenge (because of iOS 9 App Transport Security blocking non-valid SSL certificates) we use the following methods to tell NSURLSession "Chill out, I can trust me".
// The following is not necessary unless your server is using HTTP, not HTTPS

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler{
    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
        if([challenge.protectionSpace.host isEqualToString:@"DomainNameOfServer.io"]){
            NSURLCredential * credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
        }
    }
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{
    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
        if([challenge.protectionSpace.host isEqualToString:@"DomainNameOfServer.io"]){
            NSURLCredential * credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
            completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
        }
    }
}

तो यह बात है! वह सब कोड है जिसे आपको iOS 9 में एपीआई के लिए अनुरोध भेजने, प्राप्त करने और पार्स करने की आवश्यकता है! ठीक है ... यह बहुत सारे कोड की तरह था। लेकिन अगर ऊपर की तरह सही लागू किया जाता है, तो यह विफल-सुरक्षित होगा! यह सुनिश्चित करें कि ऊपर बताई गई त्रुटियों को हमेशा संभाल कर रखें।

प्रपत्र एन्कोडिंग का उपयोग करके अनुरोध भेजना

मनमाने ढंग से डेटा को एनकोड करने के लिए URL एन्कोडिंग एक व्यापक रूप से संगत तरीका है। हालांकि, यह द्विआधारी डेटा (जैसे फोटो) अपलोड करने के लिए अपेक्षाकृत अक्षम है क्योंकि हर गैर-एएससीआईआई बाइट तीन-वर्ण कोड में बदल जाता है। यह फ़ाइल अटैचमेंट का भी समर्थन नहीं करता है, इसलिए आपको फ़ाइल नाम और फ़ाइल डेटा को अलग-अलग फ़ील्ड के रूप में पास करना होगा।

मान लीजिए कि हम एक तस्वीर को इस तरह से अपलोड करना चाहते हैं जो कुशल हो और वास्तव में सर्वर साइड पर एक फाइल की तरह दिखती हो। ऐसा करने का एक तरीका इसके बजाय फ़ॉर्म एन्कोडिंग का उपयोग करना है। ऐसा करने के लिए, NSURLSession बनाने वाले कोड को निम्नानुसार संपादित करें:

UIImage * imgToSend;

// 2nd parameter of UIImageJPEGRepresentation represents compression quality. 0 being most compressed, 1 being the least
// Using 0.4 likely stops us hitting the servers upload limit and costs us less server space
NSData * imageData = UIImageJPEGRepresentation(imgToSend, 0.4f);

// Alternatively, if the photo is on disk, you can retrieve it with
// [NSData dataWithContentsOfURL:...]

// Set up the body of the POST request.

// This boundary serves as a separator between one form field and the next.
// It must not appear anywhere within the actual data that you intend to
// upload.
NSString * boundary = @"---------------------------14737809831466499882746641449";

// Body of the POST method
NSMutableData * body = [NSMutableData data];

// The body must start with the boundary preceded by two hyphens, followed
// by a carriage return and newline pair.
//
// Notice that we prepend two additional hyphens to the boundary when
// we actually use it as part of the body data.
//
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// This is followed by a series of headers for the first field and then
// TWO CR-LF pairs.
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"tag_name\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

// Next is the actual data for that field (called "tag_name") followed by
// a CR-LF pair, a boundary, and another CR-LF pair.
[body appendData:[strippedCompanyName dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// Encode the filename and image data as the "userfile" CGI parameter.
// This is similar to the previous field, except that it is being sent
// as an actual file attachment rather than a blob of data, which means
// it has both a filename and the actual file contents.
//
// IMPORTANT: The filename MUST be plain ASCII (and if encoded like this,
//            must not include quotation marks in the filename).
//
NSString * picFileName = [NSString stringWithFormat:@"photoName"];
NSString * appendDataString = [NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@.jpg\"\r\n", picFileName];
[body appendData:[appendDataString dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];

// Close the request body with one last boundary with two
// additional hyphens prepended **and** two additional hyphens appended.
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

// Create the session
// We can use the delegate to track upload progress and disable cacheing
NSURLSessionConfiguration * defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
defaultConfigObject.requestCachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
NSURLSession * defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];

// Data uploading task.
NSURL * url = [NSURL URLWithString:@"https://server.io/api/script.php"];
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
NSString * contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
[request addValue:contentType forHTTPHeaderField:@"Content-Type"];
request.HTTPMethod = @"POST";
request.HTTPBody = body;
NSURLSessionDataTask * uploadTask = [defaultSession dataTaskWithRequest:request];
[uploadTask resume];

यह NSURLSession के अनुरोध को पहले की तरह ही बनाता और निकालता है, और परिणामस्वरूप प्रतिनिधि तरीके बिल्कुल उसी तरह का व्यवहार करेंगे। सुनिश्चित करें कि जिस चित्र को छवि भेजी जा रही है (चर url में url पर स्थित है) छवि की उम्मीद कर रहा है और उसे सही ढंग से पार्स कर सकता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow