2014-10-24 23 views
6

Próbuję utworzyć rozszerzenie Today (inaczej Widget) dla mojej istniejącej aplikacji iOS 7+. W Symulatorze iOS wszystko działa dobrze (przez większość czasu), ale na moich urządzeniach widżet jest pusty - pokazywany jest tylko nagłówek/nazwa, ale bez zawartości.Dzisiejszy widget nie zawiera żadnych treści na urządzeniu z iOS 8

Znalazłem kilka wątków dotyczących podobnych problemów, ale wszystkie były związane z niektórymi problemami z init w aplikacjach Swift. Używam Objectiv-c Not Swift.

To co zrobiłem:

  1. dodał nowy cel Dziś Rozszerzenie do mojej aplikacji. Odpowiedni schemat również został utworzony automatycznie.
  2. Problem występuje również, gdy używany jest niezmieniony domyślny widget. Dodałem tylko metody init, aby sprawdzić, czy są one poprawnie wywoływane. Widżet powinien więc pokazywać domyślną etykietę Hello World.

Jest to kod:

@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 

Przy wyborze schematu widget i uruchomienie go w symulatorze widget jest prawidłowo wyświetlany po wybraniu „Today” jako pojemnika. Dodatkowo zalogowany jest initWithCoder.

Podczas pierwszego uruchomienia urządzenia wszystko działa zgodnie z oczekiwaniami: Wyświetlane są ekrany Today (Dzisiaj) i widżety są wyświetlane. Mój widget również, ale bez żadnych treści.

Następnie Xcode pokazuje następujący komunikat:

Utracono połączenie z "Device Test" - przywracanie połączenia do "Test Device" i uruchom ponownie "com.example.MyApp.Widget", lub jeśli "com.example.MyApp.Widget" nadal działa, możesz dołączyć do niego przez wybierając Debug> Dołącz do procesu> com.example.MyApp.Widget.

Nic nie jest rejestrowane, zakładam, że jest to spowodowane utraconym połączeniem. Ale dlaczego widget jest pusty?

Sprawdziłem logi urządzeń, ale nie było awarii. Problem jest taki sam na moim iPhone 6 (iOS 8.0) i iPad Air 2 (iOS 8.1)

Dziękuję bardzo!

+0

Mówiąc dokładniej, nie jest to problem z systemem iOS 8 w ogóle, ponieważ działa poprawnie na telefonie iPhone 4S. Problem dotyczy urządzeń zawierających pełne procesory 64-bitowe, to znaczy 5S i nowsze oraz iPad Air i nowsze .. – Markus

Odpowiedz

4

Po kilku dniach poszukiwań w końcu znalazłem rozwiązanie:

Mój projekt (zawierający app widget) i sam widget nie zawiera architekturę arm64.Jako Apple docs opisać to nie jest ważne konfiguracja:

A zawierającym aplikacja, która łączy się osadzonym ram musi zawierać arm64 (iOS) lub x86_64 (OS X) tworzenie architektury budować czy będzie to odrzucone przez App Store. (Jak to opisano w Tworzenie rozszerzenia aplikacji, wszystkie rozszerzenia aplikacji musi zawierać odpowiedni 64-bitowa architektura ustawienia kompilacji.)

Kiedy x64 brakuje aplikacji nie zostaną odrzucone tylko, ale również zapobiega widget z pokazując w pierwszej kolejności.

Dodałem widżet do istniejących projektów, które nie zostały jeszcze skonfigurowane dla x64 i wygląda na to, że te same ustawienia kompilacji zostały zastosowane do widgetu automatycznie. Byłoby unikać dużo pracy, jeśli Xcode będzie wykazały żadnego ostrzeżenia lub wskazówkę na temat tego problemu ...

zrobiłem następujące czynności, aby rozwiązać ten problem:

  • Kliknij na wejściu projektu w Projekcie Nawigator i wybierz cel aplikacji.
  • Wybierz kartę Build Settings i przejdź do sekcji Architectures.
  • Ustaw Architectures do Standard architectures (armv7, arm64)
  • Ustaw Valid Architectures do armv7 armv7s armv8 arm64
  • Ustaw Build Active Architectures Only do No
  • zastosować te same ustawienia do widgetu Cel

Po tym widżet działa poprawnie zarówno w symulatorze i na moje urządzenia testujące.

0

dodać

self.preferredContentSize = CGSizeMake(320, 60); 

do

-(void)viewdidload{} 

w viewcontroller.m przedłużenia.

Ta metoda rozwiązała mój problem.

Mam nadzieję, że może również pomóc u.

+0

Przepraszamy za opóźnioną informację zwrotną. Niestety w moim przypadku nic nie zmieniło. –