特定の場所に入ったときに検出するアプリを作成しています。場所に到達すると、変更が検出され、ローカル通知が送信されます。通知を受け取って開くと、画面が切り替わるはずです。アプリは問題なく動作しているように見えましたが、テスターは、画面が決して切り替わらないと言っていました。問題を再現するために、私たちは彼の家に行き、彼は実演しました。私が気づいたのは、ホットスポットに入る前に、まずホームボタンを押してから電話をスリープ状態にすることです。複数のテストを行った結果、アプリを開いたままスマートフォンをスリープ状態にすると、画面が切り替わることが判明しました。最初にアプリを最小化してから電話をスリープ状態にすると、画面が切り替わることはありません。
通知でアプリを開くまで画面が切り替わらないはずです。このようなイベントを処理するデリゲート メソッドがある場合、またはなぜこれが発生する可能性があるのか 、違いは何ですか? 何か案は?
編集
-- 位置情報サービスに関連するコード --
これは、位置情報サービスに使用するシングルトン クラスです。
@implementation LocationManager
static LocationManager *locationManager;
+ (LocationManager *)locationManager {
if (locationManager == NULL) {
locationManager = [[LocationManager alloc] init];
}
return locationManager;
}
@end
これは、デリゲート メソッドを実際に実装するwelcomeviewcontrollerのコードです(長いので、重要な部分のみを投稿しています)
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
if ([self getAppState] == TRACKING_HOTSPOT) {
NSLog(@"\nLAT: %f\nLNG: %f", [self deviceLatitude], [self deviceLongitude]);
for (int j = 0; j < [MinX count]; j++) {
if ((([self deviceLatitude] > [MinX[j] floatValue] && [self deviceLatitude] < [MaxX[j] floatValue]) && ([self deviceLongitude] > [MinY[j] floatValue] && [self deviceLongitude] < [MaxY[j] floatValue]))) {
if ([self testCells: [CellId[j] intValue]]) {
[self.delegate setNum: [CellId[j] intValue]];
...
}
また、info.plist ファイルに適切なフラグを設定しました。それは私の最後のビルドに取り組んでいましたが、それ以来あまり変わっていません。なぜ機能しないのかわかりません。そして、それは特定の領域でのみ機能します。ホットスポットにあることを検出し、通知を送信してそこに行ったことを警告しますが、ビューコントローラーを切り替えると、ホームボタンを押して通知を受信する前に電話をスリープ状態にした場合にのみ機能しません。アプリを開いたままにするか、単にホームボタンを押すと、正しく切り替わります。プロセスを通じてXcodeのメモリとCPU管理を監視し、最小化してスリープ状態にするとメモリが床に落ちましたが、単にスリープ状態にしたときはそうではありませんでした。電話がスリープ状態であっても、電話が最小化されるまで「バックグラウンドで」と見なされない可能性があると思います。たぶん私は間違っています。
appdelegate では、フォアグラウンドに入ったかどうかをフラグで検出するように設定しました。しかし、何があっても、アプリが通知から開かれた場合、didreceivelocalnotification メソッドに制御を送信する必要がありますよね?