1

iOS 用のアプリでコードを1回だけ実行する方法 (アプリケーションが削除されて再インストールされる場合でも)?

たとえば、すべての新規ユーザーにギフトを贈る必要があります。ただし、使用した場合は、アプリ内購入を使用して再度購入する必要があります。

4

2 に答える 2

3

キーチェーンにフラグを保存できます。これは、アプリが削除された後もデバイス上で持続します。同じアカウントの複数のデバイスを制御するために使用できるiCloudKey-Value設定を使用することもできます。

これは、キーチェーンに情報(この場合はユーザーが何かを購入したかどうか)を追加して元に戻す例です。

    static NSString *kIAPKeyChainDescription =  @"MyAppPurchaseKey";

    static NSString *kPurchaseTag = @"YES";
    + (void)recordTransaction:(NSString *)productId
    {

        NSMutableDictionary* dict = [NSMutableDictionary dictionary];
        NSData *tag = [kPurchaseTag dataUsingEncoding:NSUTF8StringEncoding];

        [dict setObject: (id) kSecClassGenericPassword  forKey: (id) kSecClass];
        [dict setObject: kIAPKeyChainDescription forKey:(id) kSecAttrDescription];
        [dict setObject: productId      forKey: (id) kSecAttrService];
        [dict setObject: tag  forKey: (id) kSecValueData];


        OSStatus result = SecItemAdd ((CFDictionaryRef) dict, NULL);

        if (result != 0)
        NSLog(@"SecItemAdd error code is %ld",result);
    }


    + (BOOL)isPurchased:(NSString *)productId
    {
        NSMutableDictionary* query = [NSMutableDictionary dictionary];

        [query setObject: (id) kSecClassGenericPassword forKey: (id) kSecClass];
        [query setObject: productId forKey: (id) kSecAttrService];
        [query setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];

        NSData* upgradeItemData = nil;
        OSStatus result = SecItemCopyMatching ( (CFDictionaryRef) query, (CFTypeRef*) &upgradeItemData );

        if (result != errSecSuccess && result != errSecItemNotFound){
            NSLog(@"SecItemCopyMatching errcode is %ld",result);
            return NO;
        }

        if ( !upgradeItemData || result == errSecItemNotFound)
        {
            return NO;
        }
        else
        {
            NSString* s = [[[NSString alloc] 
                            initWithData: upgradeItemData 
                    encoding: NSUTF8StringEncoding] autorelease];

            [upgradeItemData release];

            return [s boolValue];
        }
    }
于 2013-02-22T14:59:22.143 に答える
0

そのためのWebサービスを作成する必要があります。他の方法は考えられません。デバイス トークンを保存します。

于 2013-02-22T14:57:10.960 に答える