unable to generate new bundle seed id, is it ok to use the same? - iphone

i just finished my iPad versions (full and lite) of my game Let's Spot It.they use different bundle seed id. (just like different apps)
then i want to work on its iphone versions. but i am not able to find the option for "generate new" bundle seed id.
Bundle Seed ID (App ID Prefix)
Use your Team ID or select an existing Bundle Seed ID for your App ID.
what happened?
I don't use high level techniques like sharing data between 2 of my apps. so can i use the same app id as other apps(which have nothing to do with this app), or can i just use the team bundle seed id? if i use team id, what should i do in my xcode project?

The last time I used my team ID as the bundle seed for a new app ID the website produced a new bundle seed, different from all previous seeds. I think this is just a confusingly labeled option on the website.
You can reuse one bundle seed for multiple apps, even if those apps do not interact. I have seen suggestions to use only one bundle seed for all your apps, just to give yourself the option to link the programs in future versions. You might want to avoid using the same seed if you are writing apps for multiple third parties, just to keep your customers' products distinct.
Whatever bundle seed you use, just enter the Bundle Identifier into the Info.plist, and add the downloaded provisioning profiles by dragging them onto the Xcode icon.

Related

Applications License Types

I have upgraded my license from Community to Individual, the applications created before "individual" upgrade are in "Community License". How to change the already produced application license to individual? I have deleted application and recreate but it does not accept that and gives "This app ID exists. Please select a different ID"?
The application that is published on store, has a bundle id, and you need to use the same bundle id in order to update it.
Therefore, regardless of which licence you have, you should use the same bundle id for your new version too.
But because you have an individual licence, you can use your own splash screen (not the default one).
And also, because you have an individual licence, for your new applications you can use custom bundle id.

Keychain group access to share data between my existing applications

I have many iOS applications live on AppStore. Now for next version of apps, I want to keep a piece of data for every application to share in KeyChain. As far as I know I need to provide same Keychain access group in Apple's KeychainItemWrapper class.
*keychain = [[KeychainItemWrapper alloc] initWithIdentifier:#"Any string" accessGroup:<string representing access group>];
I know about custom URLs and it is of no use as I want data to be persistent.
All my applications have different bundle seed ID as I can see from provisioning portal. I know that the main pre-requisite for shared keychain access is that all of the applications have a common bundle seed ID.
Now my question is how do I make sure that in this senario I can use Keychain to share data among all these applications ?
Is it possible to change the bundle seed ID of all applications through Provisioning profile portal without doing any harm to any functionality ( Although I want to avoid that as there are so many apps).
Is there a way I can add bundle seed ID of all apps in a file and build all apps with that file in project to achieve this ? I know about "keychain-access-groups", do i need to create a plist file and add bundle seed ID of all application in it ?
Appreciate any help in this regard.
If you have different bundle seed IDs (the ten alphanumeric characters preceding the bundle identifier, the Xs in XXXXXXXXXX.com.company.application), you can't share an access group. It's a restriction on Apple's part and circumventing it is not allowed. I suggest you find another solution of safely sharing data (possibly outside of the device, on a server, but not iCloud as it has the same restrictions).
General information about keychain access groups:
Since iPhone OS 3.0 it has been possible to share data between a family of applications. This can provide a better user experience if you follow the common path of free/premium applications or if you have a set of related applications that need to share some common account settings.
The main pre-requisite for shared keychain access is that all of the applications have a common bundle seed ID. To be clear what this means remember that an App ID consists of two parts:
<Bundle Seed ID> . <Bundle Identifier>
The bundle seed ID is a unique (within the App Store) ten character string that is generated by Apple when you first create an App ID. The bundle identifier is generally set to be a reverse domain name string identifying your app (e.g. com.yourcompany.appName) and is what you specify in the application Info.plist file in Xcode.
So when you want to create an app that can share keychain access with an existing app you need to make sure that you use the bundle seed ID of the existing app. You do this when you create the new App ID in the iPhone Provisioning Portal. Instead of generating a new value you select the existing value from the list of all your previous bundle seed IDs.
One caveat, whilst you can create a provisioning profile with a wildcard for the bundle identifier I have never been able to get shared keychain access working between apps using it. It works fine with fully specified (no wildcard) identifiers. Since a number of other Apple services such as push notifications and in-app purchase also have this restriction maybe it should not be a surprise but I am yet to find this documented for keychain access.
Once you have your provisioning profiles setup with a common bundle seed ID the rest is pretty easy. The first thing you need to do is register the keychain access group you want to use. The keychain access group can be named pretty much anything you want as long as it starts with the bundle seed ID. So for example if I have two applications as follows:
ABC1234DEF.com.useyourloaf.amazingApp1
ABC1234DEF.com.useyourloaf.amazingApp2
I could define a common keychain access group as follows:
ABC1234DEF.amazingAppFamily
To enable the application to access this group you need to add an entitlements plist file to the project using xCode. Use Add -> New File and select the Entitlements template from the iPhone OS Code Signing section. You can name the file anything you like (e.g. KeychainAccessGroups.plist). In the file add a new array item named keychain-access-groups and create an item in the array with the value of our chosen keychain access group:
Note: Do not change the get-task-allow item that is created by default in the entitlements file unless you are creating an Ad-Hoc distribution of your app (in which case you should uncheck this option).
This same process should be repeated for all apps that share the bundle seed ID to enable them to access the keychain group. To actually store and retrieve values from this group requires adding an additional value to the dictionary passed as an argument to the keychain services. Using the example from the previous post on simple iPhone keychain access the search dictionary gets the following additional item:
[searchDictionary setObject: #"ABC1234DEF.amazingAppFamily" forKey: (id)kSecAttrAccessGroup];
One final comment, using a shared keychain access group does not stop you from storing values in an applications private keychain as well. The Apple GenericKeychain example application builds two applications which both store data in a private and group keychain.
Source: Use Your Loaf
Now you can use UIPasteboard
//First app, install->run->close->delete
UIPasteboard* board = [UIPasteboard pasteboardWithName:#"com.company.wtv" create:YES];
board.persistent=YES;// persistent to make what you write persist after your app closes, or gets deleted.
[board setValue:#"ccccc" forPasteboardType:#"com.company.wtv.sharedValue"];
//Second app, installed after first one is deleted and ran this one... While bundle identifier and bundle seed different (i tried it on adhoc, not really releasing the app, but i htink the same)
NSData* result=nil;
NSString*resultStr=nil;
result =[board valueForPasteboardType:#"com.company.wtv.sharedValue"];
resultStr=[[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];// I got resultStr containing ccccc
check UIPasteboard documentation for further info.
I'll be coming back after using this for my store apps, in case of troubles
You can't change your app's bundle ID after it has been put into the AppStore. You also can't make an app read the info from the keychain that was put there by another app (with a different bundle ID). The solution: you'll need an entitlement with which you can access practically all the data.

Manage iOS Enterprise Developer Program

We recently enrolled in the iOS Enterprise Developer Program to be able to use in-house distribution, which significantly simplifies the deployment of the apps inside our company which is fairly big. Before joining we have thoroughly read the program documentation and we were aware that the new account would live completely separated from the standard account we use for the AppStore submissions.
What I'm unsure about is now what would be the best way to organize the two accounts in the developer portals. I'm mostly concerned with the bundle identifier since I'll be dealing with two different bundle ids inside Xcode for each application. All of our apps use iCloud and Push notifications so wildcard is not an option.
How do you organize this inside Xcode? Do you create two different targets or are you able to manage this with a new Project Configuration? What about iCloud entitlements?
EDIT
Just as an update I wanted to make clear that we're looking for the best solution to build an app for both In-House distribution and for AppStore submission.
EDIT2
Given that the enterprise program does not grant you access to iTunesConnect, where test users and product ids can be setup, is there really no way to test InApp purchases?
I'm not entirely clear on what you need, but it sounds like you want to be able to build your app store apps for internal enterprise use. Is that correct?
If you want to be able to build your app with two different bundle IDs you can create a custom build setting, and give it different values for your different configurations.
So for example, you could create your Enterprise configuration:
Then go to your target's build settings and add a user-defined build setting:
Give it a name like BUNDLE_ID, and if you expand the triangle you can give it different values for each configuration:
Next, open your Info.plist file and enter ${BUNDLE_ID} for the bundle id value:
When you compile using the "Enterprise" configuration, which you can do using a custom scheme (or via the command line build process if that's what you use), the appropriate bundle id will be used.
You can also configure the code signing/provisiong profile setting in the same way:
Once you do this, the correct push notification/iCloud entitlements will be used depending on the configuration.
We've been doing this kind of thing for a long time now. Our build server will generate enterprise and app store versions of our apps for each build, using exactly this technique.
When it comes to the provisioning portal, you will need to configure both app IDs separately for push notifications, iCloud, etc.
This does mean that push notifications must be sent separately to the app store and enterprise versions since they will not share the same bundle ID or push notification certificate.
The iCloud storage by default will be totally separate for the two versions. They may be able to access the same iCloud store (if you need this) as long as the entitlements are set up with the same team ID. But this may be a problem if you have two separate developer accounts.

Building and testing multiple apps - trying to understand appID's and profiles

I'm trying to understand app ID's and provisioning profiles here, I'm quite lost.
I am a registered Apple Developer as an individual under my full name, and I have 2 applications currently in the works, and 2 device UDID's ready for testing.
I'd like to be able to build IPA's for these two apps, upload them to TestFlight, and use them on either of the UDIDs I have on me.
I have several questions (if I should ask separate questions, I'd be happy to unless someone happens to be willing to answer them, I'd appreciate it):
1) Because I have 2 (or more in the future) applications, do I need a wildcard app ID?
2) If I have the app ID ET9WC78H9Q.com.mydevname.* listed in the portal - WHAT is the actual appID - ET9WC78H9Q.com.mydevname.*, ET9WC78H9Q.com.mydevname, or *?
3) Why can't you delete an AppID in the portal?
4) I've read that this must match the name Bundle Identifier. Currently it sits at ${PRODUCT_NAME:rfc1034identifier}. What specifically needs to go here to 'match'?
5) Do I need to create separate distribution profiles for each app, or can I tell each new app to use the wildcard identifier?
6) How do I tie a specific target to a specific provisioning profile in XCode 4? (TestFlight suggests to use the distribution profile)
Thank you,
You have to either have a wildcard app id, or 2 separate (specific, non-wildcard) app ids, one each.
That is a wildcard app id, so the app id is *
No idea.
Your PRODUCT_ NAME, which you specify in the Packaging section of the Build Settings screen.
A single distribution profile will work with multiple apps if the app ID for that profile is a wild-card app id. If they are specific app IDs, yes, you need a profile for each app.
You specify the provisioning profile in the Code Signing section of Settings, under CODE_SIGN_IDENTITY.
Because I have 2 (or more in the future) applications, do I need a wildcard app ID?
You don't. In fact, I recommend against it, since it's probably only going to give you problems with the App Store in the future.
If I have the app ID ET9WC78H9Q.com.mydevname.* listed in the portal - WHAT is the actual appID - ET9WC78H9Q.com.mydevname.*, ET9WC78H9Q.com.mydevname, or *?
That depends on the application. The first part is the Keychain space, which determines which applications can access the things you put in the Keychain. Then comes the actual application identifier, which is generally company.projectname. It would probably be ET9WC78H9Q.com.mydevname.myapplication in your case.
Why can't you delete an AppID in the portal?
On Mac and iOS, the AppID is very important for applications like the App Store. They have to be unique, since having two of them could mean that applications get installed in the wrong place. This means that even if you could remove them you couldn't ever add them again, which means there's no point in deleting them.
I've read that this must match the name Bundle Identifier. Currently it sits at ${PRODUCT_NAME:rfc1034identifier}. What specifically needs to go here to 'match'?
Wouldn't worry too much about that - simply look at the target summary page (click the solution then click the target and finally go to the summary tab) and it'll tell you the name it automatically picked for you.
Do I need to create separate distribution profiles for each app, or can I tell each new app to use the wildcard identifier?
You can definitely use the wildcard identifier, but the App Store will not necessarily like that.
How do I tie a specific target to a specific provisioning profile in XCode 4? (TestFlight suggests to use the distribution profile)
Wouldn't worry too much about that. If you got the code signing set up correctly (look at the build settings, then pick the development and deployment certificates) then you have nothing to worry about.
Can't say much more in here since most App Store things are guarded by an NDA. Consider asking this on https://devforums.apple.com instead.

Change Bundle Seed ID, same Bundle ID for upgrade

I asked a similar question earlier (https://stackoverflow.com/questions/4553741/clashing-app-id-that-needs-removing), but perhaps I can ask a different way:
Am I able to update an existing application in the App Store by changing the bundle Seed ID, but keeping the bundle ID the same?
ie, going from:
DFG5TY7E3.com.domain.appName
To:
HGERF562D.com.domain.appName
Does this cause any problems? I know that if I change the bundle ID (com.domain.appName) it will not upgrade, but not sure on the bundle seed id (DFG5TY7E3). See the link above for a full explanation as to why I need to do this...
So I have spoken to Apple today via the phone. They have suggested the following:
I can use a new Bundle Seed ID as long as I am not using the device Keychain in my app (whatever that is?)
The quote this article:
Note: If you are using the device
Keychain in your application, be sure
to select the same Bundle Seed ID that
you used for your other applications
from the Bundle Seed ID pop-up menu.
From: http://developer.apple.com/library/ios/#qa/qa2009/qa1680.html
From that they summised that it is not necessary for me to use the same bundle seed ID. I will test this and let you know before I mark this as answered.
You can't do this. The seed is actually part of the bundle ID. DFG5TY7E3.com.domain.appName is a totally different bundle than HGERF562D.com.domain.appName.
So, can I change the bundle seed id for an App Store app?