1

私は Inappurchase 製品を自動再生可能にする必要があるアプリケーションを作成しています。このために、Apple の文書を読んだ後、自動再生可能な製品のすべてのトランザクションの後、私たちのアプリは購入ごとにトランザクションの領収書を受け取り、必要ですトランザクション領収書アプリがそのトランザクション日付を保存する必要があることを確認した後、Apple サーバーからの領収書を確認します。しかし、製品を購入した後、Apple クラス - 検証コントローラーを介して Apple サーバーからトランザクションの領収書を確認しようとすると、アプリが完了ハンドラーでクラッシュし、完了ハンドラー NIL が表示されます。

私の _completionHandlers は、実行がこれらのメソッドのいずれかに達すると解放されます。この問題を解決するために私を導いてください

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  {
    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    // So we got some receipt data. Now does it all check out?
    BOOL isOk = [self doesTransactionInfoMatchReceipt:responseString];

    VerifyCompletionHandler completionHandler = _completionHandlers[[NSValue valueWithNonretainedObject:connection]];

    NSValue *key = [NSValue valueWithNonretainedObject:connection];

    NSLog(@"%@",_completionHandlers);
    [_completionHandlers removeObjectForKey:key];
    if (isOk)
    {
    //Validation suceeded. Unlock content here.
    NSLog(@"Validation successful");
    completionHandler(TRUE);
    } else {
    NSLog(@"Validation failed");
    completionHandler(FALSE);
    }
    }
4

1 に答える 1

5

私もこの問題に遭遇しました。この方法でこの問題を修正しました

_completionHandlers[[NSValue valueWithNonretainedObject:conn]] = completionHandler;

そしてそれを

[_completionHandlers setObject:[completionHandler copy] forKey:[NSValue valueWithNonretainedObject:conn]];

これらの 2 行を変更するとクラッシュが解決しますが、これらの手順も必ず実行してください。

connectionDidReceivedata メソッドを見つけて、それを次のように置き換えます

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    // So we got some receipt data. Now does it all check out?
    BOOL isOk = [self doesTransactionInfoMatchReceipt:responseString];


    if (_completionHandlers && [_completionHandlers respondsToSelector:@selector(removeObjectForKey:)])
    {
        VerifyCompletionHandler completionHandler = _completionHandlers[[NSValue valueWithNonretainedObject:connection]];
        [_completionHandlers removeObjectForKey:[NSValue valueWithNonretainedObject:connection]];
        if (isOk)
        {
            //Validation suceeded. Unlock content here.
            NSLog(@"Validation successful");
            completionHandler(TRUE);

        } else {
            NSLog(@"Validation failed");
            completionHandler(FALSE);
        }

    }
    //[_completionHandlers removeObjectForKey:[NSValue valueWithNonretainedObject:connection]];
   }
于 2013-11-18T10:10:10.593 に答える