【问题标题】:Application crash on Lock when Japanese keyboard used使用日文键盘时锁定应用程序崩溃
【发布时间】:2012-10-04 15:27:57
【问题描述】:

问题出现在 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 中修复它,但不幸的是没有 :-(

【问题讨论】:

  • IOS6.1好像已经修复了这个问题,不知道是哪个版本修复的? 6.02? 6.03?有详细资料吗??非常感谢。

标签: iphone objective-c ios6


【解决方案1】:

使用“任务完成”延迟进入后台。
在额外时间(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];
}

【讨论】:

  • 我认为需要更多代码。如果 Back -> Fore -> Back in 10 分钟(两次以上...),则创建了 n 次 backgroundTasks。并且“backgroundTask = [application beginBackgroundTa ...”导致泄漏以前的backgroundTask。所以。在调用 "backgroundTask = [application beginBackgroundTa..." 之前检查 "backgroundTask != UIBackgroundTaskInvalid" 并调用 endBackgroundTask: 。怎么样?
  • 即使没有 resignFirstResponder,这似乎也有效!您需要做的就是开始后台任务。
【解决方案2】:

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

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

    backgroundTask = [application beginBackgroundTaskWithExpirationHandler:^{
        [application endBackgroundTask:backgroundTask];
        backgroundTask = UIBackgroundTaskInvalid;
    }];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多