yourkarma / JWT

A JSON Web Token implementation in Objective-C.
MIT License
351 stars 107 forks source link

Appstore validation breaks on disallowed characters #118

Closed akolio closed 7 years ago

akolio commented 7 years ago

New Issue Checklist

Issue Info

Info Value

Platform Name iOS Platform Version 9.3 CocoaLumberjack Version - Integration Method carthage Xcode Version 8.2.1 Repro rate 100% Demo project link -

Issue Description and Steps

Create project with 4 libraries from this project via carthage Base64 JWT_iOS_Framework JWT_iOS_Swift JWT_Framework

Archive project and send to appstore

Results in: ERROR ITMS-90049: "This bundle is invalid. The CFBundleIdentifier 'com.jwtio.JWT_iOS_Framework' in the bundle contains disallowed characters. It must be present, must contain only alphanumerics, dots, hyphens and must not end with a dot. [See the section of the ios Application Programming Guide entitled The Application Bundle.]"

Thoughts: I think the appstore validator doesn't like identifiers with underscores e.g. com.jwtio.JWT_iOS_Framework

https://developer.apple.com/library/content/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW15

CFBundleIdentifier: "The bundle identifier string identifies your application to the system. This string must be a uniform type identifier (UTI) that contains only alphanumeric (A-Z,a-z,0-9), hyphen (-), and period (.) characters. The string should also be in reverse-DNS format. For example, if your company’s domain is Ajax.com and you create an application named Hello, you could assign the string com.Ajax.Hello as your application’s bundle identifier. The bundle identifier is used in validating the application signature."

lolgear commented 7 years ago

oh-oh-oh, another brick in the wall.

Yes, you are correct, dashes are not allowed.

I thought about hyphen as replacement.

For example:

//:configuration = Debug
PRODUCT_BUNDLE_IDENTIFIER = com.jwtio.$(PRODUCT_NAME)
PRODUCT_MODULE_NAME = $(PRODUCT_NAME)
PRODUCT_NAME = $(TARGET_NAME)

And for JWT-iOS-Swift:

//:configuration = Debug
PRODUCT_BUNDLE_IDENTIFIER = com.jwtio.JWT-iOS-Swift
PRODUCT_MODULE_NAME = JWT-iOS-Swift
PRODUCT_NAME = JWT-iOS-Swift
akolio commented 7 years ago

I think that would be a good idea!

lolgear commented 7 years ago

@akolio check latest master, please.

akolio commented 7 years ago

Thanks for the quick help!

I cannot probably upload a new version now, but I archived a version with the new libraries and ran that against the store's validation and that completed ok!

I noticed that instead of 4 libraries I now got 3. Is the earlier JWT iOS framework now included in JWT.framework?

lolgear commented 7 years ago

@akolio not sure.

Could you print CFBundleIdentifiers? They are

io.jwt.ios
io.jwt.ios.swift
io.jwt.macos
io.jwt.macos.swift
find ./Carthage/Build/ -name '*.plist' | grep -v 'dSYM' | grep JWT | perl -MCwd -ne '$_ =~ s/^\.//; $_ = getcwd().$_; chomp; print qx(defaults read $_ CFBundleIdentifier)'
akolio commented 7 years ago

find ./Carthage/Build/ -name '*.plist' | grep -v 'dSYM' | grep JWT | perl -MCwd -ne '$ =~ s/^.//; $ = getcwd().$; chomp; print qx(defaults read $ CFBundleIdentifier)' io.jwt.ios io.jwt.ios.swift io.jwt.jwt io.jwt.macos.swift

lolgear commented 7 years ago

@akolio great! Could you use all of them?

akolio commented 7 years ago

I had a small unit test that uses jwt ios that I ran, I believe it works.

lolgear commented 7 years ago

Closed?