2016-11-23 84 views
0

我的應用在收到購買後將收據發送到服務器。要字典添加兩個附加鍵:「bundleId」(應用程序包ID),「UUID」(應用程序標識符ForVendor)。 批准並首次運行後,應用程序一切正常(恢復我獲得所有的密鑰後)。當用戶刪除應用程序並重新安裝時,這些鍵值爲空。解析json後的空值

取當前appStoreReceipt:

if(!self.receiptData){ 

    NSURL *receiptURL = [[NSBundle mainBundle] 
         appStoreReceiptURL]; 
self.receiptData = [NSData 
      dataWithContentsOfURL:receiptURL] 
receipt = [self.receiptData bkrBase64EncodedString]; 
    } 
    else{ 
     receipt = [self.receiptData bkrBase64EncodedString]; 
    } 

蘋果要求:

if(receipt){ 
    NSError *error; 
    NSDictionary *requestContents = @{ 
             @"receipt-data" : receipt, 
             @"password" : //purchaseAppSecreatKey 
             }; 
    NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents 
                  options:0 
                  error:&error]; 

    if (!requestData) { /* ... Handle error ... */ 
    } 
    // Create a POST request with the receipt data. 
    NSURL *storeURL = ///iTunesVerificationURL 

    NSMutableURLRequest *storeRequest = 
    [NSMutableURLRequest requestWithURL:storeURL]; 
    [storeRequest setHTTPMethod:@"POST"]; 
    [storeRequest setHTTPBody:requestData]; 

    // Make a connection to the iTunes Store on a background queue. 
    NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; 
    [NSURLConnection 
    sendAsynchronousRequest:storeRequest 
    queue:operationQueue 
    completionHandler:^(NSURLResponse *response, NSData *data, 
         NSError *connectionError) { 

     if (connectionError) { 
     NSLog(@"response error %@", connectionError.localizedDescription); 

     } else { 

      NSError *error; 
      NSDictionary *jsonResponse = 
      [NSJSONSerialization JSONObjectWithData:data 
               options:0 
               error:&error] ; 

      if(!error){ 
       //success, sending to server 
      }else{ 
       NSLog(@"parse error %@", error.localizedDescription); 
      } 
     } 
    }]; 
} 

發送到服務器代碼

NSMutableDictionary *requestBodyDictonary = [NSMutableDictionary dictionaryWithDictionary:reciptDic]; 
[requestBodyDictonary setObject:[self bundleId] forKey:@"bundleId"]; 
[requestBodyDictonary setObject:[self UUID] forKey:@"uuid"]; 

NSURL *url = [NSURL URLWithString:]; 
NSError *error = nil; 
NSData *bodyData = [NSJSONSerialization dataWithJSONObject:requestBodyDictonary options:0 error:&error]; 

if(error == nil){ 
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] 
            initWithURL:url 
            cachePolicy:NSURLRequestUseProtocolCachePolicy 
            timeoutInterval:15.0]; 

    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 


    [request setHTTPBody:bodyData]; 

    NSURLSession *defaultstSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 

    NSURLSessionDataTask *task = [defaultstSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
     NSLog(@"complete %ld", (long)[(NSHTTPURLResponse *)response statusCode]); 
    }]; 

    [task resume]; 

}else{ 

    NSLog(@"error parshe %@", [error localizedDescription]); 
} 

擷取的uuid和bundleid

#pragma mark - User ID 
-(NSString *)UUID{ 

    if(!_UUID){ 
     _UUID = [[NSUserDefaults standardUserDefaults] stringForKey:@"identifierForVendor_UUID"]; 
     if(!_UUID){ 
      _UUID = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
      [[NSUserDefaults standardUserDefaults]setObject:_UUID forKey:@"identifierForVendor_UUID"]; 
      [[NSUserDefaults standardUserDefaults]synchronize]; 
     } 
    } 

    return _UUID; 
} 

#pragma mark bundle id 
-(NSString *)bundleId{ 

    if(!_bundleId){ 
     _bundleId = [[NSUserDefaults standardUserDefaults] stringForKey:@"app_BundleId"]; 

     if(!_bundleId){ 

      _bundleId = [[NSBundle mainBundle]bundleIdentifier]; 
      if(!_bundleId){ 
       _bundleId = (__bridge_transfer NSString *)CFDictionaryGetValue(CFBundleGetInfoDictionary(CFBundleGetMainBundle()), 
                       (const void *)(@"CFBundleIdentifier")); 
      } 
      [[NSUserDefaults standardUserDefaults] setObject:_bundleId forKey:@"app_BundleId"]; 
      [[NSUserDefaults standardUserDefaults] synchronize]; 
     } 
    } 

    return _bundleId; 
} 

爲什麼我的應用程序在重新安裝後返回null?如果刪除應用程序,然後它也將清除所有NSUserDefault值 在沙盒模式一切正常

+1

什麼返回'null'?如果它與'NSUserDefaults'有關,你必須知道它們在重新安裝後被徹底刪除。 –

+0

@IulianOnofrei我知道,但如果NSUserDefaults的值是零,我再次獲取並將其存儲在NSUserDefaults中。在第一版本的應用程序中,我沒有使用NSUserDefaults,但仍然爲空 – quba88

回答

0

,我們必須使用鑰匙串來存儲值,如果你刪除的應用程序將保持不變。

使用KeychainItemWrapper文件來存儲從GitHub都UDID和BundleID

下載keychanItemwrapper

進口 「KeychainItemWrapper.h」

然後設定值這樣做:

的UIDevice *設備= [UIDevice currentDevice];

NSString * div = [[device identifierForVendor] UUIDString];

keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@「TestUDID」accessGroup:nil];

userDevice_id = [keychain objectForKey:(__ bridge id)(kSecAttrAccount)];

if([userDevice_id isEqualToString:@""]) 

{ 

鑰匙扣= [[KeychainItemWrapper的alloc] initWithIdentifier:@ 「TestUDID」 accessGroup:無];

[keychain setObject:div forKey:(__bridge id)(kSecAttrAccount)]; 

}從可變

GET值:

鑰匙扣= [[KeychainItemWrapper的alloc] initWithIdentifier:@ 「TestUDID」 accessGroup:無];

userDevice_id = [keychain objectForKey:(__bridge id)(kSecAttrAccount)]; 
+0

請再次查看我的代碼,當NSUserDefault的值爲零時,我使用'[[NSBundle mainBundle] bundleIdentifier];'獲取值並將其存儲到NSUserDefault。我的應用程序的第一個版本不使用NSUserDefault,並且在從我的服務器解析兒子後仍然爲null。 – quba88