8

このアプリのマイナーなアップデートがリリースされました。このバージョンでは、アップルのサポートにより、アプリIDがユニークIDからチームIDに変更されました。iOS UILocalNotificationのアクションボタンがクラッシュして、アプリケーションデータが破損する

According to AppleチームIDの使用に変更すると、キーチェーンへのアクセスがリセットされるだけで、キーチェーンは使用されないため、アプリには影響しません。

しかし、更新がリリースされてから本物のユーザーのさんがアプリデータの破損を経験しています。これは、通知センターまたはロック画面からのアクションボタンを使用してローカル通知に応答する場合にのみ発生します。サポートされているすべてのiOSバージョンで発生する可能性があります。

これを経験しているユーザーには別の症状がありますが、1つではなく2つのローカル通知を受信しますが、通知は1つしか表示されません。さらに、これらの通知は、[[UIApplication sharedApplication] cancelAllLocalNotifications]を使用して通知とキャンセルを無効にした後には消えません。

これらの重複した通知は、App Storeからアプリがアップデートされる前にスケジュールされていましたが、アップデート後に一部のユーザのコントロールが失われました。この問題は詳細in this questionで説明されています。最大の手掛かりは、クラッシュレポートに横たわっていたかもしれ

は、Appleから受け取った -

Incident Identifier: ED0E9C.............74B38C 
CrashReporter Key: ae05b............dbc46 
Hardware Model:  iPhone4,1 
Process:    MY_APP [444] 
Path:    /private/var/mobile/Containers/Bundle/Application/65324..................8616/MY_APP.app/MY_APP 
Identifier:   com.mycompany.myapp 
Version:    X.X 
Code Type:   ARM (Native) 
Parent Process:  launchd [1] 

Date/Time:   2015-10-27 21:45:24.24 -0500 
Launch Time:   2015-10-27 21:45:20.20 -0500 
OS Version:   iOS 9.1 (13B143) 
Report Version:  104 

Exception Type: EXC_CRASH (SIGABRT) 
Exception Codes: 0x0000000000000000, 0x0000000000000000 
Exception Note: EXC_CORPSE_NOTIFY 
Triggered by Thread: 0 

Last Exception Backtrace: 
0 CoreFoundation     0x244b3676 __exceptionPreprocess + 122 (NSException.m:162) 
1 libobjc.A.dylib     0x3582ee12 objc_exception_throw + 34 (objc-exception.mm:531) 
2 CoreFoundation     0x244b354c +[NSException raise:format:arguments:] + 100 (NSException.m:131) 
3 Foundation      0x25240bc4 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 88 (NSException.m:152) 
4 UIKit       0x28840754 -[UIApplication _runWithMainScene:transitionContext:completion:] + 2928 (UIApplication.m:3299) 
5 UIKit       0x28853a48 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke3218 + 32 (UIApplication.m:11920) 
6 UIKit       0x2883d71e -[UIApplication workspaceDidEndTransaction:] + 130 (UIApplication.m:2648) 
7 FrontBoardServices    0x2c52dca2 -[FBSSerialQueue _performNext] + 226 (FBSSerialQueue.m:157) 
8 FrontBoardServices    0x2c52df94 -[FBSSerialQueue _performNextFromRunLoopSource] + 44 (FBSSerialQueue.m:204) 
9 CoreFoundation     0x24476bfa __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 10 (CFRunLoop.c:1761) 
10 CoreFoundation     0x244767e8 __CFRunLoopDoSources0 + 448 (CFRunLoop.c:1807) 
11 CoreFoundation     0x24474b56 __CFRunLoopRun + 790 (CFRunLoop.c:2536) 
12 CoreFoundation     0x243c8114 CFRunLoopRunSpecific + 516 (CFRunLoop.c:2814) 
13 CoreFoundation     0x243c7f00 CFRunLoopRunInMode + 104 (CFRunLoop.c:2844) 
14 UIKit       0x28610208 -[UIApplication _run] + 520 (UIApplication.m:2489) 
15 UIKit       0x2860af10 UIApplicationMain + 140 (UIApplication.m:3665) 
16 MY_APP       0xc4972 main + 22 (main.m:14) 
17 libdyld.dylib     0x35f9d86e tlv_get_addr + 42 (threadLocalHelpers.s:310) 

それは、ユーザーがプッシュ通知に応答するときに発生this questionと全く同じスタックトレースを、持っています。アプリの読み込み中にクラッシュすると、破損したアプリのデータが説明される可能性があります。

スタックトレースに見られるように、このクラッシュはコードによって引き起こされたものではなく、コード内で何も変更されていません.App IDが変更される前にうまく機能していました。このクラッシュの原因は何

- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forLocalNotification:(UILocalNotification *)notification completionHandler:(void (^)())completionHandler { 

    @try { 
     if (notification) { 
      NSDate *alarmTime = notification.userInfo ? [notification.userInfo objectForKey:@"time"] : nil; 
      [logic saveAlarmTime:alarmTime takenAt:[NSDate date]]; 
     } 
    } 
    @catch (NSException *exception) { 
     NSLog(@"Exception: %@", [exception description]); 
    } 
    @finally { 
     completionHandler(); 
    } 
} 

-

ここでは、通知のアクションボタンを処理するコードですか?

(私はそれが-[UIApplication _runWithMainScene:transitionContext:completion:] + 2928 (UIApplication.m:3299)でスローだことを知って、問題はこれがクラッシュする原因となるそこには何がある。)

+0

よい[この質問](http://stackoverflow.com/questions/30884896/application-windows-are-expected-to-have-a-root -view-controller-a-the-end-of-a)は役に立ちますか?あなたの質問と同じクラッシュのスタックトレースがあります。プッシュ通知によってアプリを開いた後、あなたのアプリがいくつかのView Controllerにユーザを転送する可能性はありますか?このコントローラを開くには、 '[window setRootViewController:viewController]の代わりに' [window addSubview:viewController.view] ; '?これは2つの通知の問題を解決するものではありませんが、Xcode 7のバグ/アップデートの両方である可能性があります。 – medvedNick

+0

ちょっとした提案です。すべてのObserverに通知をチェックします。これらのObserverオブジェクトの 'dealloc'で' removeObserver: 'を呼び出すために。そして、http://stackoverflow.com/questions/26371462/weird-crash-when-launching-app-from-notification-center – anhtu

+0

@anhtuこれは通知のこの種類ではない、私たちはローカル通知について話している、オブザーバーは使用されていないそのことについては。 – Kof

答えて

4

この例外は、最初にアクションボタンによる通知への応答に関連していない可能性があります。このスタックトレースは、アプリの読み込み中に問題が発生したことを示していますが、いくつかの原因が考えられます。読み込み中にアプリがクラッシュすると、その原因になります。

たとえば、アプリケーションが読み込まれ、そのウィンドウにルートビューコントローラーが割り当てられていない場合に発生することがあります。 setRootViewControllerの代わりにaddSubviewを使用して追加された場合は、hereと表示されます。

このクラッシュを経験したユーザー、実際にはローカル通知アクションボタンにしか応答しなかったユーザー、またはアプリを開くときにクラッシュしたことがあるユーザーを確認する必要があります。

-1

この行は、クラッシュが発生します。

[UIApplication _runWithMainScene:transitionContext:completion:] + 2928 (UIApplication.m:3299) 

アプリのためのチームが変更された場合そのアプリの一意のアプリ識別子も変更されます。ローカル通知では、固有のアプリ識別子が使用されます。 iOSはこれ以上対応するアプリがないという通知を認識する必要があるので、基本的にAppleのバグです。それはあなたが立ち上げられてからもあなたのクラッシュではありますが、あなたは普通に働くオブジェクトを手に入れません。

私はあなたのコードを知らないので、ブラインドは推測します。ローカルの通知に応答するときは、オブジェクトと関連するすべてのデータが存在するかどうかをチェックしてから続行します。あなたは、のようなものを知っている:(私見例外より良い方法...)

if (object) { 
    //do the stuff 
} else { 
    // do nothing 
} 

もはやあなたに属し通知については

を - ユーザーがそれら自体を削除することができます。ただクラッシュしないようにしてください。何もしなくても大丈夫です。通常、pplはある時点で自分自身を削除し、通知センターをクリーンアップします。

+1

これは基本的に元の質問の結論を繰り返しますが、他の部分については、それがどのように関連しているかはわかりません。 ''基本的にアップルのバグだ。何に基づいているのだろう? – Kof

+0

私は接続していないと思う。 1)それはチームにされていないアプリの通知があるので、リンゴのバグです。 2)Isはどこかでnilを処理しないので、あなたのコードのバグです。なぜあなたはアサーションが飛び跳ねるのを見るのですか?あなたは何かがあることをあなたのコードに頼っていますが、そうではありません。おそらくあなたのアプリに属しているが、あなたのチームには属していない通知です。 –

+0

いいえ、すべてのオブジェクトが使用される前にnilでチェックされています。それはアプリケーションのコードにも達していない、 '0xc4972 main + 22(main.m:14)'は自分のコードではなく、アプリケーションを実行するiOSのクラスである 'UIApplicationMain'を起動するだけで、私のアプリのコードに到達する前に。 – Kof

0

データ破損の原因は、"データ保護"オプションです。これは、Xcode、またはiOS開発者ポータルから、識別子 - >アプリケーションIDの下で有効にすることができます。 「まずユーザー認証までは保護された」「完全保護」、「開かない限り保護された」と:

Xcode data protection option

それは3つの状態があります。データが保護されている限り、アプリでさえデータにアクセスすることはできません。例えば

iOS Developer Portal

「完全な保護は、」私たちの場合のように選択し、通知のアクションボタンのようなバックグラウンドプロセスが実行されている場合、Core Dataはアクセスに許可エラーが原因のデータベースを持っていません。

なぜデータが壊れているのかまだ分かりませんが、「権限が定義されました」というエラーが表示されないことがありますが、それでもSQLiteファイルの読み込みに失敗することがあります。ファイルにも書かれているかもしれませんが、暗号化がONだったのでファイルが破損していました。

解決策は、「保護されるまでの最初のユーザー認証」を選択するか、データ保護を無効にすることです。

関連SO質問:CoreData errors/exceptions when app work in background mode

Apple's iOS Security PDF

関連する問題