I'm developing a Cydia app. It's been in development for awhile, and I've never had any problems until recently, when I resumed development after a few months. There are a couple of things that have changed since the last time I worked on it:
Upgraded to Lion
Moved to Xcode 4
Updated to 4.3.5 on my iPad, iPhone to 5.0
From the research I've done, I've come to the conclusion that there was something "unusual" about my old setup. I've discovered that provisioned apps get put in the "sandboxed directory" /private/var/mobile/Applications, and system apps that get read access to the entire filesystem go in /Applications. I guess from using updated tools and Lion, I broke whatever was giving me system-wide read privileges. So, I need information on how to get Xcode to deploy directly to the non-sandboxed system directory.
There are some caveats though. I don't want to have to use an installer, I want Xcode to do it automatically after Build and Run. I also want to be able to have the debugger attached so I can view the console.
Can anyone with experience in this teach me how to use Build Phase Scripts to do necessary magic to take the signed binary and deploy it automatically after each build? I'd imagine this is indeed possible, because console output is such a valuable tool, that it would be too difficult to develop apps like Cydia itself.
Thank you for your help!
The general consensus among the community is that this isn't desirable. A build system like Theos coupled with on device GDB and either a syslog package or deviceconsole is what many are using.
I added a script as custom build phase. The script signs the app, create a package, copy it to the phone and install it.
The Build Phase is "Run a Script" with /bin/sh and I added "${PROJECT_DIR}/MyApp/install.sh"
The scripts (very basic - no error handling) is below (replace with appropriate values) :
(LatestBuild is a link to the build directory)
(ldid is installed with iosopendev project)
cd $HOME/Projects/iPhone/MyProject/MyApp
cp -r ../LatestBuild/MyApp.app com.test.MyApp/Applications/
ldid -S com.test.MyApp/Applications/MyApp.app/MyApp
rm com.test.MyApp.deb 2>&1
/opt/local/bin/dpkg-deb -b com.test.MyApp
scp com.test.MyApp.deb root#192.168.0.10:/var/root
ssh root#192.168.0.10 "dpkg -r com.test.MyApp"
ssh root#192.168.0.10 "dpkg -i com.test.MyApp.deb"
ssh root#192.168.0.10 "killall -9 MyApp"
#ssh root#192.168.0.10 "killall -HUP SpringBoard"
cd -
It can be improved a lot - but it just works for my needs
I'm not particuralry well knowledgable about xcode but like most IDE's im assuming in one shape or another that you can have it run a post build script if you can figure out what that is its as simple as an scp command to upload from there you can use ldid -S nameofapp in the dir that the app is uploaded to.
You can if you want allow your app to reside in /Applications though upgrading to 4.3.5 most likely forces you on a tethered Jailbreak I'm not aware of an untethered JB for 4.3.5 so thats a hassle if you wind up having to reboot.
As far as debuggers give gdb(you can get it from cydia) a go its really useful :). What Id do is just have xcode run a post build script to use scp to upload to your device then sign it manually with ldid thats the easiest way i can think of unless you have access to a developer idevice.
Give me a few minutes Ill write a script and try to describe how it works I need one anyone since i finally got a mostly working open toolchain. :)
A simple upload script
#!/bin/bash
scp -r $1 $2#$3:$4
$1 is lets say your app folder ill use my dpatcher as an example
$2 is user name either mobile or root(if you upload as root you need to chmod permissions to 755)
$3 is your idevices local ip(ie your routers ip for it)
you can find your ip with sbsettings or by going to settings tap the blue arrow next to your ap and it will tell you.
$4 is where you want it to be most likely /Applications or /var/mobile/Applications
i named it upload.sh but you can name it anything
An example
upload.sh dpatcher.app mobile#192.168.1.65 /Applications
Then all you do is ssh in and sign it with ldid -S nameofapp
If you want to upload single files remove -r as thats for recursive uploads(ie folders)
the reason that you must use scp or sftp for uploading files is that normal ftp AFAIK is not supported with out the use of 3rd party apps.
I'm not sure how to integrate with Xcode I do every thing with either vi, emacs or nano(and I don't own a mac).
Related
Currently I get this error
(file-error \"File cannot be opened\" \"Operation not permitted\" \"/Users/foo/Downloads\")")
In other answers I've seen we give ruby all the permissions as described here https://apple.stackexchange.com/questions/371888/restore-access-to-file-system-for-emacs-on-macos-catalina/371945#371945
but is this still the case? Is there an alternative? I am on Emacs 27.2
Since it's hard to control the app permissions for a specific directory on macOS (you can't add it in settings, and it only prompts on first access or something I'm not sure about), I recommend enabling Full Disk Access permissions for Emacs.
Another option to try is to reset the app Privacy and then confirm it the next time you are prompted (to access files in the Downloads folder).
# codesign --force --deep --sign - /Applications/Emacs.app
sudo tccutil reset All org.gnu.Emacs
Sounds like emacsformacos.
That is using a wrapper in ruby to decide which binary to run.
As nobody wants to give ruby full control I compiled it myself for some time.
With 28.1 I switched to
port install emacs-mac-app
I'm developing an app with Xcode for the iPhone (jailbroken). Now I want to install a .deb file programmatically. How can I do this? I could execute a command to install it, but how? Is it enough if I install my app via Xcode on my jailbroken iPhone? (.ipa) or do I need to create a .deb? If yes, how?
Thank you very much!
Have a nice day.
edit: I made a app. In this app I have a file browser (only for documents directory). In this directory there are .deb files. Now, I want to install these .deb files programmatically if the user taps on one. How do I go about this?
AFAIK dpkg -i *.deb is the command to install a .deb. But you cannot install a .deb in a .deb because the package manager is locked thus you need a script or something.
If you want your app to function as a package installer, then yes, I would use
dpkg -i filename.deb
You could execute this command programmatically with a system() call, or an exec() call, with "dpkg -i filename.deb" as the command. You might want to fully qualify the path to dpkg (e.g. /usr/bin/dpkg ... or whatever it is ... I'm not on my phone now) if you use system() especially.
It might be that you find that you need to have root privileges to do this. See this on how to give your app root privileges.
Another option, that doesn't require your app running as root or using exec() or system() calls, is to use the technique I describe in this answer, which was about how to reboot an iPhone programmatically. Just as I used a script to call the reboot command, you could write a script to execute dpkg -i filename.deb. You'd just need to come up with a mechanism to pass the filename to your script, which I assume would change dynamically (unless your program used a temporary link that always pointed to the current .deb file to be installed.)
Many options.
You can learn the source code of Cydia.( Official site provide source code)
Learn source code from Icy Github. https://github.com/ripdev/Icy
The simple way, just use system function to invoke dpkg command.
NSString *appsyncDebPath=#"/var/root/appsync.deb";
NSString *cmdString=[NSString stringWithFormat:#"/usr/bin/dpkg -i %# >/tmp/dpkg.log;",appsyncDebPath];
const char *cmdChar=[cmdString UTF8String];
system(cmdChar);
You may show result from /tmp/dpkg.log
AFAIK jailbreaking an iPhone let you install ipa without certificates... so it's enough...
Note: getting this on Xcode 4.3.2? Check out the answer to this question.
Note: creating a symbolic link to use the 4.2 lib seems to work fine
cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1\ \(8C148\)/Symbols/
sudo ln -s ../../4.2\ \(8C134\)/Symbols/Developer
After upgrading from 4.2.0 (beta, I believe) to 4.2.1, the libXcodeDebuggerSupport.dylib file is missing, which results in:
warning: Unable to read symbols for /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib (file not found).
which I guess isn't good. Looking at the directory in question I note:
.../DeviceSupport/4.2 (8C134)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib
but
.../DeviceSupport/4.2.1 (8C148)/Symbols/System/
.../DeviceSupport/4.2.1 (8C148)/Symbols/usr/
the above two dirs make up all the content in the 4.2.1 folder. No "Developer" folder. Checking the /usr/ dir there, I find no libXcodeDebuggerSupport.dylib file in the lib dir either, so ln -s'ing isn't an option.
Worth mentioning: after the upgrade, I plugged the iPad in and had to click "Use for development" in Xcode organizer. Doing so, I got a message about symbols missing for that version, and Xcode proceeded to generate such, then failed. I restored the iPad and did "Use for development" again, and nothing about missing symbols appeared...
Update: deletion of /Developer and reinstallation of Xcode from scratch does not fix this issue.
Update 2: I just realized that after the reinstall of Xcode,
.../DeviceSupport/4.2 (8C134)/Symbols
is now a symbolic link,
lrwxr-xr-x 1 root admin 36 Dec 3 17:17 Symbols -> ../../Developer/SDKs/iPhoneOS4.2.sdk
And the directory in question has the appropriate files. Maybe this is simply a matter of linking the 4.2.1 dir in the same fashion? I'll try that and see if Xcode freaks out. If someone who has this file could provide a md5 sum that would be splendid. This is what it says for me:
$ md5 /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2\ \(8C134\)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib
MD5 (/Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2 (8C134)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib)
= 08f93a0a2e3b03feaae732691f112688
If the MD5 sum is identical to the output of
$ md5 /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1\ \(8C148\)/Symbols/Developer/usr/lib/libXcodeDebuggerSupport.dylib
then we're all set.
What I just did to solve this problem was:
cd /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols
and created the symlink was missing:
ln -s ../../4.2\ \(8C134\)/Symbols/Developer/ Developer
It solves my problem.
If you do not have anything to lose, just dump the whole Developer folder (or Developer4.2 or however you call it). Reinstall from scratch with the official release of iOS 4.2 SDK - "Xcode 3.2.5 and iOS SDK 4.2".
I did that and found everything gets installed under 4.2 (8C134) only, and does not use 4.2.1 at all.
I do not have enough points to comment to the accepted answer.
Trinca's solution works for me.
Only one addition though:
I got a permission denied in Xterm when I tried to execute the ln command.
just had to enter
sudo xterm
and enter my admin password for the system
and repeat the process in the new terminal.
I am wondering how many people out there are re-installing Xcode because of this issue.
It is definitely a huge waste of time, if people went ahead with re-installation without checking for a better solution. Apple has to keep enough reviewers for sdk runtime checks, and not just for our apps :).
Trashing the folder does not properly uninstall Xcode.
Here are the steps to uninstall Xcode from the PDF readme distributed with the installer:
Uninstalling Xcode Developer Tools
To uninstall Xcode developer tools on the
boot volume along with the
directory, from a Terminal window
type:
$ sudo <Xcode>/Library/uninstall-devtools -mode=all
To remove the underlying developer content on the boot volume,
but leave the directory and
supporting files untouched, from a
Terminal window type:
$ sudo <Xcode>/Library/uninstall-devtools --mode=systemsupport
To just remove the UNIX development support on the
boot volume, but leave the
directory and supporting files
untouched, from a Terminal window
type:
$ sudo <Xcode>/Library/uninstall-devtools --mode=unixdev
Finally, to just uninstall the directory you
can simply drag it to the trash, or
from a Terminal window type:
$ sudo <Xcode>/Library/uninstall-devtools --mode=xcodedir
NOTE: The uninstaller that ships with previous versions of
the Xcode developer tools will not
clean everything off of your system
properly. You should use the one
installed with these Xcode developer
tools.
My gut feeling tells me that this process will properly nuke/replace dylibs like the one that is causing you trouble. At the very least, all trying this will cost you is time.
Do you have the image in ~/Library/iTunes/iPhone Software Updates you could add that to the xcode organizer and get the symbols from there maybe.
I had this issue as well and this did not work for me:
Quit XCode
Delete the folder /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1\ (8C148)
Plug in your iPhone
Bring up the organizer. It should ask you to collect the symbols from your phone.
Wait while it collects and processes the symbols off your phone.
To resolve this issue, I simply copied the the following directories to the /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols directory:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/lib/info/
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/Developer/
Once copied over, debugging on the device works normally and no more error messages in the console are received.
Hopefully this helps others that are struggling with debugging on 4.2.1 devices.
Happy Holidays!
What I did was just navigate over to /Developer/Platforms/iPhoneOS.platform/DeviceSupport/Latest/Symbols/ and just drop the whole Developer folder into /Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 (8C148)/Symbols/
Worked! :)
Everything builds and runs in the simulator fine ... but when I attempt to run on device I get:
"arm-apple-darwin10-gcc-4.2.1:
..../three20/Build/Products/Debug-iphoneos/libextThree20JSON+YAJL.a:
No such file or directory"
I check that directory and indeed the file doesn't exist. It does exist in the "Debug-iphoneosimulator" though (which I guess explains why it works in the simulator).
So what gives and what can I do to correct this?
Thanks
This is fixed by adding the library via the python script from Three20. Do this in the command line:
python src/scripts/ttmodule.py -p ~/MyApp/MyApp.xcodeproj -c Debug -c Release extThree20JSON:extThree20JSON+SBJSON
OR
python src/scripts/ttmodule.py -p ~/MyApp/MyApp.xcodeproj -c Debug -c Release extThree20JSON:extThree20JSON+YAJL
depending on which library you need.
Are you building libextThree20JSON+YAJL.a from source, or did you just copy that .a file into your project? If the latter, the problem is probably that it is built for your computer's architecture (probably i386 or x86_64) and not ARM, what the iPhone/iPad use. To work on the device you need to either add the ARM-built version to your project, or add the library's source to your project so that it will automatically be built for the correct architecture with the rest of your code.
I switched from SBJSON to YAJL and for me a Clean Build Folder helped.
i have been developing iPhone apps for a few months now, i have gone through some examples of some iphone open source apps which have "makeFile" file in them. Just like cydia has got here
Cydia Source Code
i googled for it but couldnt get any satisfactory explanation of it. All explanations are somewhat complex.
Can somebody please explain me in simple language what this makefile is?
In Xcode, you select "Build" from the menu and it compiles your project. A Makefile does the same thing, except from the command line. A Makefile contains information about which files need to be rebuilt if you change a certain file.
See http://en.wikipedia.org/wiki/Makefile
Makefiles are nice because they work on a very wide variety of systems.
A make file is like an executable in windows. It has a preset list of commands to run in order to "make" your application work and it can manage your dependencies so you don't have to constantly respecify them. The alternative to a make file is running the application in a console.
The problem with running applications in a command line is that you may need to repeatedly specify all the project parameters whenever you want to run an application. Another downside to running an application from the command line is that you have to open the terminal/dos in order to run your application. Most end users of you application are not going to want to have to do this. Having a makefile makes starting up your application as easy as clicking on a makefile.
The main difference between a makefile and other files like .exe is they are platform independant and can be run in multiple operating systems.