Iphone 如何在iOS应用程序上只运行一次代码(即使应用程序将被删除并重新安装)?

Iphone 如何在iOS应用程序上只运行一次代码(即使应用程序将被删除并重新安装)?,iphone,ios,ipad,Iphone,Ios,Ipad,如何在iOS应用程序上只运行一次代码(即使应用程序将被删除并重新安装) 例如,我们需要为所有新用户制作一份礼物。但是如果你使用它,你必须使用应用程序内购买再次购买。你必须为它制作一个web服务,我不认为还有其他出路。保存设备令牌。您可以在钥匙链中存储标志。即使在删除应用程序后,该功能仍会在设备上持续存在。您还可以使用iCloud键值设置,该设置可用于控制同一帐户上的多个设备 下面是一个向钥匙链添加信息(在本例中,用户是否购买了东西)并将其取回的示例 static NSString *kI

如何在iOS应用程序上只运行一次代码(即使应用程序将被删除并重新安装)


例如,我们需要为所有新用户制作一份礼物。但是如果你使用它,你必须使用应用程序内购买再次购买。

你必须为它制作一个web服务,我不认为还有其他出路。保存设备令牌。

您可以在钥匙链中存储标志。即使在删除应用程序后,该功能仍会在设备上持续存在。您还可以使用iCloud键值设置,该设置可用于控制同一帐户上的多个设备

下面是一个向钥匙链添加信息(在本例中,用户是否购买了东西)并将其取回的示例

    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];
        }
    }

“例如,我们需要为所有新用户制作一份礼物。但是如果您使用它,您应该使用应用内购买再次购买。”-那么您想运行一次或多次吗?AppStore上有免费的应用内购买。但是我们需要在没有用户交互的情况下处理它。在后台点击一个服务并永远保存设备令牌。设计一些忍者算法,以便在每次新安装发生时加快搜索速度。对于较老的用户,使用userdefaultsHow添加和检查密钥链?和+1,我也打算写这篇文章。最简单的解决办法。@amar你是说“万无一失”,对吗?嗯,它不在越狱的设备上,但是没有更好的方法了,阿飞。同意web服务很昂贵,而且经过几天的数据堆积,我有
未定义的架构符号armv7
。解决方案: