【问题标题】:Strange Exception with GameCenterGameCenter 的奇怪异常
【发布时间】:2014-10-13 06:59:54
【问题描述】:

我不断从 GA 和用户那里收到此崩溃报告...但是我无法通过使用 ios7 和 ios8 测试 iphone5、5s、6 来重现此异常。当应用程序确实进入后台时,此问题无处可寻。奇怪的是,gamecenter 会调用 spritekit,用于显示成就横幅?

有人有同样的问题吗?

Last Exception Backtrace:
0   CoreFoundation                  0x23c99e3f __exceptionPreprocess + 127
1   libobjc.A.dylib                 0x31371c8b objc_exception_throw + 38
2   CoreFoundation                  0x23c9f189 -[NSObject(NSObject) doesNotRecognizeSelector:] + 188
3   CoreFoundation                  0x23c9d0a7 ___forwarding___ + 714
4   CoreFoundation                  0x23bcf208 _CF_forwarding_prep_0 + 24
5   SpriteKit                       0x26fe9689 -[SKNode isEqual:] + 164
6   Foundation                      0x248ec9ff +[NSObject(NSDelayedPerforming) cancelPreviousPerformRequestsWithTarget:] + 358
7   GameCenterFoundation            0x2a945873 -[GKPlayer postChangeNotification] + 38
8   GameCenterFoundation            0x2a958d21 __52-[GKDaemonProxy setLocalPlayer:authenticated:reply:]_block_invoke + 848
9   libdispatch.dylib               0x318d18cb _dispatch_call_block_and_release + 10
10  libdispatch.dylib               0x318d18b7 _dispatch_client_callout + 22
11  libdispatch.dylib               0x318d50bf _dispatch_main_queue_callback_4CF + 722
12  CoreFoundation                  0x23c5fbe9 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
13  CoreFoundation                  0x23c5e2e9 __CFRunLoopRun + 1512
14  CoreFoundation                  0x23bac621 CFRunLoopRunSpecific + 476
15  CoreFoundation                  0x23bac433 CFRunLoopRunInMode + 106
16  GraphicsServices                0x2af1b0a9 GSEventRunModal + 136
17  UIKit                           0x27197359 UIApplicationMain + 1440
18  MyAppName                       0x001b4f27 main (main.m:16)
19  libdyld.dylib                   0x318f1aaf start + 2

iOS8 GKLocalPlayerInternal Unrecognized Selector 上的类似崩溃问题

我尝试了一个使用 SKNode 和 GKPlayer 的测试

SKNode* node = [SKNode node];
GKPlayer* player = [GKLocalPlayer localPlayer];
[node isEqual:player];

会导致下面和上面结果一样的异常,意思是系统比较SKNode和[GKPlayer postChangeNotification]....真的很奇怪。

-[GKLocalPlayerInternal name]: unrecognized selector sent to instance 0x1b6e3f80

【问题讨论】:

    标签: ios8 sprite-kit game-center sknode


    【解决方案1】:

    我有类似的调用堆栈与 SKNode isEqual。这只发生在 IOS 8.1 上。经常崩溃,但在不同的情况下...... -[GADSlot 名称]:无法识别的选择器发送到实例

    我认为调用此方法时会触发整个事情。 +[NSObject(NSDelayedPerforming) cancelPreviousPerformRequestsWithTarget:]

    我无法解释为什么这会调用 [SKNode isEqual](也许有一些事情要取消),但对我来说它会导致崩溃。 我围绕这个问题进行了更多调查,结果发现我的 SKScene isEqual 被调用。 SKScene isEqual: 方法未正确实现(我向苹果报告了一个错误)。 SKSpriteNode 对于我没有尝试过的其他 SKNode 也有同样的问题,但很可能有同样的问题。

    在我的例子中,我将此修复添加到我的子类 SKScene 对象中。当然它不会全局修复所有 SKNode isEqual,但解决了我的问题。

       - (BOOL)isEqual:(id)other {
    
            if (![other isMemberOfClass:[SKScene class]]) {
                return false;
            }
            return [super isEqual:other];
        } 
    

    【讨论】:

    • 你真的用这个答案救了我,我一直在寻找这个问题的解决方案。非常感谢!
    • 非常感谢!!!!在我的所有 SKScene 子类中重写 isEqual 完全解决了可怕的“[GKLocalPlayerInternal name]:无法识别的选择器”错误。
    • 不客气,伙计们!往前走一点,我还注​​意到 SKSpriteNode 也有同样的问题,没有尝试过,但我认为 SKNode 有问题。所以它可能会覆盖 SKScene isEquals 作品,但请密切关注并进行密集测试。如果可能的话,对于 SKNode 子类(如果您可以控制它)也可能值得覆盖。特别是我必须在我的一个 SKSpriteNode 子类中覆盖我正在使用 [self performSelector:@selector(..).
    【解决方案2】:

    如果如您所说,您可以通过简单地将 SKNode 与任何 GKLocalPlayer 进行比较来复制崩溃,那么看起来 这是 SpriteKit 中的一个错误,因为对任何对象执行相等检查都不应该导致崩溃。

    如果您有足够的精力,您可以将应用程序中的所有 SKNode 子类化并自己实现 isEqualhash 方法。这应该避免对未实现该选择器的对象进行错误的名称比较检查。

    我还建议您将此作为错误报告给 Apple。

    This question 似乎表明 Apple 确实在 iOS8 中更新了 SKNode 相等和散列方法,因此该错误很可能是由该更改引起的。

    【讨论】:

    • SpriteKit 在 iOS 8 中仍然存在极大的漏洞,自从第一个 beta 版本发布以来......
    【解决方案3】:

    Swift 中的子类:

    import SpriteKit
    
    class Scene: SKScene {
    
        override func isEqual(object: AnyObject?) -> Bool {
            if object?.isKindOfClass(SKScene) == false {
                return false
            }
    
            return super.isEqual(object)
        }
    }
    

    申请:

    class YourScene: Scene {
        // your code
    }
    

    【讨论】:

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