-1

I'm beginner in Objective-C, I'm struggling with this code that running in iOS 7.1 but crash in iOS 8.

How I can know where is problem from stack trace?

And why a code works in older version (iOS 7) and not work in newer version?

Is that a problem with using incorrect of NSMutableDictionary or NSArray?

- (NSDictionary*) MPNowPlayingInfoCenterNowPlayingInfo {
    NSMutableDictionary *info;

    if (self.currentPlayable && self.currentPlayable.mediaItemProperties) {
        info = self.currentPlayable.mediaItemProperties.mutableCopy;
    } else {
        info = [NSMutableDictionary dictionaryWithCapacity:10];
    }

    //    Set defaults if missing
    NSArray* metadata = self.player.currentItem.asset.commonMetadata;

    if (!info[MPMediaItemPropertyPlaybackDuration]) {
        float _playbackDuration = self.currentPlayerItem ? CMTimeGetSeconds(self.currentPlayerItem.duration) : 0.0f;
        NSNumber* playbackDuration = @(_playbackDuration);
        info[MPMediaItemPropertyPlaybackDuration] = playbackDuration;
    }

    if (!info[MPNowPlayingInfoPropertyElapsedPlaybackTime]) {
        float _elapsedPlaybackTime = self.currentPlayerItem ? CMTimeGetSeconds(self.currentPlayerItem.currentTime) : 0.0f;
        NSNumber* elapsedPlaybackTime = @(_elapsedPlaybackTime);
        info[MPNowPlayingInfoPropertyElapsedPlaybackTime] = elapsedPlaybackTime;
    }

    if (!info[MPMediaItemPropertyArtwork]) {
        NSArray* artworkMetadata = [AVMetadataItem metadataItemsFromArray:metadata
                                                                  withKey:AVMetadataCommonKeyArtwork
                                                                 keySpace:AVMetadataKeySpaceCommon];
        if (artworkMetadata.count > 0) {
            AVMetadataItem* artworkMetadataItem = artworkMetadata[0];

            UIImage* artworkImage = [UIImage imageWithData:artworkMetadataItem.value[@"data"]];
            MPMediaItemArtwork* artwork = [[MPMediaItemArtwork alloc] initWithImage:artworkImage];

            info[MPMediaItemPropertyArtwork] = artwork;
        }
    }

    if (!info[MPMediaItemPropertyTitle]) {
        NSArray* _metadata = [AVMetadataItem metadataItemsFromArray:metadata withKey:AVMetadataCommonKeyTitle keySpace:AVMetadataKeySpaceCommon];

        if (_metadata.count > 0) {
            AVMetadataItem* _metadataItem = _metadata[0];
            info[MPMediaItemPropertyTitle] = _metadataItem.value;
        }
    }

    if (!info[MPMediaItemPropertyAlbumTitle]) {
        NSArray* _metadata = [AVMetadataItem metadataItemsFromArray:metadata withKey:AVMetadataCommonKeyAlbumName keySpace:AVMetadataKeySpaceCommon];

        if (_metadata.count > 0) {
            AVMetadataItem* _metadataItem = _metadata[0];
            info[MPMediaItemPropertyAlbumTitle] = _metadataItem.value;
        }
    }

    if (!info[MPMediaItemPropertyArtist]) {
        NSArray* _metadata = [AVMetadataItem metadataItemsFromArray:metadata withKey:AVMetadataCommonKeyArtist keySpace:AVMetadataKeySpaceCommon];

        if (_metadata.count > 0) {
            AVMetadataItem* _metadataItem = _metadata[0];
            info[MPMediaItemPropertyArtist] = _metadataItem.value;
        }
    }

    return info; 
}

here is stack trace:

HelloCordova[20791:74393] THREAD WARNING: ['AudioPlayerPlugin'] took '248.958008' ms. Plugin should use a background thread.
2015-04-01 10:16:21.377 HelloCordova[20791:74903] Retrieving lock screen art...
2015-04-01 10:16:29.295 HelloCordova[20791:74903] Initializing lock screen art...
2015-04-01 10:16:29.296 HelloCordova[20791:74903] Creating MPMediaItemArtwork...
2015-04-01 10:16:29.322 HelloCordova[20791:74903] Done retrieving lock screen art.
2015-04-01 10:16:51.439 HelloCordova[20791:74393] -[__NSCFData objectForKeyedSubscript:]: unrecognized selector sent to instance 0x7ffb33e0fe80
Apr  1 10:16:51 Pourias-Mac.local rtcreporting[20791] <Info>: logging starts...
Apr  1 10:16:51 Pourias-Mac.local rtcreporting[20791] <Debug>: setMessageLoggingBlock: called
2015-04-01 10:16:51.618 HelloCordova[20791:74393] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFData objectForKeyedSubscript:]: unrecognized selector sent to instance 0x7ffb33e0fe80'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010241ea75 __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x0000000104f96bb7 objc_exception_throw + 45
    2   CoreFoundation                      0x0000000102425d1d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
    3   CoreFoundation                      0x000000010237d9dc ___forwarding___ + 988
    4   CoreFoundation                      0x000000010237d578 _CF_forwarding_prep_0 + 120
    5   HelloCordova                        0x00000001021ce2a8 -[PRXPlayer MPNowPlayingInfoCenterNowPlayingInfo] + 2056
    6   HelloCordova                        0x00000001021d4549 -[NYPRPlayer MPNowPlayingInfoCenterNowPlayingInfo] + 57
    7   HelloCordova                        0x00000001021ce9e5 -[PRXPlayer setMPNowPlayingInfoCenterNowPlayingInfo] + 85
    8   HelloCordova                        0x00000001021d5acb -[NYPRPlayer refreshMetadata] + 43
    9   HelloCordova                        0x00000001021c4e02 -[AudioStreamHandler updateProgress] + 146
    10  HelloCordova                        0x00000001021c576b -[AudioStreamHandler observedPlayerDidObservePeriodicTimeInterval:] + 91
    11  HelloCordova                        0x00000001021cc85e -[PRXPlayer reportPlayerTimeIntervalToObservers] + 670
    12  HelloCordova                        0x00000001021caa4b -[PRXPlayer playerItemDidJumpTime:] + 91
    13  CoreFoundation                      0x00000001023ee7fc __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
    14  CoreFoundation                      0x00000001022ee204 _CFXNotificationPost + 2484
    15  AVFoundation                        0x0000000103b4c0b2 __avplayeritem_fpItemNotificationCallback_block_invoke + 7447
    16  libdispatch.dylib                   0x00000001056b8186 _dispatch_call_block_and_release + 12
    17  libdispatch.dylib                   0x00000001056d7614 _dispatch_client_callout + 8
    18  libdispatch.dylib                   0x00000001056bfa1c _dispatch_main_queue_callback_4CF + 1664
    19  CoreFoundation                      0x0000000102386749 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    20  CoreFoundation                      0x000000010234962b __CFRunLoopRun + 2043
    21  CoreFoundation                      0x0000000102348bc6 CFRunLoopRunSpecific + 470
    22  GraphicsServices                    0x0000000106735a58 GSEventRunModal + 161
    23  UIKit                               0x000000010280e580 UIApplicationMain + 1282
    24  HelloCordova                        0x000000010219a0e7 main + 71
    25  libdyld.dylib                       0x000000010570c145 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

part of this question is duplicate of This question but as noob iOS developer I didn't even know where to start ask my question, so sorry for duplicate question, but in other questions, I get my own answer and checked it as right answer.

Community
  • 1
  • 1
Developia
  • 3,928
  • 1
  • 28
  • 43
  • 1
    What about BREAKPOINTS? – LoVo Apr 02 '15 at 10:32
  • possible duplicate of [Xcode doesn't show the line that causes a crash](http://stackoverflow.com/questions/7703052/xcode-doesnt-show-the-line-that-causes-a-crash) – Tiago Almeida Apr 02 '15 at 11:02
  • Here is where the error occurred: [PRXPlayer MPNowPlayingInfoCenterNowPlayingInfo] + 2056 – Hot Licks Apr 02 '15 at 13:36
  • possible duplicate of [How can I debug 'unrecognized selector sent to instance' error](http://stackoverflow.com/questions/25853947/how-can-i-debug-unrecognized-selector-sent-to-instance-error) – Hot Licks Apr 02 '15 at 13:37

2 Answers2

2

Assuming you're using Xcode you can turn on exception breakpoints. This will cause the application to jump to the line that has broken when an exception has been thrown.

enter image description here

Ollie
  • 1,926
  • 1
  • 20
  • 35
2

The problem is you are trying to get the objectForKey for something that is not a dictionary but an NSData. I this it is this line:

UIImage* artworkImage = [UIImage imageWithData:artworkMetadataItem.value[@"data"]];

Maybe you can add s breakpoint there and print out artworkMetadataItem.value to see which type it is.

If this is not the problem you can try running through your code step by step to see what statement causes the crash.

Hope this works though! Let me know how it goes

Catalina T.
  • 3,456
  • 19
  • 29
  • Yeah, the line you mentioned is problem, I searched around that and found [this answer](http://stackoverflow.com/a/25794580/1028632) They changed data type of artworks in iOS 8 – Developia Apr 03 '15 at 15:01
  • It's great that you found it :) Glad I could help – Catalina T. Apr 03 '15 at 17:37