@Override public void serializeInto(XcodeprojSerializer s) { super.serializeInto(s); s.addField("mainGroup", mainGroup); Collections.sort( targets, Ordering.natural() .onResultOf( new Function<PBXTarget, String>() { @Override public String apply(PBXTarget input) { return input.getName(); } })); s.addField("targets", targets); s.addField("buildConfigurationList", buildConfigurationList); s.addField("compatibilityVersion", compatibilityVersion); NSDictionary d = new NSDictionary(); d.put("LastUpgradeCheck", "0600"); s.addField("attributes", d); }
/** * Returns a map containing entries that should be added to the merged plist. These are usually * generated by Xcode automatically during the build process. */ private NSDictionary automaticEntries() { List<Integer> uiDeviceFamily = TargetDeviceFamily.UI_DEVICE_FAMILY_VALUES.get(bundleSupport.targetDeviceFamilies()); AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); Platform platform = appleConfiguration.getBundlingPlatform(); ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext); NSDictionary result = new NSDictionary(); if (uiDeviceFamily != null) { result.put("UIDeviceFamily", NSObject.wrap(uiDeviceFamily.toArray())); } result.put("DTPlatformName", NSObject.wrap(platform.getLowerCaseNameInPlist())); result.put( "DTSDKName", NSObject.wrap(platform.getLowerCaseNameInPlist() + appleConfiguration.getIosSdkVersion())); result.put("CFBundleSupportedPlatforms", new NSArray(NSObject.wrap(platform.getNameInPlist()))); result.put("MinimumOSVersion", NSObject.wrap(objcConfiguration.getMinimumOs().toString())); return result; }
@Override public int execute(ExecutionContext context) throws InterruptedException { final String bundleID; try { bundleID = AppleInfoPlistParsing.getBundleIdFromPlistStream( filesystem.getInputStreamForRelativePath(infoPlist)) .get(); } catch (IOException e) { throw new HumanReadableException("Unable to get bundle ID from info.plist: " + infoPlist); } final Optional<ImmutableMap<String, NSObject>> entitlements; final String prefix; if (entitlementsPlist.isPresent()) { try { NSDictionary entitlementsPlistDict = (NSDictionary) PropertyListParser.parse(entitlementsPlist.get().toFile()); entitlements = Optional.of(ImmutableMap.copyOf(entitlementsPlistDict.getHashMap())); prefix = ProvisioningProfileMetadata.prefixFromEntitlements(entitlements.get()); } catch (IOException e) { throw new HumanReadableException( "Unable to find entitlement .plist: " + entitlementsPlist.get()); } catch (Exception e) { throw new HumanReadableException( "Malformed entitlement .plist: " + entitlementsPlist.get()); } } else { entitlements = ProvisioningProfileStore.MATCH_ANY_ENTITLEMENT; prefix = "*"; } Optional<ProvisioningProfileMetadata> bestProfile = provisioningProfileUUID.isPresent() ? provisioningProfileStore.getProvisioningProfileByUUID(provisioningProfileUUID.get()) : provisioningProfileStore.getBestProvisioningProfile(bundleID, entitlements); if (!bestProfile.isPresent()) { throw new HumanReadableException( "No valid non-expired provisioning profiles match for " + prefix + "." + bundleID); } selectedProvisioningProfileFuture.set(bestProfile.get()); Path provisioningProfileSource = bestProfile.get().getProfilePath(); // Copy the actual .mobileprovision. try { filesystem.copy( provisioningProfileSource, provisioningProfileDestination, CopySourceMode.FILE); } catch (IOException e) { context.logError(e, "Failed when trying to copy: %s", getDescription(context)); return 1; } // Merge tne entitlements with the profile, and write out. if (entitlementsPlist.isPresent()) { return (new PlistProcessStep( filesystem, entitlementsPlist.get(), signingEntitlementsTempPath, bestProfile.get().getEntitlements(), ImmutableMap.<String, NSObject>of(), PlistProcessStep.OutputFormat.XML)) .execute(context); } else { // No entitlements.plist explicitly specified; write out the minimal entitlements needed. String appID = bestProfile.get().getAppID().getFirst() + "." + bundleID; NSDictionary entitlementsPlist = new NSDictionary(); entitlementsPlist.putAll(bestProfile.get().getEntitlements()); entitlementsPlist.put(APPLICATION_IDENTIFIER, appID); entitlementsPlist.put(KEYCHAIN_ACCESS_GROUPS, new String[] {appID}); return (new WriteFileStep( filesystem, entitlementsPlist.toXMLPropertyList(), signingEntitlementsTempPath, /* executable */ false)) .execute(context); } }
@Override public int execute(ExecutionContext context) throws InterruptedException { final String bundleID; try { bundleID = AppleInfoPlistParsing.getBundleIdFromPlistStream( context.getProjectFilesystem().getInputStreamForRelativePath(infoPlist)) .get(); } catch (IOException e) { throw new HumanReadableException("Unable to get bundle ID from info.plist: " + infoPlist); } // What to look for in the provisioning profile. final Optional<String> prefix; // e.g. ABCDE12345 if (entitlementsPlist.isPresent()) { NSDictionary entitlementsPlistDict; try { entitlementsPlistDict = (NSDictionary) PropertyListParser.parse(entitlementsPlist.get().toFile()); } catch (Exception e) { throw new HumanReadableException( "Malformed entitlement .plist: " + entitlementsPlist.get()); } try { String appID = ((NSArray) entitlementsPlistDict.get("keychain-access-groups")) .objectAtIndex(0) .toString(); prefix = Optional.<String>of(ProvisioningProfileMetadata.splitAppID(appID).getFirst()); } catch (Exception e) { throw new HumanReadableException( "Malformed entitlement .plist (missing keychain-access-groups): " + entitlementsPlist.get()); } } else { prefix = Optional.<String>absent(); } Optional<ProvisioningProfileMetadata> bestProfile = getBestProvisioningProfile(profiles, bundleID, provisioningProfileUUID, prefix); if (!bestProfile.isPresent()) { throw new HumanReadableException( "No valid non-expired provisioning profiles match for " + prefix + "." + bundleID); } Path provisioningProfileSource = bestProfile.get().getProfilePath().get(); // Copy the actual .mobileprovision. try { context .getProjectFilesystem() .copy(provisioningProfileSource, provisioningProfileDestination, CopySourceMode.FILE); } catch (IOException e) { context.logError(e, "Failed when trying to copy: %s", getDescription(context)); return 1; } // Merge tne entitlements with the profile, and write out. if (entitlementsPlist.isPresent()) { return (new PlistProcessStep( entitlementsPlist.get(), signingEntitlementsTempPath, bestProfile.get().getEntitlements(), ImmutableMap.<String, NSObject>of(), PlistProcessStep.OutputFormat.XML)) .execute(context); } else { // No entitlements.plist explicitly specified; write out the minimal entitlements needed. String appID = bestProfile.get().getAppID().getFirst() + "." + bundleID; NSDictionary entitlements = new NSDictionary(); entitlements.putAll(bestProfile.get().getEntitlements()); entitlements.put(APPLICATION_IDENTIFIER, appID); entitlements.put(KEYCHAIN_ACCESS_GROUPS, new String[] {appID}); return (new WriteFileStep( filesystem, entitlements.toXMLPropertyList(), signingEntitlementsTempPath, /* executable */ false)) .execute(context); } }