如何将iOS appStoreReceiptURL放入Base 64编码string?

我想使用appStoreReceiptURL来查看某人购买了哪个版本的应用程序。 我怎样才能得到这个string?

我通过从商店下载应用程序,然后从Xcode运行新版本的应用程序来testing。 这是我试过的:

NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL]; NSLog(@"receiptUrl %@",[receiptUrl path]); if ([[NSFileManager defaultManager] fileExistsAtPath:[receiptUrl path]]) { NSLog(@"exists"); NSError *error; NSString *receiptString = [[NSString alloc] initWithContentsOfFile:[receiptUrl path] encoding:NSUTF8StringEncoding error:&error]; if (receiptString == nil) { NSLog(@"Error: %@", [error localizedDescription]); } else { NSLog(@"Receipt: %@",receiptString); } } else { NSLog(@"does not exist"); } 

这是我得到的:

 receiptUrl /var/mobile/Applications/E612F261-2D30-416E-BF82-F24xxxx8860/StoreKit/receipt exists Error: The operation couldn't be completed. (Cocoa error 261.) 

我想到的诀窍是读取收据作为数据,然后基地64从数据编码。 如果这对别人有帮助,那么这对我有用。 还要感谢这个基于64位编码的线程: 将NSData转换为base64

 // this returns an NSDictionary of the app's store receipt, status=0 for good, -1 for bad - (NSDictionary *) getStoreReceipt:(BOOL)sandbox { NSArray *objects; NSArray *keys; NSDictionary *dictionary; BOOL gotreceipt = false; @try { NSURL *receiptUrl = [[NSBundle mainBundle] appStoreReceiptURL]; if ([[NSFileManager defaultManager] fileExistsAtPath:[receiptUrl path]]) { NSData *receiptData = [NSData dataWithContentsOfURL:receiptUrl]; NSString *receiptString = [self base64forData:receiptData]; if (receiptString != nil) { objects = [[NSArray alloc] initWithObjects:receiptString, nil]; keys = [[NSArray alloc] initWithObjects:@"receipt-data", nil]; dictionary = [[NSDictionary alloc] initWithObjects:objects forKeys:keys]; NSString *postData = [self getJsonStringFromDictionary:dictionary]; NSString *urlSting = @"https://buy.itunes.apple.com/verifyReceipt"; if (sandbox) urlSting = @"https://sandbox.itunes.apple.com/verifyReceipt"; dictionary = [self getJsonDictionaryWithPostFromUrlString:urlSting andDataString:postData]; if ([dictionary objectForKey:@"status"] != nil) { if ([[dictionary objectForKey:@"status"] intValue] == 0) { gotreceipt = true; } } } } } @catch (NSException * e) { gotreceipt = false; } if (!gotreceipt) { objects = [[NSArray alloc] initWithObjects:@"-1", nil]; keys = [[NSArray alloc] initWithObjects:@"status", nil]; dictionary = [[NSDictionary alloc] initWithObjects:objects forKeys:keys]; } return dictionary; } - (NSDictionary *) getJsonDictionaryWithPostFromUrlString:(NSString *)urlString andDataString:(NSString *)dataString { NSString *jsonString = [self getStringWithPostFromUrlString:urlString andDataString:dataString]; NSLog(@"%@", jsonString); // see what the response looks like return [self getDictionaryFromJsonString:jsonString]; } - (NSDictionary *) getDictionaryFromJsonString:(NSString *)jsonstring { NSError *jsonError; NSDictionary *dictionary = (NSDictionary *) [NSJSONSerialization JSONObjectWithData:[jsonstring dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&jsonError]; if (jsonError) { dictionary = [[NSDictionary alloc] init]; } return dictionary; } - (NSString *) getStringWithPostFromUrlString:(NSString *)urlString andDataString:(NSString *)dataString { NSString *s = @""; @try { NSData *postdata = [dataString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; NSString *postlength = [NSString stringWithFormat:@"%d", [postdata length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setURL:[NSURL URLWithString:urlString]]; [request setTimeoutInterval:60]; [request setHTTPMethod:@"POST"]; [request setValue:postlength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; [request setHTTPBody:postdata]; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; if (data != nil) { s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } } @catch (NSException *exception) { s = @""; } return s; } // from https://stackoverflow.com/questions/2197362/converting-nsdata-to-base64 - (NSString*)base64forData:(NSData*)theData { const uint8_t* input = (const uint8_t*)[theData bytes]; NSInteger length = [theData length]; static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; NSMutableData* data = [NSMutableData dataWithLength:((length + 2) / 3) * 4]; uint8_t* output = (uint8_t*)data.mutableBytes; NSInteger i; for (i=0; i < length; i += 3) { NSInteger value = 0; NSInteger j; for (j = i; j < (i + 3); j++) { value <<= 8; if (j < length) { value |= (0xFF & input[j]); } } NSInteger theIndex = (i / 3) * 4; output[theIndex + 0] = table[(value >> 18) & 0x3F]; output[theIndex + 1] = table[(value >> 12) & 0x3F]; output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; } return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; } 

这是我使用的代码:

 NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL]; NSString *encReceipt = [receiptData base64EncodedStringWithOptions:0]; 

我希望这有帮助。

cocoa错误261是NSFileReadInapplicableStringEncodingError 。

而不是尝试读取文件为UTF8,你有没有尝试NSASCIIStringEncoding

 NSString *receiptString = [[NSString alloc] initWithContentsOfFile:[receiptUrl path] encoding:NSASCIIStringEncoding error:&error]; 

此外,鉴于你不确定文件的实际编码,你可以使用下面的代替猜测:

 NSStringEncoding *encoding = nil; NSString *receiptString = [NSString stringWithContentsOfFile:[receiptUrl path] usedEncoding:&encoding error:NULL];