Some time back I noticed my ASP.NET Telerik controls were not working in iOS 8 nor Safari 8, so I did a little research and I discovered that I needed to add a new browser file to my application be cause of a major version-change to AppleWebKit/600. Below is solution I found in StackOverflow.
[topads][/topads]
Working UA: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36
Not working UA: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.1.17 (KHTML, like Gecko) Version/7.1 Safari/537.85.10
The problem lies in the major version-change to AppleWebKit/600. ASP.NET AJAX does not correctly recognize the new Safari 8 browser (also with iOS 8). It thinks, that there is no support for partial-rendering. I found it in those lines from PageRequestManager.cs
:
bool supportsPartialRendering = (browser.W3CDomVersion >= MinimumW3CDomVersion) && (browser.EcmaScriptVersion >= MinimumEcmaScriptVersion) && browser.SupportsCallback;
MinimumEcmaScriptVersion/MinimumW3CDomVersion are both 1. Request.Browser gave me the following result:
W3CDomVersion = 1.0 EcmaScriptVersion = 1.0 SupportsCallback = false
Even though “EcmaScriptVersion” has a strange value, the problem is mainly caused by SupportsCallback beeing false.
The bug lies in the “mozilla.browser” file that ships with ASP.NET (located somewhere in “C:\Windows\Microsoft.NET”):
<browser id="Safari60" parentID="Safari"> <identification> <capability name="appleWebTechnologyVersion" match="60" /> </identification> <capture> </capture> <capabilities> <capability name="ecmascriptversion" value="1.0" /> </capabilities> </browser> <browser id="Safari85" parentID="Safari"> <identification> <capability name="appleWebTechnologyVersion" match="85" /> </identification> <capture> </capture> <capabilities> <capability name="ecmascriptversion" value="1.4" /> </capabilities> </browser> <browser id="Safari1Plus" parentID="Safari"> <identification> <capability name="appleWebTechnologyVersion" match="\d\d\d" /> </identification> <capture> </capture> <capabilities> <capability name="ecmascriptversion" value="1.4" /> <capability name="w3cdomversion" value="1.0" /> <capability name="supportsCallback" value="true" /> </capabilities> </browser>
Everything newer than “Safari 85” was meant to be catched by the last definition. But due to a messed-up regular expression, “Safari 600” is falsly detected as “Safari60”:
<capability name="appleWebTechnologyVersion" match="60" />
Should have been
<capability name="appleWebTechnologyVersion" match="60$" />
I resolved this issue by adding a custom file “App_Browsers\safari.browser” to my application with the following content:
<browsers> <browser id="Safari60_bugfix" parentID="Safari60"> <identification> <capability name="appleWebTechnologyVersion" match="^\d{3,}$" /> <!-- At least 3 digits --> </identification> <capabilities> <!-- Same as in "Safari1Plus" --> <capability name="ecmascriptversion" value="1.4" /> <capability name="w3cdomversion" value="1.0" /> <capability name="supportsCallback" value="true" /> </capabilities> </browser> <browser id="Safari85_bugfix" parentID="Safari85"> <identification> <capability name="appleWebTechnologyVersion" match="^\d{3,}$" /> <!-- At least 3 digits --> </identification> <capabilities> <!-- Same as in "Safari1Plus" --> <capability name="ecmascriptversion" value="1.4" /> <capability name="w3cdomversion" value="1.0" /> <capability name="supportsCallback" value="true" /> </capabilities> </browser> </browsers>
All the credits to user Tobias81 for providing this solution. Here is his original post in StackOverflow
[bottomads][/bottomads]