Adding a Symbolic Link in the Application Bundle

2019-01-20 12:11发布

问题:

Apple specifies in the UILocalNotification class reference that the audio file must be from the application bundle. However, some smart geek has found his way around this limitation by using:

// this works by going up the bundle dir, then pointing to the Documents dir
localNotif.soundName = @"../Documents/blabla.caf";

This workaround has worked well with iOS 5, however, it broke in iOS 6. In a desperate attempt to try and come up with a new workaround, I made an alias (Symbolic Link) called blabla.caf that points to ../Documents/blabla.caf, and placed it into the application bundle. This is were I got stuck.

Now, I am getting a PBXCp error, and Xcode can't complete application deployment to the device because apparently

error: /Users/stuff/moreStuff/appName/../Documents/blabla.caf: No such file or directory


My Question:

  1. Can I somehow add a dummy file (0 KB) to the Documents directory just to shut Xcode up?
  2. Can I somehow force Xcode to just override this error and get on with life deploying the app?

回答1:

If you place a symlink to ../../Documents/blabla.caf inside a folder, and then add the folder to the project (making sure that you have "Create folder references..." set on import instead of "Create groups...") then Xcode won't try to resolve the link during the build process.

I've verified that the link itself works fine in the app, though I'm not sure off the top of my head if UILocalNotification will accept folder/blabla.caf in its soundName property.



回答2:

Despite symlink from bundle to documents directory works in iOS 7.1, this workaround becomes unusefull if you are going to put an app in the AppStore. Since March 2014 apps with such symbolic links will not pass to the review.

After I have uploaded app with such link in the bundle to iTunes connect I receive an Invalid binary status immediately. With following mail from iTunes Store:

Dear developer,

We have discovered one or more issues with your recent delivery for "X". To process your delivery, the following issues must be corrected:

Invalid Symlink - Your package contains a symbolic link 'External/Documents' which resolves to a location 'External/../../Documents' that does not exist or is outside of the package.

...

Regards,

The App Store team