2012-11-12 17 views
5

Sto costruendo un'applicazione demone per un iPhone jailbroken e seguito le linee guida, come descritto in diverse domande e risposte qui su StackOverflow e naturalmente pagina web Chris Alvares' a http://chrisalvares.com/blog/38/creating-an-iphone-daemon-part-4/L'app iOS Daemon non verrà avviata (jailbreak) - come eseguire il debug?

Xcode e il progetto vengono modificati da Jailcoder per renderlo eseguire sul mio dispositivo.

Uno dei post qui ha dichiarato che al giorno d'oggi non è più necessario utilizzare il modello di toolchain aperto. Caricare l'app nella directory/Applications e aggiungere un file plist in/System/Library/LaunchDaemons dovrebbe essere sufficiente.

Ho eseguito i passaggi precedenti ma il daemon non è stato avviato, o almeno non è in esecuzione quando controllo. Nei registri del dispositivo che sono disponibili nell'organizer Xcode, il nome dell'app o il relativo ID del bundle non possono essere trovati da nessuna parte. Mi aspetterei almeno un errore con una ragione per cui non si avvierebbe.

Il contenuto del file plist copiati/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> 

Domanda: c'è un modo per eseguire il debug il motivo per cui non si avvia l'applicazione daemon? O forse ho perso un passaggio oltre a caricare l'app in/Applicazioni e ad aggiungere il file plist alla directory LaunchDaemon?

EDIT:

contenuto della mia routine principale:

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

errore all'avvio /Applications/NoUIDaemon.app/NoUIDaemon:

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

Si noti che l'applicazione funziona senza problemi quando lo eseguo sul mio dispositivo da Xcode.

Benche 'il demone non può essere avviato manualmente, le risposte alle domande di Nate:

1) Il file plist in LaunchDaemons sia intitolato dmn.NoUIDaemon.plist

2) Ho fatto l' 'errore' di dimenticando la parte .plist nel contenuto dell'etichetta, quindi l'ho provata con entrambi i valori, con e senza .plist alla fine, nessuna differenza di corso.

3) Ho ripartito il dispositivo dopo l'installazione sia l'applicazione e il file plist utilizzando il comando reboot

4) Ho fatto in modo che tutte le autorizzazioni sono gli stessi (0775)

5) cercherà questo quando il problema è stato risolto Bad CPU e ancora non funziona

montaggio finale:

per nascondere il proprio demone icona dell'applicazione sul trampolino, aggiungere il seguente alle informazioni .inseriscilo nel tuoapp:

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

Puoi accedere al tuo dispositivo come root tramite 'ssh', e basta eseguire il comando'/Applicazioni/NoUIDameon.app/NoUIDaemon' a riga di comando? Questo esegue correttamente il demone (controlla se è in esecuzione con 'ps -Aef | grep NoUIDaemon')? – Nate

risposta

6

Come ho detto nel mio commento, prima cercare di assicurarsi che il proprio eseguibile demone è eseguibile:

  1. login per il dispositivo come root, tramite ssh
  2. eseguire il comando /Applications/NoUIDameon.app/NoUIDaemon a la riga di comando
  3. di controllo per vedere se è in esecuzione con ps -Aef | grep NoUIDaemon

Se non è in esecuzione, vorrei controllare per assicurarsi che il processo di compilazione è falso codice di firma del file eseguibile NoUIDaemon. I telefoni jailbroken non richiedono la firma valida ma richiedono comunque una firma. Inoltre, se non viene eseguito (o rimanere in esecuzione), potrebbe aiutare per voi di pubblicare il codice dal programma principale del demone (ad es main.m):

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

Se questo funziona, ed è viene eseguito quando lo si avvia manualmente (ma non automaticamente), quindi controllare:

  1. è il file plist sopra citato dmn.NoUIDaemon.plist?
  2. Penso che questo sia in realtà un errore nel blog di Chris, ma il valore Label nel plist dovrebbe essere <string>dmn.NoUIDaemon</string>, non <string>dmn.NoUIDaemon.plist</string>. Non penso che questo possa impedire il funzionamento del tuo demone, penso che sia coerente con la convenzione di denominazione dei daemon di avvio del sistema.
  3. Non credo che l'installazione del file plist in /System/Library/LaunchDaemons sia sufficiente per avviare il daemon. Probabilmente è necessario riavviare il telefono o lanciare manualmente il daemon con launchctl load -w /System/Library/LaunchDaemons/dmn.NoUIDaemon.plist
  4. per verificare che le autorizzazioni e la proprietà del file di dmn.NoUIDaemon.plist siano uguali agli altri valori del daemon di avvio in /System/Library/LaunchDaemons.
  5. Non sono sicuro che sia necessario, ma penso che il nome del daemon (lo Label e il nome del file plist) corrisponda all'ID del bundle specificato nel file NoUIDaemon-Info.plist. Così, l'Info.plist dovrebbe avere:
<key>CFBundleExecutable</key> 
    <string>NoUIDaemon</string> 
    <key>CFBundleIdentifier</key> 
    <string>dmn.${PRODUCT_NAME:rfc1034identifier}</string> 

o

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

Aggiornamento:

Inoltre, non credo programma principale del vostro demone dovrebbe avere un chiamare allo UIApplicationMain. Non dovrebbe essere un'applicazione UIA. Dovrebbe essere un processo in background, giusto? Se si guarda on Page 1 of Chris's blog, viene mostrato un esempio. Ecco un esempio da uno dei miei:

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; 
} 

Inoltre, qui è una copia del file plist di mio demone (Info.plist), con il tuo nome daemon in esso:

<?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: Tipo di CPU non valido nell'eseguibile – Ronald

+0

Questo è l'errore che ottengo durante l'esecuzione tramite ssh. Il dispositivo è un iPod Touch 4G (credo che sia un dispositivo arm7) e il progetto è impostato su arm7 architecture. Quando eseguo l'app attraverso il debugger, funziona anche bene - mi aspetto che questo abbia esito negativo anche se il 'tipo di CPU è cattivo'. – Ronald

+0

aggiunto i contenuti della routine principale nella mia domanda iniziale – Ronald

Problemi correlati