NativeScript / nativescript-cli

Command-line interface for building NativeScript apps
https://www.npmjs.com/package/nativescript
Apache License 2.0
1.04k stars 195 forks source link

Unable to use --provision option to build or run iOS apps #5320

Open jpakulski opened 4 years ago

jpakulski commented 4 years ago

Environment

OSX: 10.15.4

Output of tns doctor: ✔ Getting NativeScript components versions information... ✔ Component nativescript has 6.7.4 version and is up to date. ✔ Component tns-core-modules has 6.5.2 version and is up to date. ✔ Component tns-ios has 6.5.1 version and is up to date. ✔ Xcode is installed and is configured properly. ✔ xcodeproj is installed and is configured properly. ✔ CocoaPods are installed. ✔ CocoaPods update is not required. ✔ CocoaPods are configured properly. ✔ Your current CocoaPods version is newer than 1.0.0. ✔ Python installed and configured correctly. ✔ The Python 'six' package is found. ✔ Xcode version 11.5.0 satisfies minimum required version 10.

Not interested in Android in this project, so Android bits are not configured

Describe the bug

I am unable to run or build the app.

I can build the prepared app using XCode (once I fix the signing configuration, another potential issue with prepare command)

When trying to list available provisioning profiles:

tns <run|build|provision> ios --provision

Results in the not so friendly:

Expected "\"" or [^'"'] but "'" found.

When I run the command with the logging level increased:

tns <run|build|provision> ios --provision --log trace

I get the more useful:

...
Current CLI version:  6.7.4
Project dir from hooksArgs is: undefined.
Hooks directories: [ '/Users/j/Projects/visionlab/sad-dev/hooks' ]
BeforeHookName for command resolveCommand is before-resolveCommand
Project dir from hooksArgs is: undefined.
Hooks directories: [ '/Users/j/Projects/visionlab/sad-dev/hooks' ]
AfterHookName for command resolveCommand is after-resolveCommand
Validate options for platform: iOS
SyntaxError: Expected "\"" or [^'"'] but "'" found.
    at peg$buildStructuredError (/usr/local/lib/node_modules/nativescript/node_modules/ios-mobileprovision-finder/parsers/security-find-identity.js:314:12)
    at Object.peg$parse [as parse] (/usr/local/lib/node_modules/nativescript/node_modules/ios-mobileprovision-finder/parsers/security-find-identity.js:999:11)
    at Object.read (/usr/local/lib/node_modules/nativescript/node_modules/ios-mobileprovision-finder/index.ts:243:43)
    at IOSProvisionService.<anonymous> (/usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:80:55)
...

I tried to checkout what was going on above but it's complicated. I think it fails when trying to parse provisioning profiles.

Sadly the same error occurs when I try to supply a provisioning profile:

tns run ios --provision <UUID or Name>

Same thing happens on a newly created app.

Trying to run the app with no provisioning profile supplied in the command line fails with a signing error (regardless of the PROVISIONING_PROFILE or DEVELOPMENT_TEAM) being set in app/App_Resources/build.xcconfig but that's probably another issue.

To Reproduce

tns create sad-dev
cd sad-dev
tns run ios --provision

Expected behavior

A list of provisioning profiles

Additional context

I am running on Catalina. All seemed to work before I updated the OS. But sadly other stuff changed as well: NS version, etc...

NathanaelA commented 4 years ago

Well, lets see if we can help get you squared away. The doctor output looks good; but something is obviously messed up. Can you also do a node -v and tell me which version of Node you are using?

First of all, I would do a: If you have fast internet; just nuking the cache with a npm cache clean if not, use npm cache verify to make sure your module cache has no major issues... I have unfortunately seen npm many times not detect corrupt packages, so I tend to ; but at this point lets assume that it is correct and proceed as if whatever it does is still better than nothing.

The next step would be to remove the global nativescript cli; and re-install it.
npm r -g nativescript then do another npm i -g nativescript

Then try creating a new project, and see if it works.

If that still doesn't work, lets try switching versions to the prior version group: npm r -g nativescript then npm i -g nativescript@6.5.1

And then try creating happy-dev and verifying it works..

jpakulski commented 4 years ago

Hi Nathanael,

Thank You for replying. I'm using the LTS version of Node: v12.13.1 (I'll try updating this to the latest LTS version)

I'll do as You suggested and report back.

Cheers

jpakulski commented 4 years ago

Hi Nathanael,

I followed Your suggestions. Also, updated Node.

But unfortunately this resulted in the same error:

xcodeproj is installed and is configured properly.
CocoaPods are installed.
CocoaPods update is not required.
CocoaPods are configured properly.
Your current CocoaPods version is newer than 1.0.0.
Python installed and configured correctly.
The Python 'six' package is found.
Xcode version 11.5.0 satisfies minimum required version 10.
Project dir from hooksArgs is: /Users/j/Projects/visionlab/happy-dev.
Hooks directories: [ '/Users/j/Projects/visionlab/happy-dev/hooks' ]
AfterHookName for command checkEnvironment is after-checkEnvironment
Validate options for platform: iOS
SyntaxError: Expected "\"" or [^'"'] but "'" found.
    at peg$buildStructuredError (/usr/local/lib/node_modules/nativescript/node_modules/ios-mobileprovision-finder/parsers/security-find-identity.js:314:12)
    at Object.peg$parse [as parse] (/usr/local/lib/node_modules/nativescript/node_modules/ios-mobileprovision-finder/parsers/security-find-identity.js:999:11)
    at Object.read (/usr/local/lib/node_modules/nativescript/node_modules/ios-mobileprovision-finder/index.ts:245:32)
    at IOSProvisionService.<anonymous> (/usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:80:55)
    at Generator.next (<anonymous>)
    at /usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:7:71
    at new Promise (<anonymous>)
    at __awaiter (/usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:3:12)
    at IOSProvisionService.queryProvisioningProfilesAndDevices (/usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:79:16)
    at IOSProvisionService.<anonymous> (/usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:35:37)
    at Generator.next (<anonymous>)
    at /usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:7:71
    at new Promise (<anonymous>)
    at __awaiter (/usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:3:12)
    at IOSProvisionService.listProvisions (/usr/local/lib/node_modules/nativescript/lib/services/ios-provision-service.js:34:16)
    at IOSProjectService.<anonymous> (/usr/local/lib/node_modules/nativescript/lib/services/ios-project-service.js:107:49)
happy-dev % chrome /usr/local/lib/node_modules/nativescript/node_modules/ios-mobileprovision-finder/parsers/security-find-identity.js

I then took a better look at the code. It's failing when validating my certificates.

Our company has an apostrophe in its name. And sadly this results in the name of my certificate having a single quote in it. This is obviously valid from Apple's perspective, but the function peg$parse (in _/nodemodules/ios-mobileprovision-finder/parsers/security-find-identity.js) used to parse the certificate does not permit a single quote in the name.

It seems like there is a bug with the peg$parse function. (or pesky apostrophes in English :)

The fix, that seems to work, is to simply remove the single quote restriction from the parser regex (if this is a bug).

That part of the regex [^'"'] is sort of strange anyway because the single quote is repeated twice in the "not" char set, or I'm miss-understanding how that parser works.

JonnyFox commented 4 years ago

@jpakulski You saved my life! @NathanaelA please fix this!

tommag21 commented 2 years ago

Thanks @jpakulski.

Is there any fix planned?

facetious commented 2 years ago

@jpakulski You're absolutely right about that regex. It's likely a result of a (very early development cycle) search-and-replace that changed the other " marks on that same line into '"'. It was likely never caught because it would require an apostrophe to be present within your name in order to fail, and the developers testing it may not have encountered that.

Changing it to Name = '"' literal:$[^"]* '"' { return literal; } should resolve the issue. (as verified using https://pegjs.org/online)