3

该问题出现在 iOS 6 上。要重现它,您需要使用日语(假名)键盘输入文本,并在出现建议时按“锁定”按钮。解锁后,用户在应用程序仪表板而不是应用程序上。如果按下应用程序图标,它会再次加载 - 按下锁定时应用程序崩溃。即使对于像 Notes 这样的苹果应用程序也是如此

崩溃日志:

Application Specific Information:
YOUR_APP was suspended with locked system files: 
/private/var/mobile/Library/Keyboard/PhraseLearning_ja_JP.db/sqlite.db
/private/var/mobile/Library/Keyboard/BigramLearning_ja_JP.db/sqlite.db

似乎 iOS 试图将用户的选择保存在 db 中以使建议更智能,但是当它无法写入时它会写入 db。

我已经向 Apple 发布了错误,但没有人知道他们何时修复它

你可以对使用你的应用程序的人说这是 Apple 的问题——你需要解决它。我尝试在 applicationWillResignActive 上隐藏键盘并在应用程序加载时显示它,但它并没有太大帮助。有什么建议么?

更新。我希望他们能在 6.0.1 中修复它,但不幸的是没有 :-(

4

2 回答 2

2

使用“任务完成”延迟进入后台。
在额外时间(10 分钟)内隐藏键盘。这是解决方法。

例子:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Acquired additional time
    UIDevice *device = [UIDevice currentDevice];
    BOOL backgroundSupported = NO;
    if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {
        backgroundSupported = device.multitaskingSupported;
    }

    if (backgroundSupported) {
        backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{
            [application endBackgroundTask:backgroundTask];
            backgroundTask = UIBackgroundTaskInvalid;
        }];
    }

    // Hide keyboard 
    [self.textField resignFirstResponder];
}
于 2012-10-10T07:02:03.530 回答
0

扩展其他答案及其评论,我发现这对我有用。它的优点是您不需要知道哪个文本字段处于活动状态:

if ([[[UIDevice currentDevice] systemVersion] compare:@"6.0" options:NSNumericSearch] != NSOrderedAscending) {
    if (backgroundTask != UIBackgroundTaskInvalid)
        [application endBackgroundTask:backgroundTask];

    backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{
        [application endBackgroundTask:backgroundTask];
        backgroundTask = UIBackgroundTaskInvalid;
    }];
}
于 2013-01-22T04:47:39.323 回答