Error while fetching Server Playback Context when downloading Fairplay enabled videos - ios

While Implementing Offline FPS Getting AVFoundation Error -11800
I am implementing the Offline HLS using FPS.
I have downloaded the video using AVAssetDownloadDelegate
Now For DRM content I need to fetch license so I have implemented the AVAssetResourceLoaderDelegate
Everything is working fine in AVAssetResourceLoaderDelegate, I got the CKC or License but when I execute following code
let persistentContentKeyContext = try loadingRequest.persistentContentKey(fromKeyVendorResponse: responseData, options: nil)
I get following error
Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo={NSLocalizedFailureReason=An unknown error occurred (-12158), NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x1c084a6e0 {Error Domain=NSOSStatusErrorDomain Code=-12158 "(null)"}}
Can anyone please tell me what does this error codes means and how to resolve this error.

Unfortunately, the error response you are seeing is not very informative as you have noticed and could cover multiple failure cases.
It is typically means that the device FairPlay service cannot properly decode the CKC that your DRM server provided to the device, or else that some of the information in it is not consistent with a persistent license.
This is a problem for you to debug as the CKC that is sent back is encrypted in a way that you will not be able to read - see diagram below from Apple showing the sequence:
The best way to debug and investigate this is usually to contact the provider of your DRM server (key server in the above diagram) and see if they can investigate it on the server side and decode the response they are sending to you so you can check it matches what you are expecting and the persistent period etc is correct.

Related

iOS Not playing some Videos - CoreMediaErrorDomain Code=-12939

I am using CTVideoView to playback videos inside a UITableView in iOS. As of late this was working fine, but for some reason, it seems as though the something has gone astray.
About 10% of the videos will play in the table, but many will simply just fail to play. The error occurs when iOS is trying to download the video as can be seen by the error messages below. For some reason, the error message is different in iOS 10 & 11 but the code is the same.
Based on iOS 10's message one would believe that the network is not available, but if I point my safari/chrome browser on the same iOS device it plays the video just fine.
As for the iOS 11 message, I have no idea where to even start as it the first time I've seen this message.
Any help at all would be much appreciated in resolving this.
iOS 10 Error Message
FAILED TO PREPARE VIDEO WITH ERROR: Error Domain=NSURLErrorDomain
Code=-1 "unknown error" UserInfo={NSLocalizedDescription=unknown
error,
NSErrorFailingURLStringKey=URLOBSCUREDFORPRIVACY,
NSErrorFailingURLKey=URLOBSCUREDFORPRIVACY,
NSURL=URLOBSCUREDFORPRIVACY,
NSUnderlyingError=0x17044bd00 {Error Domain=CoreMediaErrorDomain
Code=-12939 "CFNetwork error unavailable"
UserInfo={NSDescription=CFNetwork error unavailable,
NSURL=URLOBSCUREDFORPRIVACY}}}
iOS 11 Error Message
FAILED TO PREPARE VIDEO WITH ERROR: Error Domain=NSURLErrorDomain
Code=-1 "unknown error" UserInfo={NSUnderlyingError=0x1c08483d0 {Error
Domain=CoreMediaErrorDomain Code=-12939 "content range mismatch -
should be start 0 length 1247166 is start 0 length 1048575"
UserInfo={NSDescription=content range mismatch - should be start 0
length 1247166 is start 0 length 1048575,
NSURL=URLOBSCUREDFORPRIVACY}},
NSErrorFailingURLStringKey=URLOBSCUREDFORPRIVACY,
NSErrorFailingURLKey=URLOBSCUREDFORPRIVACY,
NSURL=URLOBSCUREDFORPRIVACY,
NSLocalizedDescription=unknown error}
Update (Possible Clue)
So after some testing I've narrowed it down to videos longer than or equal to 10 seconds. In all other circumstances the video will play.
I have resolved the issue. The issue was with ParseServer and the fact that it could not stream videos to iOS as it does not come out of the box with byte-range headers configured.
The solution was to implement the GridStoreAdapter into the server and from there migrate file storage to S3 or GCS (depending on your preference). This will need to be done alongside the respective adapter for your service.
Once that was done, the app started behaving correctly again.

iOS - Runtime errors with GCM

I'm not sure if this is an issue of the library or something wrong on our side but I already spent a lot of time searching about this and found nothing that could shed any light.
We're using GCM since a while on both iOS and Android. The application is in production and is working fine. Our iOS app collects and reports low-impact errors (basically errors we catch and handle) and analyzing these data I found those errors I'm struggling to understand.
While registering a device on GCM with an APNS token
Error Domain=com.google.iid Code=1006 "(null)" that according to the documentation is kGGLInstanceIDOperationErrorCodeInvalidKeyPair
While subscribing to a topic
Error Domain=com.google.gcm Code=501 "(null)" that according to the documentation is kGGLInstanceIDOperationErrorCodeMissingDeviceID
Both errors happens on iOS8/iOS9/iOS10.
Our app includes the GCM library via Cocoapods:
pod 'Google/CloudMessaging', '2.0.4'
Can someone help me understanding what's happening?
Thanks!
The first error kGGLInstanceIDOperationErrorCodeInvalidKeyPair means that you have error in KeyPair access. While the error kGGLInstanceIDOperationErrorCodeMissingDeviceID means that your device seems to be missing a valid deviceID. It cannot authenticate device requests. From this related thread, error code 501 was solved by resetting all data and settings on the device (factory reset) and this fixed the problem. It's also stated here that the error occurred maybe because you are calling GCMService.sharedInstance().connectWithHandler() { error in if(error != nil) { print(error) } } before you had received a registration token, or had failed to refresh your token.
But I found this SO question which have similar issue with you which suggests to transition to Firebase Cloud Messaging as recommended by Google and his issue was solved.

Cloudant replication errors: TDChangeTracker (Code=589) and NSURLErrorDomain(Code=-1005)

I have been using Cloudant through Bluemix and everything worked fine at the beginning. But now the replications don't complete successful anymore, constantly throwing errors or finishing with no data being received.
replicatorDidError: Error Domain=NSURLErrorDomain Code=-1005 "(null)"
replicatorDidError: Error Domain=TDChangeTracker Code=589 "(null)"
Bad DB response: {"error":"service_unavailable","reason":"Service unavailable"}
Sometimes it was temporarily fixed assigning new credentials, but now it doesn't do the trick anymore. It happens either from the iOS SDK or from a node.js app.
Any help will be very welcome.
Thanks in advance.

Some streaming SoundCloud songs fail to stream on iOS with errors

I'm using AVPlayer to stream SoundCloud songs in my app, but some of them don't work, despite the streamable flag being true. An example of a song that doesn't work is "Black Friday" by Kendrick Lamar, with streaming URL
https://api.soundcloud.com/tracks/234989572/stream?client_id={MY_CLIENT_ID}
(with {MY_CLIENT_ID} being the actual ID, of course)
This is the error returned by the AVPlayerItem (again with the real client ID obscured):
Error Domain=NSURLErrorDomain Code=-1100 "The requested URL was not found on this server."
UserInfo=0x7fe735752340 {NSUnderlyingError=0x7fe735751e30 "The operation couldn’t be completed. (OSStatus error -12938.)",
NSErrorFailingURLStringKey=https://api.soundcloud.com/tracks/234989572/stream?client_id={MY_CLIENT_ID},
NSErrorFailingURLKey=https://api.soundcloud.com/tracks/234989572/stream?client_id={MY_CLIENT_ID},
NSURL=https://api.soundcloud.com/tracks/234989572/stream?client_id={MY_CLIENT_ID},
NSLocalizedDescription=The requested URL was not found on this server.}
Most songs play just fine, for example "Everything Will Be OK" by G-Eazy. URL:
https://api.soundcloud.com/tracks/236005149/stream?client_id={MY_CLIENT_ID}
Why are some songs, like Black Friday, failing?
The publisher of that track has opted not to provide an mp3 stream for it. Unfortunately, for some very complicated reasons, there's no way to tell that is going to be the case until you actually try to fetch the stream. It's a very frustrating thing, but please believe me when I say the reasons are complicated.
Perhaps sending a HEAD request to the streams endpoint before attempting to play would help?

AVPlayer fails to play video sometimes

I'm having grid of videos, AVPlayer sometimes fail to play video and showing this disabled icon with following error,
Domain=AVFoundationErrorDomain Code=-11850 "Operation Stopped" UserInfo={NSUnderlyingError=0x7f927ede4210
{Error Domain=NSOSStatusErrorDomain Code=-12939 "(null)"}
, NSLocalizedFailureReason=The server is not correctly configured., NSLocalizedDescription=Operation Stopped})
but same video getting played later on, so it is random issue. Any help on what's going wrong?
Search Error
I believe there are a lot of people, like me, are looking for the solution of this problem.
I spent a whole afternoon's time, finally solved the problem.
On the question, an error occurred when the video starts playing.
such as:
Domain=AVFoundationErrorDomain Code=-11850 "Operation Stopped"
then I search this error number, and find it:
AVErrorServerIncorrectlyConfigured = -11850
In Apple's Document, I find some information about this error.
The HTTP server sending the media resource is not configured as expected.
This might mean that the server does not support byte range requests.
Find Error
So, we should understand that this is a server problem.
Now, we play a video, and grab all http request for analysis.
Will find that AVPlayerItem sends an HTTP request.
when AVPlayerItem receive a video URL , it do the following task:
Send a bytes request HTTP Request, and range = 0 -1
If the response code is 206 and return 1 bytes data, It do the 3th task, if not, AVErrorServerIncorrectlyConfigured error occurred.
continue send other HTTP Request, to download segment of All duration. and the response of VideoData code must be 206
In my situation , when send range[0-1] HTTP request, the server side give me a 200 OK response, So error occurred.
Result
So, you need to ask your server engineer to detect all response who return.
I wish it could help you.

Resources