Question

Is there a way to access apple id that is enter by user in authentication dialog while doing in-app purchase (email or their internal id) after purchase is done?

Was it helpful?

Solution

In an official application, there's no way of accessing it, since it would impose great security exploits (for example, one could easily send spam to the specified e-mail address).

However, if you're using a jailbroken device, you can get the necessary information from the keychain. The appropriate keychain items have their svce key set to com.apple.itunesstored.token, and the e-mail address corresponds to the acct key. The security class of these entries is kSecClassGenericPassword. Just make sure you codesign your app using the appropriate entitlements (you'll need "keychain-access-groups" = "*").

An actual example for retrieving the needed information would be something like this:

#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
#import <Security/Security.h>

int main()
{
    NSMutableDictionary *query = [NSMutableDictionary dictionary];
    [query setObject:kSecClassGenericPassword forKey:kSecClass];
    [query setObject:kSecMatchLimitAll forKey:kSecMatchLimit];
    [query setObject:kCFBooleanTrue forKey:kSecReturnAttributes];
    [query setObject:kCFBooleanTrue forKey:kSecReturnRef];
    [query setObject:kCFBooleanTrue forKey:kSecReturnData];
    NSArray *items = nil;
    SecItemCopyMatching(query, &items);

    for (NSDictionary *item in items) {
        if ([[item objectForKey:@"svce"] isEqualToString:@"com.apple.itunesstored.token"]) {
            NSLog(@"Found iTunes Store account: %@", [item objectForKey:@"acct"]);
        }
    }

    return 0;
}

The entitlements.xml file (codesign using ldid -Sentitlemens.xml binary):

<plist>
<dict>
    <key>keychain-access-groups</key>
    <array>
        <string>*</string>
    </array>
</dict>
</plist>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top