At my work I work with Unity games published to iOS. For update testing and other testing purposes, I used to use the download container and replace container option in Xcode -> Window -> Devices and Simulators. But since recently, that option doesn't seem to work (well) anymore, specifically loading the containers back onto the device and I have no clue why this suddenly happened.
When I download a container I can see the stored information is saved in appdata->Library->Preferences->my_apps.plist. But when I try to replace containers, it silently refuses to work.
When looking at the device Console during replacement, I found the following leads:
BUG IN CLIENT OF libsqlite3.dylib: database integrity compromised by
API violation: vnode unlinked while in use: ....
and
Sandbox: mobile_house_arr(311) deny(1) file-write-create
/private/var/mobile/Containers/Data/Application/E0099BB7-3FC3-40EB-BE84-157BE681360B/Library/Caches/Snapshots/com.PaulChimp.FirstAppTest/08134EA5-0D8C-4228-9806-4E9788981A13#2x.ktx
Anyone else experiencing problems with replacing container files? Specifically with games made with Unity?
When I ran into the same issue it turned out I had both databases (old and replacement) compiled into the project & was only loading one of the two. I believe the reason that error comes up is just that the files are in use when you try to make changes to the app's database.
I would recommend downloading the container using the Window > Devices & Simulators feature to see if you can find any obvious issues.
The app database location once downloaded is MYAPP.xcappdata (show package contents) > AppData > Library > Application Support.
I ended up downloading the container, removing the database I didn't need, and replacing the same container for the app.
Hope that's helpful! Best of luck!
Related
For a native iOS application we are integrating a C++ library which is writing some logs to disk to json file.
During debugging, we would like to access to this logs, but currently we can only do it by downloading the whole app container to the macOS machine and searching for the file there.
Since this a very time consuming operation we were hoping that there would be some solution that would allows us to get this file quickly. I did take a look to the lldb commands, but none of them seem to let you extract a file from the phone.
Is there anyway to do this in a quick way?
Thank you
Couple options...
1 - Add debug-only code in your app to share the log file (via AirDrop would probably be a good option).
or
2 - During debug, set these two keys (in project settings / info) to Yes:
Application supports iTunes file sharing
Supports opening documents in place
Once you've done that, you can open / copy files from your app's Documents directory (assuming that's where the logs are being written) from Finder on your Mac.
I recently acquired a newer MacBook to run the most recent iOS and Xcode versions. I copied a project folder to the new Mac and opened it with Xcode 11.4 (was 10.1 on old Mac). I get 14 errors all related to "Failed to render and update auto layout status for ..VeiwController". The simulator runs fine, but the main storyboard doesn't render the button icons properly. I can add new constraints to the buttons to show them properly but the errors don't go away. I assume I have lost some info/files related to autolayout when I copied folders. I have read about similar issues. Most talk about using Github or some other 3rd party for maintaining files. Is there any other way to get this done? It seems like updates computers/software should be simpler.
Since reporting this, I have used the same process of copying folders of all other projects and have had no problems. But one project, the largest and most complex continues to have 14 rendering errors and always the displayed err message "An internal error occurred. Editing functionality may be limited." The strange thing is going in and out of viewing Main.storyboard several times gets rid of the errors eventually. Unfortunately, the errors always come back when I open the project. And sometimes they go away, then come back randomly in the same session.
So the answer to "whats the simplest way to copy a project folder to new computer is just that - Copy the project folder! But thats the wrong question for this problem.
Every time I meteor build, I have to open XCode and do the following:
remove and add an item from "Link Binary With Libraries" (Facebook SDK)
add a URL Type (custom URL scheme for my app)
add a "Required device capabilities" to "Custom iOS Target Properties"
How can I edit my Meteor project to have these steps done automatically, and to auto add things to AndroidManifest.xml?
In some way use mobile-config.js or cordova-build-override?
I'm happy to see another guy who is trying to build a hybrid application using Meteor / extending a Meteor Cordova iOS app, since I'm facing the very same issues. So I'm very happy to share my experiences and approaches with you. :-)
So far, I ended up with the following approach:
I created a base template for my iOS app using meteor build (not meteor run ios-device, since I did not know if Meteor does some optimizations for production code).
Then, I copied the whole Xcode project under /platforms/ios to another loaction and used this new project as my "master" project from then on. This project is being enriched with native code, e.g. it also includes the Cocoa Pods I'm needing.
Of course, I also did not want to copy files each and every time I trigger a new Meteor build. At least, I would like to have the Staging/www folder updated, as this is happening quite frequently.
So my first (rather naive) approach was
delete the Staging/www folder in the master project
replace it with a relative link (using Xcode's linking functionality) to the Staging/www folder inside the .meteor/local/.../ios/ project
This approach did not work, since the shell script used in the Meteor Xcode project can't handle these links.
My second approach is to create a symlink on the filesystem level instead. This works as it should, and I'm able to build the project in Xcode as it should.
I could have followed the same approach for the Cordova plugins folder, but I've decided to replace the plugins manually in order to get a better control over them, even it means a bit more effort then.
Having the symlink in place also means that Xcode's version management (and also SVN which I am using for everything) will ignore everything below Staging/www, which is good in my opinion, because I'm already versioning the webapp code in the Meteor project itself.
BTW: I've started a discussion thread on hybrid mobile app on the Meteor forums as well, but so far it did not get too much attraction:
https://forums.meteor.com/t/building-a-hybrid-meteor-cordova-app-share-experiences/8212
Maybe we could follow up on Meteor-specific things there, to have the Meteor community participate in the discussion?
EDIT: I would also like to share an approach that failed completely, at least for me, maybe I was too dumb... Before I used Meteor's Xcode template as the starting point, I also tried it "the other way round", i.e. I started with my already existing Xcode app project and tried to include Meteor's / Cordova's part by hand. Using this approach, I never managed to set everything up correctly. I had lots of troubles and also had to tweak a lot of the compiler / linker flags to even get the code compiling. This grew me a lot of gray hairs. But even after I managed to get everything to compile, Meteor hang during startup - and I never figured out why.
One remaining problem I'm still facing is that Meteor's hot code push functionality seems to have some severe issues on iOS, that are also documented as GitHub issues. It can happen that the iOS app gets completely broken and needs to be reinstalled. I tried the mdg:reload-on-resume package, but this did not work as it should and made things even worse. As far as I can tell from the GitHub discussions, one should better disable hot code push until the Meteor team has addressed these issues. Breaking the app completely due to code pushes is not what my users would expect.
Unfortunately plist values (and assumably AndroidManifest.xml as well) can only be changed by a plugin:
Add entry to iOS .plist file via Cordova config.xml
I recently upgraded my project to Mono For Android v4.2. With this update, when ever I deploy my app to my device, all files I've previously created in the directory returned by GetExternalFilesDir("db") are deleted. I don't want this behavior. The previous version of M4A I was using did not do this unwanted behavior.
Should I be using a different Method to get a directory to store my files in? I have seen getExternalStorageDirectory() suggested but I don't even see that method available in Mono For Android.
I want this behavior: I want these files to be deleted when the user truly unisntalls my app, but I don't want them deleted if it's just installing an update.
Thanks,
Tools -> Options -> Mono for Android -> Preserve something something something
I've finally obtained an iOS developer license, I've managed to publish a hello world, basic kind of app, get an IPA file and install it on my iphone.
However, now i'm trying something more complex, including using imported libraries. I start the publish process as usual, no error is produced but i'm not getting a message that the ipa is ready.
When i look at the target directory I have folders named like 'AOTBuildOutput5264907783565294361.tmp' with files in them.
Looks like it crashes in the middle, but I get no error message to debug!
Please help me find out where I can read these error messages or provide some other kind of insight!
Thanks in advance
Rotem
I've occasionally run into problems like this. It usually occurs when I'm trying to publish the app from my dropbox folder whilst it is trying to sync.
I can only assume that the problem happens because another application is accessing that file (in my case dropbox).
So make sure nothing else is trying to sync to that folder. Hope that helps.
I ended up moving my development folder to somewhere else in my filesystem and everything went fine. I guess having hebrew charachters in the path didn't work so well for the compiler.