2014-10-24 3 views
6

Sto cercando di creare un'estensione di oggi (aka Widget) per la mia app iOS 7+ esistente. In iOS Simulator tutto funziona alla grande (il più delle volte), ma sui miei dispositivi il widget è vuoto: solo l'intestazione/nome viene mostrato ma nessun contenuto.Il widget di oggi non ha contenuto sul dispositivo iOS 8

Ho trovato diversi thread che trattano problemi simili ma erano tutti relativi ad alcuni problemi di init nelle app Swift. Sto usando Objectiv-c non Swift.

Questo è quello che ho fatto:

  1. Aggiunto un nuovo obiettivo Oggi Estensione a mio app. Anche lo schema corrispondente è stato creato automaticamente.
  2. Il problema si verifica anche quando viene utilizzato il Widget predefinito invariato. Ho solo aggiunto i metodi init per vedere se sono chiamati correttamente. Quindi il widget dovrebbe mostrare l'etichetta predefinita Hello World.

Questo è il codice:

@interface TodayViewController() <NCWidgetProviding> 

@end 

@implementation TodayViewController 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if (self) 
     NSLog(@"initWithCoder"); 
    return self; 
} 

- (id)init { 
    self = [super init]; 
    if (self) 
     NSLog(@"init"); 
    return self; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) 
     NSLog(@"initWithNibName"); 
    return self; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler { 
    // Perform any setup necessary in order to update the view. 

    // If an error is encountered, use NCUpdateResultFailed 
    // If there's no update required, use NCUpdateResultNoData 
    // If there's an update, use NCUpdateResultNewData 

    completionHandler(NCUpdateResultNewData); 
} 

@end 

Quando si seleziona lo schema di widget e in esecuzione nel simulatore il widget viene visualizzato correttamente dopo aver selezionato "Oggi" come contenitore. Inoltre, viene registrato initWithCoder.

Quando si esegue il dispositivo in un primo momento, tutto funziona come previsto: Le schermate Oggi vengono visualizzate e vengono visualizzati i widget. Anche il mio widget, ma senza alcun contenuto.

Poi Xcode mostra il seguente messaggio:

collegamento perso a "Device Test" - Ripristinare il collegamento a "Test Device" ed eseguire "com.example.MyApp.Widget" ancora una volta, o se "com.example.MyApp.Widget" è ancora in esecuzione, è possibile connettersi ad esso tramite selezionando Debug> Collega a Processo> com.example.MyApp.Widget.

Non viene registrato nulla, presumo che questo sia dovuto alla connessione persa. Ma perché il widget è vuoto?

Ho controllato i registri del dispositivo ma non ci sono arresti anomali. Il problema è lo stesso sul mio iPhone 6 (iOS 8.0) e iPad Air 2 (iOS 8.1)

Grazie mille!

+0

Per essere precisi, questo non è un problema con iOS 8 in generale, perché funziona su iPhone 4S bene. Il problema è con i dispositivi che contengono processori a 64 bit completi, significa 5S e più recenti e iPad Air e più recenti .. – Markus

risposta

4

Dopo un paio di giorni di ricerche ho finalmente trovato la soluzione:

Il mio progetto (l'applicazione che contiene del widget) e il widget di per sé non ha incluso l'architettura arm64.Come il Apple docs descrivere questo non è una configurazione valida:

Un app che contiene che si collega a un quadro integrato deve includere i arm64 (iOS) o x86_64 impostazione architettura configurazione (OS X) o sarà respinti dal l'App Store. (Come descritto in Creazione di un estensione App, tutte le estensioni app devono includere l'architettura impostazione di compilazione a 64 bit appropriato.)

Quando x64 manca l'applicazione non sarà respinta solo, ma impedisce anche il widget da mostrare in primo luogo.

Ho aggiunto il widget a progetti esistenti che non erano ancora configurati per x64 e sembra che le stesse impostazioni di build siano state applicate automaticamente al widget. E avrebbe evitato un sacco di lavoro se Xcode avrebbe mostrato alcun avvertimento o suggerimento su questo problema ...

ho fatto quanto segue per risolvere il problema:

  • Fare clic sulla voce progetto nel progetto Navigatore e seleziona il target delle app.
  • Scegliere la scheda Build Settings e andare alla sezione Architectures.
  • Impostare Architectures a Standard architectures (armv7, arm64)
  • Impostare Valid Architectures-armv7 armv7s armv8 arm64
  • Impostare Build Active Architectures Only a No
  • applicare le stesse impostazioni per il Widget di destinazione

Dopo questo il widget funziona correttamente sia nel simulatore e sul i miei dispositivi di prova.

0

aggiungere

self.preferredContentSize = CGSizeMake(320, 60); 

a

-(void)viewdidload{} 

in viewcontroller.m di estensione.

Questo metodo ha risolto il problema.

Spero che possa anche aiutarti.

+0

Ci scusiamo per il feedback ritardato. Nel mio caso questo non ha cambiato nulla in modo imprevisto. –