2012-11-12 12 views
5

Buduję aplikację demona dla jailbreak iPhone i następnie wytyczne, jak to opisano w kilku pytań i odpowiedzi tutaj na stackoverflow i oczywiście strony Chrisa Alvaresa na http://chrisalvares.com/blog/38/creating-an-iphone-daemon-part-4/Demon aplikacji iOS nie uruchamia się (Jailbreak) - jak debugować?

Xcode i projekt są poprawione przez Jailcoder aby go uruchom na moim urządzeniu.

Jeden z zamieszczonych tu postów stwierdził, że w dzisiejszych czasach nie jest już konieczne korzystanie z otwartego szablonu toolchain. Załadowanie aplikacji do katalogu/Applications i dodanie pliku plist do/System/Library/LaunchDaemons powinno wystarczyć.

Wykonałem powyższe kroki, ale demon nie został uruchomiony, a przynajmniej nie działa, gdy sprawdzam. W dziennikach urządzeń dostępnych w organizatorze Xcode nie można znaleźć nazwy aplikacji ani jej identyfikatora pakietu. Spodziewałbym się przynajmniej błędu z powodu, dlaczego się nie rozpocznie.

Zawartość pliku plist skopiowany do/System/Library/LaunchDaemons:

<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
    <plist version="1.0"> 
    <dict> 
     <key>Disabled</key> 
     <false/> 
     <key>Label</key> 
     <string>dmn.NoUIDaemon.plist</string> 
     <key>OnDemand</key> 
     <false/> 
     <key>ProgramArguments</key> 
     <array> 
      <string>/Applications/NoUIDaemon.app/NoUIDaemon</string> 
      <string></string> 
      <string></string> 
     </array> 
     <key>StandardErrorPath</key> 
     <string>/dev/null</string> 
    </dict> 
    </plist> 

Pytanie: czy istnieje sposób do debugowania, dlaczego nie rozpocznie aplikację demona? Czy może przegapiłem krok poza przesłaniem aplikacji do/Applications i dodaniem pliku plist do katalogu LaunchDaemons?

EDIT:

Zawartość mojej głównej procedury:

int main(int argc, char *argv[]) 
{ 
    @autoreleasepool { 
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
    } 
} 

błąd przy uruchamianiu /Applications/NoUIDaemon.app/NoUIDaemon:

R-iPod:/ root# /Applications/NoUIDaemon.app/NoUIDaemon 
-sh: /Applications/NoUIDaemon.app/NoUIDaemon: Bad CPU type in executable 

Należy pamiętać, że aplikacja działa bez problemu, gdy uruchomię go na moim urządzeniu z Xcode.

Eventhough demon nie może zostać uruchomiony ręcznie, odpowiedzi na pytania: Nate'a

1) Plik plist w LaunchDaemons rzeczywiście nazwany dmn.NoUIDaemon.plist

2) Popełniłem błąd „” z zapominając o zawartości .plist w zawartości Label, więc wypróbowałem ją z obydwoma wartościami, zi bez .plist na końcu, bez różnicy.

3) Mam ponownym uruchomieniu urządzenia po zainstalowaniu zarówno aplikację i plik plist używając polecenia restart

4) Zrobiłem się, że wszystkie są takie same uprawnienia (0775)

5) spróbuje ten problem, gdy zły procesor został rozwiązany i nadal nie działa

FINAL EDIT:

aby ukryć ikonę aplikacji Daemon na trampolinę, należy dodać następujące do informacji .plist w twoim.Aplikacja:

<key>SBAppTags</key> 
<array> 
    <string>hidden</string> 
</array> 
+0

Możesz zalogować się na urządzeniu jako root poprzez 'ssh', i po prostu wykonać polecenie'/Programy/NoUIDameon.app/NoUIDaemon' w wierszu polecenia? Czy to skutecznie uruchamia twojego demona (sprawdź, czy działa z 'ps -Aef | grep NoUIDaemon')? – Nate

Odpowiedz

6

Jak powiedziałem w moim komentarzu, spróbuj najpierw upewnić się, że demon wykonywalny jest runnable:

  1. logowania do urządzenia jako root poprzez ssh
  2. wykonać polecenie /Applications/NoUIDameon.app/NoUIDaemon na z linii poleceń:
  3. sprawdź, czy działa z adresem: ps -Aef | grep NoUIDaemon

Jeśli nie działa, sprawdziłbym, aby upewnić się, że proces budowania jest fałszywy podpisywanie kodu pliku NoUIDaemon. Telefony z telefonami komórkowymi nie wymagają podpisu ważnego, ale nadal wymagają podpisu. Ponadto, jeśli to nie działa (lub zatrzymać bieg), to może pomóc, aby opublikować kod z programu głównego demona (np main.m):

int main(int argc, char *argv[]) { 
    // what's in here? 
} 

Jeśli to działa, i to biegnie kiedy go uruchomić ręcznie (ale nie automatycznie), a następnie sprawdzić:

  1. jest plik plist wyżej wymieniony dmn.NoUIDaemon.plist?
  2. Myślę, że jest to błąd na blogu Chrisa, ale wartość Label w twoim pliście powinna wynosić <string>dmn.NoUIDaemon</string>, a nie <string>dmn.NoUIDaemon.plist</string>. Nie sądzę, aby to uniemożliwiło działanie twojego demona, ale uważam, że jest to zgodne z konwencją nazewnictwa demonów uruchamiania systemu.
  3. Nie sądzę, że wystarczy zainstalować plik plist w /System/Library/LaunchDaemons wystarczy, aby uruchomić demona. Prawdopodobnie musisz albo ponownie uruchomić telefon, albo ręcznie uruchomić demona za pomocą launchctl load -w /System/Library/LaunchDaemons/dmn.NoUIDaemon.plist
  4. , aby upewnić się, że uprawnienia do pliku i prawa własności do pliku dmn.NoUIDaemon.plist są takie same, jak w przypadku innych plistów demonów uruchamiania w /System/Library/LaunchDaemons.
  5. Nie jestem pewien, czy jest to konieczne, ale myślę, że nazwa demona (Label i nazwa pliku plist) ma odpowiadać identyfikatorowi pakunku podanemu w pliku NoUIDaemon-Info.plist. Tak, Info.plist powinien mieć:
<key>CFBundleExecutable</key> 
    <string>NoUIDaemon</string> 
    <key>CFBundleIdentifier</key> 
    <string>dmn.${PRODUCT_NAME:rfc1034identifier}</string> 

lub

<key>CFBundleExecutable</key> 
    <string>NoUIDaemon</string> 
    <key>CFBundleIdentifier</key> 
    <string>dmn.NoUIDaemon</string> 

Aktualizacja:

Również nie sądzę, główny program demon powinien mieć zadzwoń pod numer UIApplicationMain. To nie powinno być UJAWNIENIE. To powinien być proces w tle, prawda? Jeśli spojrzysz na on Page 1 of Chris's blog, pokaże przykład. Oto przykład z jednego z moich:

int main(int argc, char *argv[]) { 
    @autoreleasepool { 
     SignalMonitor* daemon = [[SignalMonitor alloc] init]; 

     // start a timer so that the process does not exit. 
     NSTimer* timer = [[NSTimer alloc] initWithFireDate: [NSDate date] 
               interval: 1.0 
                target: daemon 
               selector: @selector(setup:) 
               userInfo: nil 
               repeats: NO]; 

     NSRunLoop* runLoop = [NSRunLoop currentRunLoop]; 
     [runLoop addTimer: timer forMode: NSDefaultRunLoopMode]; 
     [runLoop run]; 
    } 

    return 0; 
} 

Ponadto, oto kopia pliku plist mojego daemona (Info.plist), z nazwą demona w nim:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
     <key>CFBundleDevelopmentRegion</key> 
     <string>English</string> 
     <key>CFBundleExecutable</key> 
     <string>NoUIDaemon</string> 
     <key>CFBundleIdentifier</key> 
     <string>dmn.NoUIDaemon</string> 
     <key>CFBundleInfoDictionaryVersion</key> 
     <string>6.0</string> 
     <key>CFBundleName</key> 
     <string>${PRODUCT_NAME}</string> 
     <key>CFBundlePackageType</key> 
     <string>APPL</string> 
     <key>CFBundleShortVersionString</key> 
     <string>1.0</string> 
     <key>CFBundleSignature</key> 
     <string>????</string> 
     <key>CFBundleVersion</key> 
     <string>1.0-0</string> 
     <key>LSRequiresIPhoneOS</key> 
     <true/> 
     <key>LSApplicationCategoryType</key> 
     <string></string> 
</dict> 
</plist> 
+0

R-iPod:/root # /Applications/NoUIDaemon.app/NoUIDaemon -sh: /Applications/NoUIDaemon.app/NoUIDaemon: Zły typ CPU w pliku wykonywalnym – Ronald

+0

To jest błąd, który pojawia się podczas wykonywania przez ssh. Urządzenie to iPod Touch 4G (uważam, że to urządzenie arm7), a projekt jest ustawiony na architekturę arm7. Kiedy uruchamiam aplikację za pomocą debuggera, działa to również dobrze - spodziewałbym się, że to się nie powiedzie, jeśli "typ procesora jest zły". – Ronald

+0

dodano treść głównej procedury w moim oryginalnym pytaniu – Ronald

Powiązane problemy