小编Seo*_*ras的帖子

Base64编码古怪的iOS7应用程序内购买收据服务器验证

我发现iOS7收据的base64编码有一些非常奇怪的问题.

目前(Xcode5/iOS7)有两种获取应用内购买收据的方法:

  1. 不推荐使用的返回单个收据的方法. [SKPaymentTransaction transactionReceipt]
  2. 一捆来自位置的所有收据 appStoreReceiptURL

我的应用程序使用信用系统销售基于网站的服务,该系统使服务器收据验证成为必要.该应用程序还出售可下载的扩展.所以消耗品和非消耗品的混合物.非消耗品是从Apple下载的,因此无需验证.消耗品是用于在网站上购买服务的信用包.

当iOS7和XCode5推出时,我更新了我的应用程序,但在appStoreReceiptURL的新捆绑收据上遇到了困难.使用新样式,所有收据捆绑在一起,我的服务器从Apple的verifyReceipt沙箱中找回了这个错误

[status] => 21002
[exception] => java.lang.IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)

在看过stackoverflow上的帖子后,我放弃了说其他人遇到了同样的问题,当时的意见是苹果公司的一个错误,或者尚未添加功能.但是我一直在看到使用旧的弃用方法的问题,这迫使我重新尝试.在经过大量的调试和搜索之后,我终于解决了一些出错的问题 - 以及让它工作但是以一种非常丑陋的方式,我对自己的生活没有信心.

我原以为NSData(普通字节缓冲区)编码输出不会有太大差别.这是我看到的奇怪部分.

原始弃用的单个收据可以是base64编码为64个字符行,末尾为\ r \n或者没有.Apple验证服务器不关心.无论哪种方式都很开心.

对于新的收据包,除非做了两件事,否则它将无法工作.首先,base64编码不能有换行符.我注意到Apple已将自己的base64编码器添加到iOS7中.这就是我用来获取适用于两种收据类型的编码输出.

NSString *receiptDataString = [transactionReceipt base64EncodedStringWithOptions:0];
Run Code Online (Sandbox Code Playgroud)

需要做的第二件事是搜索并替换服务器上收到的编码收据包中的所有空格字符.即

$receiptdata = str_replace(' ', '+', $receiptdata);
Run Code Online (Sandbox Code Playgroud)

我碰巧注意到这是我的服务器收到的收据之间的差异.为什么我不知道?我正在使用AFNetworking-1.3.2的JSONRequestOperationWithRequest

    NSMutableArray *pairs = [[NSMutableArray alloc] initWithCapacity:0];
    for (NSString *key in parameters) {
        [pairs addObject:[NSString stringWithFormat:@"%@=%@", key, [parameters objectForKey:key]]];
    }
    postData = [[pairs componentsJoinedByString:@"&"] dataUsingEncoding:NSUTF8StringEncoding];
    request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://myserver.com/index.php"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:[NSString stringWithFormat:@"%d", postData.length] forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];
    operation = …
Run Code Online (Sandbox Code Playgroud)

base64 objective-c in-app-purchase ios7

8
推荐指数
1
解决办法
3357
查看次数

自动轻量级迁移适用于本地存储,但iCloud存储"丢失"所有旧数据

我用这个撕掉了我的头发.我在iTunes上有一个应用程序,我在去年年底(2013年10月)在iOS7.0上添加了iCloud支持本周我决定为App编写一个新功能,需要xcdatamodel中的新实体.一个非常简单的改变/添加.应该对当前数据集没有影响.我创建了一个新的v2 xcdatamodel并将其设置为Current Model版本,编译并运行,如果我在iPad上关闭iCloud,它可以正常工作.我看到以前保存的数据.在iCloud开启的情况下再次运行它,我得到一张没有数据的空白表.没有错误消息,没有.希望有人可以对我在这里犯错的事情有所了解:

 - (NSManagedObjectModel *)managedObjectModel {
    if (__managedObjectModel != nil) {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"UserData" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return __managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    NSError *error = nil;
    BOOL success = NO;

    if((__persistentStoreCoordinator != nil)) {
        return __persistentStoreCoordinator;
    }

    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
    NSPersistentStoreCoordinator *psc = __persistentStoreCoordinator;

    NSString *iCloudEnabledAppID = @"C3FUPX46ZG~com~software~App";
    NSString *dataFileName = @"UserData.sqlite";
    NSString *iCloudDataDirectoryName = @"CoreData.nosync";
    NSString *iCloudLogsDirectoryName = @"CoreDataLogs";
    NSFileManager *fileManager = [NSFileManager …
Run Code Online (Sandbox Code Playgroud)

core-data core-data-migration icloud ios7

7
推荐指数
0
解决办法
166
查看次数