gpt4 book ai didi

ios - 如何将 iOS appStoreReceiptURL 转换为 Base 64 编码字符串?

转载 作者:技术小花猫 更新时间:2023-10-29 10:19:26 27 4
gpt4 key购买 nike

我想使用 appStoreReceiptURL 查看某人购买了哪个版本的应用程序。我怎样才能把它变成一个字符串?

我正在通过从商店下载该应用程序,然后从 Xcode 运行该应用程序的新版本来对此进行测试。这是我尝试过的:

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

最佳答案

我发现诀窍是将收据作为数据读取,然后根据数据对它进行 base 64 编码。如果它可以帮助其他人,这就是对我有用的东西。还要感谢这个用于 base 64 编码的线程:Converting NSData to 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];
}

关于ios - 如何将 iOS appStoreReceiptURL 转换为 Base 64 编码字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18924411/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com