既存の iOS 7 以降のアプリ用に Today 拡張機能 (別名ウィジェット) を作成しようとしています。iOS シミュレーターでは (ほとんどの場合) すべて正常に動作しますが、私のデバイスではウィジェットは空です - ヘッダー/名前のみが表示され、コンテンツは表示されません。
同様の問題を扱っているスレッドがいくつか見つかりましたが、それらはすべて Swift アプリの初期化の問題に関連していました。SwiftではなくObjectiv-cを使用しています。
これは私がしたことです:
- アプリに新しい Today Extension ターゲットを追加しました。対応するスキームも自動的に作成されました。
- この問題は、変更されていないデフォルトのウィジェットが使用されている場合にも発生します。init-methods のみを追加して、それらが適切に呼び出されるかどうかを確認しました。したがって、ウィジェットはデフォルトの
Hello World
ラベルを表示する必要があります。
これはコードです:
@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
ウィジェット スキームを選択してシミュレーターで実行すると、コンテナーとして「今日」を選択すると、ウィジェットが正しく表示されます。さらにinitWithCoder
ログに記録されます。
最初にデバイスで実行すると、すべてが期待どおりに機能します。Today Screens が起動し、ウィジェットが表示されます。私のウィジェットも同様ですが、コンテンツはありません。
次に、Xcode は次のメッセージを表示します。
"Test Device" への接続が失われた - "Test Device" への接続を復元し、"com.example.MyApp.Widget" を再度実行するか、"com.example.MyApp.Widget" がまだ実行されている場合は、 [デバッグ] > [プロセスにアタッチ] > [com.example.MyApp.Widget] を選択します。
何もログに記録されません。これは、接続が失われたためだと思います。しかし、なぜウィジェットが空なのですか?
デバイスのログを調べましたが、クラッシュはありません。問題は、iPhone 6 (iOS 8.0) と iPad Air 2 (iOS 8.1) でも同じです。
どうもありがとうございました!