sigh 1.3.1 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9589402f17e4e3c23d0511b977fa7346999dea3f
4
- data.tar.gz: 8980cd98b9bd6e6ab7dd2dd7b73d1dc4ce292a93
3
+ metadata.gz: e49ced620631a80f353f66ce2aaec2eb7623fe89
4
+ data.tar.gz: 44753e2b434bf48330d3222265371d999b527535
5
5
  SHA512:
6
- metadata.gz: b0933b80dfa931ab145d08c9c42229913ccecde99acf6060a3efb458a3b3648d49feb54c74af817640c31d26d8f5fa5f08e2a53df20646801ba7f731f1537deb
7
- data.tar.gz: 4b9e228b65c5edef013145cde661982b30229a1e860f22b72c57fb68de3836e8439c930c73a181c9fd33df42a349e05383b188dc7549f50b4f078236f5a94a81
6
+ metadata.gz: ce2f1fecf07da5caa9b196081bd5a9363b87d6b69c3bd614dd9a8526584b38dfa8b518f6e5ecaf7b33eef2526ebd04ae6a6e07334b348aa702e7d420779b1248
7
+ data.tar.gz: b9a69234e758c2128ca442cc117f5259c6a7cd544bc3d937da5f73ef2ffc134b6f52a4f2e2425e925a2c9fdd5a768579de7127e02a5c52f5f14549173e2c42ec
data/bin/sigh CHANGED
@@ -61,6 +61,7 @@ class SighApplication
61
61
  c.syntax = 'sigh resign'
62
62
  c.description = 'Resigns an existing ipa file with the given provisioning profile'
63
63
  c.option '-i', '--signing_identity STRING', String, 'The signing identity to use. Must match the one defined in the provisioning profile.'
64
+ c.option '-x', '--version_number STRING', String, 'Version number to force binary to use'
64
65
  c.option '-p', '--provisioning_profile PATH', String, '(or BUNDLE_ID=PATH) The path to the provisioning profile which should be used.'\
65
66
  'Can be provided multiple times if the application contains nested applications and app extensions, which need their own provisioning profile.'\
66
67
  'The path may be prefixed with a identifier in order to determine which provisioning profile should be used on which app.',
@@ -51,7 +51,7 @@
51
51
  # 3. fixed bug in packaging if -e flag is used
52
52
  # 4. renamed 'temp' directory and made it a variable so it can be easily modified
53
53
  # 5. various code formatting and logging adjustments
54
- #
54
+ #
55
55
  # new features October 2015
56
56
  # 1. now re-signs nested applications and app extensions, if present, prior to re-signing the application itself
57
57
  # 2. enables the -p option to be used more than once
@@ -63,11 +63,11 @@
63
63
 
64
64
  function checkStatus {
65
65
 
66
- if [ $? -ne 0 ];
67
- then
68
- echo "Encountered an error, aborting!" >&2
69
- exit 1
70
- fi
66
+ if [ $? -ne 0 ];
67
+ then
68
+ echo "Encountered an error, aborting!" >&2
69
+ exit 1
70
+ fi
71
71
  }
72
72
 
73
73
  if [ $# -lt 3 ]; then
@@ -87,6 +87,8 @@ RAW_PROVISIONS=()
87
87
  PROVISIONS_BY_ID=()
88
88
  DEFAULT_PROVISION=""
89
89
  TEMP_DIR="_floatsignTemp"
90
+ # List of plist keys used for reference to and from nested apps and extensions
91
+ NESTED_APP_REFERENCE_KEYS=(":WKCompanionAppBundleIdentifier" ":NSExtension:NSExtensionAttributes:WKAppBundleIdentifier")
90
92
 
91
93
  # options start index
92
94
  OPTIND=3
@@ -134,7 +136,7 @@ done
134
136
  shift $((OPTIND-1))
135
137
 
136
138
  NEW_FILE="$1"
137
- if [ -z "$NEW_FILE" ];
139
+ if [ -z "$NEW_FILE" ];
138
140
  then
139
141
  echo "Output file name required" >&2
140
142
  exit 1
@@ -146,7 +148,7 @@ if [[ "${#RAW_PROVISIONS[*]}" == "0" ]]; then
146
148
  fi
147
149
 
148
150
  # Check for and remove the temporary directory if it already exists
149
- if [ -d "$TEMP_DIR" ];
151
+ if [ -d "$TEMP_DIR" ];
150
152
  then
151
153
  echo "Removing previous temporary directory: '$TEMP_DIR'" >&2
152
154
  rm -Rf "$TEMP_DIR"
@@ -192,73 +194,73 @@ export PATH=$PATH:/usr/libexec
192
194
  # The first one may contain the wildcard character '*', in which case pattern matching will be used unless the third parameter is "STRICT"
193
195
  function does_bundle_id_match {
194
196
 
195
- if [[ "$1" == "$2" ]]; then
196
- return 0
197
- elif [[ "$3" != STRICT && "$1" =~ \* ]]; then
198
- local PATTERN0="${1//\./\\.}" # com.example.* -> com\.example\.*
199
- local PATTERN1="${PATTERN0//\*/.*}" # com\.example\.* -> com\.example\..*
200
- if [[ "$2" =~ ^$PATTERN1$ ]]; then
197
+ if [[ "$1" == "$2" ]]; then
201
198
  return 0
199
+ elif [[ "$3" != STRICT && "$1" =~ \* ]]; then
200
+ local PATTERN0="${1//\./\\.}" # com.example.* -> com\.example\.*
201
+ local PATTERN1="${PATTERN0//\*/.*}" # com\.example\.* -> com\.example\..*
202
+ if [[ "$2" =~ ^$PATTERN1$ ]]; then
203
+ return 0
204
+ fi
202
205
  fi
203
- fi
204
206
 
205
- return 1
207
+ return 1
206
208
  }
207
209
 
208
210
  # Find the provisioning profile for a given bundle identifier
209
211
  function provision_for_bundle_id {
210
212
 
211
- for ARG in "${PROVISIONS_BY_ID[@]}"; do
212
- if does_bundle_id_match "${ARG%%=*}" "$1" "$2"; then
213
- echo "${ARG#*=}"
214
- break
215
- fi
216
- done
213
+ for ARG in "${PROVISIONS_BY_ID[@]}"; do
214
+ if does_bundle_id_match "${ARG%%=*}" "$1" "$2"; then
215
+ echo "${ARG#*=}"
216
+ break
217
+ fi
218
+ done
217
219
  }
218
220
 
219
221
  # Find the bundle identifier contained inside a provisioning profile
220
222
  function bundle_id_for_provison {
221
223
 
222
- local FULL_BUNDLE_ID=`PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin <<< $(security cms -D -i "$1")`
223
- checkStatus
224
- echo "${FULL_BUNDLE_ID#*.}"
224
+ local FULL_BUNDLE_ID=`PlistBuddy -c 'Print :Entitlements:application-identifier' /dev/stdin <<< $(security cms -D -i "$1")`
225
+ checkStatus
226
+ echo "${FULL_BUNDLE_ID#*.}"
225
227
  }
226
228
 
227
229
  # Add given provisioning profile and bundle identifier to the search list
228
230
  function add_provision_for_bundle_id {
229
231
 
230
- local PROVISION="$1"
231
- local BUNDLE_ID="$2"
232
+ local PROVISION="$1"
233
+ local BUNDLE_ID="$2"
232
234
 
233
- local CURRENT_PROVISION=`provision_for_bundle_id "$BUNDLE_ID" STRICT`
235
+ local CURRENT_PROVISION=`provision_for_bundle_id "$BUNDLE_ID" STRICT`
234
236
 
235
- if [[ "$CURRENT_PROVISION" != "" && "$CURRENT_PROVISION" != "$PROVISION" ]]; then
236
- echo "Conflicting provisioning profiles '$PROVISION' and '$CURRENT_PROVISION' for bundle identifier '$BUNDLE_ID'." >&2
237
- exit 1
238
- fi
237
+ if [[ "$CURRENT_PROVISION" != "" && "$CURRENT_PROVISION" != "$PROVISION" ]]; then
238
+ echo "Conflicting provisioning profiles '$PROVISION' and '$CURRENT_PROVISION' for bundle identifier '$BUNDLE_ID'." >&2
239
+ exit 1
240
+ fi
239
241
 
240
- PROVISIONS_BY_ID+=("$BUNDLE_ID=$PROVISION")
242
+ PROVISIONS_BY_ID+=("$BUNDLE_ID=$PROVISION")
241
243
  }
242
244
 
243
245
  # Add given provisioning profile to the search list
244
246
  function add_provision {
245
247
 
246
- local PROVISION="$1"
248
+ local PROVISION="$1"
247
249
 
248
- if [[ "$1" =~ .+=.+ ]]; then
249
- PROVISION="${1#*=}"
250
- add_provision_for_bundle_id "$PROVISION" "${1%%=*}"
251
- elif [[ "$DEFAULT_PROVISION" == "" ]]; then
252
- DEFAULT_PROVISION="$PROVISION"
253
- fi
250
+ if [[ "$1" =~ .+=.+ ]]; then
251
+ PROVISION="${1#*=}"
252
+ add_provision_for_bundle_id "$PROVISION" "${1%%=*}"
253
+ elif [[ "$DEFAULT_PROVISION" == "" ]]; then
254
+ DEFAULT_PROVISION="$PROVISION"
255
+ fi
254
256
 
255
- if [[ ! -e "$PROVISION" ]]; then
256
- echo "Provisioning profile '$PROVISION' file does not exist" >&2
257
- exit 1;
258
- fi
257
+ if [[ ! -e "$PROVISION" ]]; then
258
+ echo "Provisioning profile '$PROVISION' file does not exist" >&2
259
+ exit 1;
260
+ fi
259
261
 
260
- local BUNDLE_ID=`bundle_id_for_provison "$PROVISION"`
261
- add_provision_for_bundle_id "$PROVISION" "$BUNDLE_ID"
262
+ local BUNDLE_ID=`bundle_id_for_provison "$PROVISION"`
263
+ add_provision_for_bundle_id "$PROVISION" "$BUNDLE_ID"
262
264
  }
263
265
 
264
266
  # Load bundle identifiers from provisioning profiles
@@ -269,206 +271,225 @@ done
269
271
  # Resign the given application
270
272
  function resign {
271
273
 
272
- local APP_PATH="$1"
273
- local NESTED="$2"
274
- local BUNDLE_IDENTIFIER="$BUNDLE_IDENTIFIER"
275
- local NEW_PROVISION="$NEW_PROVISION"
276
- local APP_IDENTIFER_PREFIX=""
277
- local TEAM_IDENTIFIER=""
274
+ local APP_PATH="$1"
275
+ local NESTED="$2"
276
+ local BUNDLE_IDENTIFIER="$BUNDLE_IDENTIFIER"
277
+ local NEW_PROVISION="$NEW_PROVISION"
278
+ local APP_IDENTIFER_PREFIX=""
279
+ local TEAM_IDENTIFIER=""
278
280
 
279
- if [[ "$NESTED" == NESTED ]]; then
280
- # Ignore bundle identifier for nested applications
281
- BUNDLE_IDENTIFIER=""
282
- fi
281
+ if [[ "$NESTED" == NESTED ]]; then
282
+ # Ignore bundle identifier for nested applications
283
+ BUNDLE_IDENTIFIER=""
284
+ fi
283
285
 
284
- # Make sure that the Info.plist file is where we expect it
285
- if [ ! -e "$APP_PATH/Info.plist" ];
286
- then
287
- echo "Expected file does not exist: '$APP_PATH/Info.plist'" >&2
288
- exit 1;
289
- fi
286
+ # Make sure that the Info.plist file is where we expect it
287
+ if [ ! -e "$APP_PATH/Info.plist" ];
288
+ then
289
+ echo "Expected file does not exist: '$APP_PATH/Info.plist'" >&2
290
+ exit 1;
291
+ fi
290
292
 
291
- # Read in current values from the app
292
- local CURRENT_NAME=`PlistBuddy -c "Print :CFBundleDisplayName" "$APP_PATH/Info.plist"`
293
- local CURRENT_BUNDLE_IDENTIFIER=`PlistBuddy -c "Print :CFBundleIdentifier" "$APP_PATH/Info.plist"`
294
- local NEW_PROVISION=`provision_for_bundle_id "${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}"`
293
+ # Read in current values from the app
294
+ local CURRENT_NAME=`PlistBuddy -c "Print :CFBundleDisplayName" "$APP_PATH/Info.plist"`
295
+ local CURRENT_BUNDLE_IDENTIFIER=`PlistBuddy -c "Print :CFBundleIdentifier" "$APP_PATH/Info.plist"`
296
+ local NEW_PROVISION=`provision_for_bundle_id "${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}"`
295
297
 
296
- if [[ "$NEW_PROVISION" == "" && "$NESTED" != NESTED ]]; then
297
- NEW_PROVISION="$DEFAULT_PROVISION"
298
- fi
298
+ if [[ "$NEW_PROVISION" == "" && "$NESTED" != NESTED ]]; then
299
+ NEW_PROVISION="$DEFAULT_PROVISION"
300
+ fi
299
301
 
300
- if [[ "$NEW_PROVISION" == "" ]]; then
301
- if [[ "$NESTED" == NESTED ]]; then
302
- echo "No provisioning profile for nested application: '$APP_PATH' with bundle identifier '${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}'" >&2
303
- else
304
- echo "No provisioning profile for application: '$APP_PATH' with bundle identifier '${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}'" >&2
302
+ if [[ "$NEW_PROVISION" == "" ]]; then
303
+ if [[ "$NESTED" == NESTED ]]; then
304
+ echo "No provisioning profile for nested application: '$APP_PATH' with bundle identifier '${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}'" >&2
305
+ else
306
+ echo "No provisioning profile for application: '$APP_PATH' with bundle identifier '${BUNDLE_IDENTIFIER:-$CURRENT_BUNDLE_IDENTIFIER}'" >&2
307
+ fi
308
+ echo "Use the -p option (example: -p com.example.app=xxxx.mobileprovision)" >&2
309
+ exit 1;
305
310
  fi
306
- echo "Use the -p option (example: -p com.example.app=xxxx.mobileprovision)" >&2
307
- exit 1;
308
- fi
309
311
 
310
- local PROVISION_BUNDLE_IDENTIFIER=`bundle_id_for_provison "$NEW_PROVISION"`
312
+ local PROVISION_BUNDLE_IDENTIFIER=`bundle_id_for_provison "$NEW_PROVISION"`
311
313
 
312
- # Use provisioning profile's bundle identifier
313
- if [ "$BUNDLE_IDENTIFIER" == "" ]; then
314
- if [[ "$PROVISION_BUNDLE_IDENTIFIER" =~ \* ]]; then
315
- echo "Bundle Identifier contains a *, using the current bundle identifier" >&2
316
- BUNDLE_IDENTIFIER="$CURRENT_BUNDLE_IDENTIFIER"
317
- else
318
- BUNDLE_IDENTIFIER="$PROVISION_BUNDLE_IDENTIFIER"
314
+ # Use provisioning profile's bundle identifier
315
+ if [ "$BUNDLE_IDENTIFIER" == "" ]; then
316
+ if [[ "$PROVISION_BUNDLE_IDENTIFIER" =~ \* ]]; then
317
+ echo "Bundle Identifier contains a *, using the current bundle identifier" >&2
318
+ BUNDLE_IDENTIFIER="$CURRENT_BUNDLE_IDENTIFIER"
319
+ else
320
+ BUNDLE_IDENTIFIER="$PROVISION_BUNDLE_IDENTIFIER"
321
+ fi
319
322
  fi
320
- fi
321
323
 
322
- if ! does_bundle_id_match "$PROVISION_BUNDLE_IDENTIFIER" "$BUNDLE_IDENTIFIER"; then
323
- echo "Bundle Identifier '$PROVISION_BUNDLE_IDENTIFIER' in provisioning profile '$NEW_PROVISION' does not match the Bundle Identifier '$BUNDLE_IDENTIFIER' for application '$APP_PATH'." >&2
324
- exit 1
325
- fi
324
+ if ! does_bundle_id_match "$PROVISION_BUNDLE_IDENTIFIER" "$BUNDLE_IDENTIFIER"; then
325
+ echo "Bundle Identifier '$PROVISION_BUNDLE_IDENTIFIER' in provisioning profile '$NEW_PROVISION' does not match the Bundle Identifier '$BUNDLE_IDENTIFIER' for application '$APP_PATH'." >&2
326
+ exit 1
327
+ fi
326
328
 
327
- echo "Current bundle identifier is: '$CURRENT_BUNDLE_IDENTIFIER'" >&2
328
- echo "New bundle identifier will be: '$BUNDLE_IDENTIFIER'" >&2
329
+ echo "Current bundle identifier is: '$CURRENT_BUNDLE_IDENTIFIER'" >&2
330
+ echo "New bundle identifier will be: '$BUNDLE_IDENTIFIER'" >&2
329
331
 
330
- # Update the CFBundleDisplayName property in the Info.plist if a new name has been provided
331
- if [ "${DISPLAY_NAME}" != "" ];
332
- then
333
- if [ "${DISPLAY_NAME}" != "${CURRENT_NAME}" ];
332
+ # Update the CFBundleDisplayName property in the Info.plist if a new name has been provided
333
+ if [ "${DISPLAY_NAME}" != "" ];
334
334
  then
335
- echo "Changing display name from '$CURRENT_NAME' to '$DISPLAY_NAME'" >&2
336
- `PlistBuddy -c "Set :CFBundleDisplayName $DISPLAY_NAME" "$APP_PATH/Info.plist"`
335
+ if [ "${DISPLAY_NAME}" != "${CURRENT_NAME}" ];
336
+ then
337
+ echo "Changing display name from '$CURRENT_NAME' to '$DISPLAY_NAME'" >&2
338
+ `PlistBuddy -c "Set :CFBundleDisplayName $DISPLAY_NAME" "$APP_PATH/Info.plist"`
339
+ fi
337
340
  fi
338
- fi
339
341
 
340
- # Replace the embedded mobile provisioning profile
341
- echo "Validating the new provisioning profile: $NEW_PROVISION" >&2
342
- security cms -D -i "$NEW_PROVISION" > "$TEMP_DIR/profile.plist"
343
- checkStatus
342
+ # Replace the embedded mobile provisioning profile
343
+ echo "Validating the new provisioning profile: $NEW_PROVISION" >&2
344
+ security cms -D -i "$NEW_PROVISION" > "$TEMP_DIR/profile.plist"
345
+ checkStatus
344
346
 
345
- APP_IDENTIFER_PREFIX=`PlistBuddy -c "Print :Entitlements:application-identifier" "$TEMP_DIR/profile.plist" | grep -E '^[A-Z0-9]*' -o | tr -d '\n'`
346
- if [ "$APP_IDENTIFER_PREFIX" == "" ];
347
- then
348
- APP_IDENTIFER_PREFIX=`PlistBuddy -c "Print :ApplicationIdentifierPrefix:0" "$TEMP_DIR/profile.plist"`
347
+ APP_IDENTIFER_PREFIX=`PlistBuddy -c "Print :Entitlements:application-identifier" "$TEMP_DIR/profile.plist" | grep -E '^[A-Z0-9]*' -o | tr -d '\n'`
349
348
  if [ "$APP_IDENTIFER_PREFIX" == "" ];
350
349
  then
351
- echo "Failed to extract any app identifier prefix from '$NEW_PROVISION'" >&2
352
- exit 1;
350
+ APP_IDENTIFER_PREFIX=`PlistBuddy -c "Print :ApplicationIdentifierPrefix:0" "$TEMP_DIR/profile.plist"`
351
+ if [ "$APP_IDENTIFER_PREFIX" == "" ];
352
+ then
353
+ echo "Failed to extract any app identifier prefix from '$NEW_PROVISION'" >&2
354
+ exit 1;
355
+ else
356
+ echo "WARNING: extracted an app identifier prefix '$APP_IDENTIFER_PREFIX' from '$NEW_PROVISION', but it was not found in the profile's entitlements" >&2
357
+ fi
353
358
  else
354
- echo "WARNING: extracted an app identifier prefix '$APP_IDENTIFER_PREFIX' from '$NEW_PROVISION', but it was not found in the profile's entitlements" >&2
359
+ echo "Profile app identifier prefix is '$APP_IDENTIFER_PREFIX'" >&2
355
360
  fi
356
- else
357
- echo "Profile app identifier prefix is '$APP_IDENTIFER_PREFIX'" >&2
358
- fi
359
361
 
360
- TEAM_IDENTIFIER=`PlistBuddy -c "Print :Entitlements:com.apple.developer.team-identifier" "$TEMP_DIR/profile.plist" | tr -d '\n'`
361
- if [ "$TEAM_IDENTIFIER" == "" ];
362
- then
363
- TEAM_IDENTIFIER=`PlistBuddy -c "Print :TeamIdentifier:0" "$TEMP_DIR/profile.plist"`
362
+ TEAM_IDENTIFIER=`PlistBuddy -c "Print :Entitlements:com.apple.developer.team-identifier" "$TEMP_DIR/profile.plist" | tr -d '\n'`
364
363
  if [ "$TEAM_IDENTIFIER" == "" ];
365
364
  then
366
- echo "Failed to extract team identifier from '$NEW_PROVISION', resigned ipa may fail on iOS 8 and higher" >&2
365
+ TEAM_IDENTIFIER=`PlistBuddy -c "Print :TeamIdentifier:0" "$TEMP_DIR/profile.plist"`
366
+ if [ "$TEAM_IDENTIFIER" == "" ];
367
+ then
368
+ echo "Failed to extract team identifier from '$NEW_PROVISION', resigned ipa may fail on iOS 8 and higher" >&2
369
+ else
370
+ echo "WARNING: extracted a team identifier '$TEAM_IDENTIFIER' from '$NEW_PROVISION', but it was not found in the profile's entitlements, resigned ipa may fail on iOS 8 and higher" >&2
371
+ fi
367
372
  else
368
- echo "WARNING: extracted a team identifier '$TEAM_IDENTIFIER' from '$NEW_PROVISION', but it was not found in the profile's entitlements, resigned ipa may fail on iOS 8 and higher" >&2
373
+ echo "Profile team identifier is '$TEAM_IDENTIFIER'" >&2
369
374
  fi
370
- else
371
- echo "Profile team identifier is '$TEAM_IDENTIFIER'" >&2
372
- fi
373
375
 
374
- cp "$NEW_PROVISION" "$APP_PATH/embedded.mobileprovision"
376
+ cp "$NEW_PROVISION" "$APP_PATH/embedded.mobileprovision"
375
377
 
376
378
 
377
- #if the current bundle identifier is different from the new one in the provisioning profile, then change it.
378
- if [ "$CURRENT_BUNDLE_IDENTIFIER" != "$BUNDLE_IDENTIFIER" ];
379
- then
380
- echo "Updating the bundle identifier from '$CURRENT_BUNDLE_IDENTIFIER' to '$BUNDLE_IDENTIFIER'" >&2
381
- `PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_IDENTIFIER" "$APP_PATH/Info.plist"`
382
- checkStatus
383
- fi
384
-
385
- # Update the version number properties in the Info.plist if a version number has been provided
386
- if [ "$VERSION_NUMBER" != "" ];
387
- then
388
- CURRENT_VERSION_NUMBER=`PlistBuddy -c "Print :CFBundleVersion" "$APP_PATH/Info.plist"`
389
- if [ "$VERSION_NUMBER" != "$CURRENT_VERSION_NUMBER" ];
379
+ #if the current bundle identifier is different from the new one in the provisioning profile, then change it.
380
+ if [ "$CURRENT_BUNDLE_IDENTIFIER" != "$BUNDLE_IDENTIFIER" ];
390
381
  then
391
- echo "Updating the version from '$CURRENT_VERSION_NUMBER' to '$VERSION_NUMBER'" >&2
392
- `PlistBuddy -c "Set :CFBundleVersion $VERSION_NUMBER" "$APP_PATH/Info.plist"`
393
- `PlistBuddy -c "Set :CFBundleShortVersionString $VERSION_NUMBER" "$APP_PATH/Info.plist"`
382
+ echo "Updating the bundle identifier from '$CURRENT_BUNDLE_IDENTIFIER' to '$BUNDLE_IDENTIFIER'" >&2
383
+ `PlistBuddy -c "Set :CFBundleIdentifier $BUNDLE_IDENTIFIER" "$APP_PATH/Info.plist"`
384
+ checkStatus
394
385
  fi
395
- fi
396
386
 
397
- # Check for and resign any embedded frameworks (new feature for iOS 8 and above apps)
398
- FRAMEWORKS_DIR="$APP_PATH/Frameworks"
399
- if [ -d "$FRAMEWORKS_DIR" ];
400
- then
401
- if [ "$TEAM_IDENTIFIER" == "" ];
387
+ # Update the version number properties in the Info.plist if a version number has been provided
388
+ if [ "$VERSION_NUMBER" != "" ];
402
389
  then
403
- echo "ERROR: embedded frameworks detected, re-signing iOS 8 (or higher) applications wihout a team identifier in the certificate/profile does not work" >&2
404
- exit 1;
405
- fi
406
-
407
- echo "Resigning embedded frameworks using certificate: '$CERTIFICATE'" >&2
408
- for framework in "$FRAMEWORKS_DIR"/*
409
- do
410
- if [[ "$framework" == *.framework || "$framework" == *.dylib ]]
390
+ CURRENT_VERSION_NUMBER=`PlistBuddy -c "Print :CFBundleVersion" "$APP_PATH/Info.plist"`
391
+ if [ "$VERSION_NUMBER" != "$CURRENT_VERSION_NUMBER" ];
411
392
  then
412
- /usr/bin/codesign -f -s "$CERTIFICATE" "$framework"
413
- checkStatus
414
- else
415
- echo "Ignoring non-framework: $framework" >&2
393
+ echo "Updating the version from '$CURRENT_VERSION_NUMBER' to '$VERSION_NUMBER'" >&2
394
+ `PlistBuddy -c "Set :CFBundleVersion $VERSION_NUMBER" "$APP_PATH/Info.plist"`
395
+ `PlistBuddy -c "Set :CFBundleShortVersionString $VERSION_NUMBER" "$APP_PATH/Info.plist"`
416
396
  fi
417
- done
418
- fi
419
-
397
+ fi
420
398
 
421
- if [ "$ENTITLEMENTS" != "" ];
422
- then
423
- if [ -n "$APP_IDENTIFER_PREFIX" ];
399
+ # Check for and resign any embedded frameworks (new feature for iOS 8 and above apps)
400
+ FRAMEWORKS_DIR="$APP_PATH/Frameworks"
401
+ if [ -d "$FRAMEWORKS_DIR" ];
424
402
  then
425
- # sanity check the 'application-identifier' is present in the provided entitlements and matches the provisioning profile value
426
- ENTITLEMENTS_APP_ID_PREFIX=`PlistBuddy -c "Print :application-identifier" "$ENTITLEMENTS" | grep -E '^[A-Z0-9]*' -o | tr -d '\n'`
427
- if [ "$ENTITLEMENTS_APP_ID_PREFIX" == "" ];
428
- then
429
- echo "Provided entitlements file is missing a value for the required 'application-identifier' key" >&2
430
- exit 1;
431
- elif [ "$ENTITLEMENTS_APP_ID_PREFIX" != "$APP_IDENTIFER_PREFIX" ];
403
+ if [ "$TEAM_IDENTIFIER" == "" ];
432
404
  then
433
- echo "Provided entitlements file's app identifier prefix value '$ENTITLEMENTS_APP_ID_PREFIX' does not match the provided provisioning profile's value '$APP_IDENTIFER_PREFIX'" >&2
405
+ echo "ERROR: embedded frameworks detected, re-signing iOS 8 (or higher) applications wihout a team identifier in the certificate/profile does not work" >&2
434
406
  exit 1;
435
407
  fi
408
+
409
+ echo "Resigning embedded frameworks using certificate: '$CERTIFICATE'" >&2
410
+ for framework in "$FRAMEWORKS_DIR"/*
411
+ do
412
+ if [[ "$framework" == *.framework || "$framework" == *.dylib ]]
413
+ then
414
+ /usr/bin/codesign -f -s "$CERTIFICATE" "$framework"
415
+ checkStatus
416
+ else
417
+ echo "Ignoring non-framework: $framework" >&2
418
+ fi
419
+ done
436
420
  fi
437
421
 
438
- if [ -n "$TEAM_IDENTIFIER" ];
422
+ # Check for and update bundle identifiers for extensions and associated nested apps
423
+ echo "Fixing nested app and extension references"
424
+ for key in ${NESTED_APP_REFERENCE_KEYS[@]}; do
425
+ # Check if Info.plist has a reference to another app or extension
426
+ REF_BUNDLE_ID=`PlistBuddy -c "Print ${key}" "$APP_PATH/Info.plist" 2>/dev/null`
427
+ if [ -n "$REF_BUNDLE_ID" ];
428
+ then
429
+ # Found a reference bundle id, now get the corresponding provisioning profile for this bundle id
430
+ REF_PROVISION=`provision_for_bundle_id $REF_BUNDLE_ID`
431
+ # Map to the new bundle id
432
+ NEW_REF_BUNDLE_ID=`bundle_id_for_provison "$REF_PROVISION"`
433
+ # Change if not the same
434
+ if [ "$REF_BUNDLE_ID" != "$NEW_REF_BUNDLE_ID" ];
435
+ then
436
+ echo "Updating nested app or extension reference for ${key} key from ${REF_BUNDLE_ID} to ${NEW_REF_BUNDLE_ID}" >&2
437
+ `PlistBuddy -c "Set ${key} $NEW_REF_BUNDLE_ID" "$APP_PATH/Info.plist"`
438
+ fi
439
+ fi
440
+ done
441
+
442
+ if [ "$ENTITLEMENTS" != "" ];
439
443
  then
440
- # sanity check the 'com.apple.developer.team-identifier' is present in the provided entitlements and matches the provisioning profile value
441
- ENTITLEMENTS_TEAM_IDENTIFIER=`PlistBuddy -c "Print :com.apple.developer.team-identifier" "$ENTITLEMENTS" | tr -d '\n'`
442
- if [ "$ENTITLEMENTS_TEAM_IDENTIFIER" == "" ];
444
+ if [ -n "$APP_IDENTIFER_PREFIX" ];
443
445
  then
444
- echo "Provided entitlements file is missing a value for the required 'com.apple.developer.team-identifier' key" >&2
445
- exit 1;
446
- elif [ "$ENTITLEMENTS_TEAM_IDENTIFIER" != "$TEAM_IDENTIFIER" ];
446
+ # sanity check the 'application-identifier' is present in the provided entitlements and matches the provisioning profile value
447
+ ENTITLEMENTS_APP_ID_PREFIX=`PlistBuddy -c "Print :application-identifier" "$ENTITLEMENTS" | grep -E '^[A-Z0-9]*' -o | tr -d '\n'`
448
+ if [ "$ENTITLEMENTS_APP_ID_PREFIX" == "" ];
449
+ then
450
+ echo "Provided entitlements file is missing a value for the required 'application-identifier' key" >&2
451
+ exit 1;
452
+ elif [ "$ENTITLEMENTS_APP_ID_PREFIX" != "$APP_IDENTIFER_PREFIX" ];
453
+ then
454
+ echo "Provided entitlements file's app identifier prefix value '$ENTITLEMENTS_APP_ID_PREFIX' does not match the provided provisioning profile's value '$APP_IDENTIFER_PREFIX'" >&2
455
+ exit 1;
456
+ fi
457
+ fi
458
+
459
+ if [ -n "$TEAM_IDENTIFIER" ];
447
460
  then
448
- echo "Provided entitlements file's 'com.apple.developer.team-identifier' '$ENTITLEMENTS_TEAM_IDENTIFIER' does not match the provided provisioning profile's value '$TEAM_IDENTIFIER'" >&2
449
- exit 1;
461
+ # sanity check the 'com.apple.developer.team-identifier' is present in the provided entitlements and matches the provisioning profile value
462
+ ENTITLEMENTS_TEAM_IDENTIFIER=`PlistBuddy -c "Print :com.apple.developer.team-identifier" "$ENTITLEMENTS" | tr -d '\n'`
463
+ if [ "$ENTITLEMENTS_TEAM_IDENTIFIER" == "" ];
464
+ then
465
+ echo "Provided entitlements file is missing a value for the required 'com.apple.developer.team-identifier' key" >&2
466
+ exit 1;
467
+ elif [ "$ENTITLEMENTS_TEAM_IDENTIFIER" != "$TEAM_IDENTIFIER" ];
468
+ then
469
+ echo "Provided entitlements file's 'com.apple.developer.team-identifier' '$ENTITLEMENTS_TEAM_IDENTIFIER' does not match the provided provisioning profile's value '$TEAM_IDENTIFIER'" >&2
470
+ exit 1;
471
+ fi
450
472
  fi
451
- fi
452
473
 
453
- echo "Resigning application using certificate: '$CERTIFICATE'" >&2
454
- echo "and entitlements: $ENTITLEMENTS" >&2
455
- cp -- "$ENTITLEMENTS" "$APP_PATH/archived-expanded-entitlements.xcent"
456
- /usr/bin/codesign -f -s "$CERTIFICATE" --entitlements="$ENTITLEMENTS" "$APP_PATH"
457
- checkStatus
458
- else
459
- echo "Extracting entitlements from provisioning profile" >&2
460
- PlistBuddy -x -c "Print Entitlements" "$TEMP_DIR/profile.plist" > "$TEMP_DIR/newEntitlements"
461
- checkStatus
462
- echo "Resigning application using certificate: '$CERTIFICATE'" >&2
463
- echo "and entitlements from provisioning profile: $NEW_PROVISION" >&2
464
- cp -- "$TEMP_DIR/newEntitlements" "$APP_PATH/archived-expanded-entitlements.xcent"
465
- /usr/bin/codesign -f -s "$CERTIFICATE" --entitlements="$TEMP_DIR/newEntitlements" "$APP_PATH"
466
- checkStatus
467
- fi
474
+ echo "Resigning application using certificate: '$CERTIFICATE'" >&2
475
+ echo "and entitlements: $ENTITLEMENTS" >&2
476
+ cp -- "$ENTITLEMENTS" "$APP_PATH/archived-expanded-entitlements.xcent"
477
+ /usr/bin/codesign -f -s "$CERTIFICATE" --entitlements="$ENTITLEMENTS" "$APP_PATH"
478
+ checkStatus
479
+ else
480
+ echo "Extracting entitlements from provisioning profile" >&2
481
+ PlistBuddy -x -c "Print Entitlements" "$TEMP_DIR/profile.plist" > "$TEMP_DIR/newEntitlements"
482
+ checkStatus
483
+ echo "Resigning application using certificate: '$CERTIFICATE'" >&2
484
+ echo "and entitlements from provisioning profile: $NEW_PROVISION" >&2
485
+ cp -- "$TEMP_DIR/newEntitlements" "$APP_PATH/archived-expanded-entitlements.xcent"
486
+ /usr/bin/codesign -f -s "$CERTIFICATE" --entitlements="$TEMP_DIR/newEntitlements" "$APP_PATH"
487
+ checkStatus
488
+ fi
468
489
 
469
- # Remove the temporary files if they were created before generating ipa
470
- rm -f "$TEMP_DIR/newEntitlements"
471
- rm -f "$TEMP_DIR/profile.plist"
490
+ # Remove the temporary files if they were created before generating ipa
491
+ rm -f "$TEMP_DIR/newEntitlements"
492
+ rm -f "$TEMP_DIR/profile.plist"
472
493
 
473
494
  }
474
495
 
@@ -499,4 +520,4 @@ mv "$TEMP_DIR.ipa" "$NEW_FILE"
499
520
  # Remove the temp directory
500
521
  rm -rf "$TEMP_DIR"
501
522
 
502
- echo "Process complete" >&2
523
+ echo "Process complete" >&2
@@ -6,16 +6,16 @@ module Sigh
6
6
  def run(options, args)
7
7
  # get the command line inputs and parse those into the vars we need...
8
8
 
9
- ipa, signing_identity, provisioning_profiles, entitlements = get_inputs(options, args)
9
+ ipa, signing_identity, provisioning_profiles, entitlements, version = get_inputs(options, args)
10
10
  # ... then invoke our programmatic interface with these vars
11
- resign(ipa, signing_identity, provisioning_profiles, entitlements)
11
+ resign(ipa, signing_identity, provisioning_profiles, entitlements, version)
12
12
  end
13
13
 
14
- def self.resign(ipa, signing_identity, provisioning_profiles, entitlements)
15
- self.new.resign(ipa, signing_identity, provisioning_profiles, entitlements)
14
+ def self.resign(ipa, signing_identity, provisioning_profiles, entitlements, version)
15
+ self.new.resign(ipa, signing_identity, provisioning_profiles, entitlements, version)
16
16
  end
17
17
 
18
- def resign(ipa, signing_identity, provisioning_profiles, entitlements)
18
+ def resign(ipa, signing_identity, provisioning_profiles, entitlements, version)
19
19
  resign_path = find_resign_path
20
20
  signing_identity = find_signing_identity(signing_identity)
21
21
 
@@ -27,6 +27,7 @@ module Sigh
27
27
  validate_params(resign_path, ipa, provisioning_profiles)
28
28
  entitlements = "-e #{entitlements}" if entitlements
29
29
  provisioning_options = provisioning_profiles.map { |fst, snd| "-p #{[fst, snd].compact.map(&:shellescape).join('=')}" }.join(' ')
30
+ version = "-n #{version}" if version
30
31
 
31
32
  command = [
32
33
  resign_path.shellescape,
@@ -34,6 +35,7 @@ module Sigh
34
35
  signing_identity.shellescape,
35
36
  provisioning_options, # we are aleady shellescaping this above, when we create the provisioning_options from the provisioning_profiles
36
37
  entitlements,
38
+ version,
37
39
  ipa.shellescape
38
40
  ].join(' ')
39
41
 
@@ -54,8 +56,9 @@ module Sigh
54
56
  signing_identity = options.signing_identity || ask_for_signing_identity
55
57
  provisioning_profiles = options.provisioning_profile || find_provisioning_profile || ask('Path to provisioning file: ')
56
58
  entitlements = options.entitlements || find_entitlements
59
+ version = options.version_number || nil
57
60
 
58
- return ipa, signing_identity, provisioning_profiles, entitlements
61
+ return ipa, signing_identity, provisioning_profiles, entitlements, version
59
62
  end
60
63
 
61
64
  def find_resign_path
@@ -1,3 +1,3 @@
1
1
  module Sigh
2
- VERSION = "1.3.1"
2
+ VERSION = "1.4.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sigh
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Felix Krause
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-02-02 00:00:00.000000000 Z
11
+ date: 2016-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fastlane_core
@@ -50,14 +50,20 @@ dependencies:
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: 0.12.3
53
+ version: 0.22.0
54
+ - - "<"
55
+ - !ruby/object:Gem::Version
56
+ version: 1.0.0
54
57
  type: :runtime
55
58
  prerelease: false
56
59
  version_requirements: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - ">="
59
62
  - !ruby/object:Gem::Version
60
- version: 0.12.3
63
+ version: 0.22.0
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: 1.0.0
61
67
  - !ruby/object:Gem::Dependency
62
68
  name: bundler
63
69
  requirement: !ruby/object:Gem::Requirement
@@ -226,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
226
232
  version: '0'
227
233
  requirements: []
228
234
  rubyforge_project:
229
- rubygems_version: 2.4.0
235
+ rubygems_version: 2.4.5.1
230
236
  signing_key:
231
237
  specification_version: 4
232
238
  summary: Because you would rather spend your time building stuff than fighting provisioning