I'm working on a Safari Content Blocking extension. I intend to show setup instructions if the extension is disabled and to show settings if it is conversely enabled. How can I determine if the extension is enabled by the user?
I've seen this method to detect if a custom keyboard is activated but there's no key on NSUserDefaults
that relates to Safari Content Blockers.
You could utilize a
SFSafariViewController
to load a custom website. This website checks whether it is able to show something that your content blocker should block. Then redirect to the respective custom url (success/failure) that your app previously registered for. You could even use a hidden Safari View Controller without animation to avoid any distraction from the user's perspective (as shown here). (I guess this technique is used by former content blocker Peace)Steps
App
contentBlockerEnabled
)Use
SFSafariViewController
to show a custom website and include the following rule inblockerList.json
:Website
Check for blocked content:
Redirect to custom URL (success/failure)
App
application:openURL:options:
(success/failure based on called url)Update 18/01
Following on from Tilo's hypothesis, I built the proposed solution. I wrote about what I learnt on Medium and you can grab the source files from GitHub.
TL;DR It works but only temperamentally due to the latency incurred of the content blocking rules database to update. A potential workaround is redirecting the test page to create an artificial delay.
As of iOS 10, there is a new method in
SFContentBlockerManager
to support this:getStateOfContentBlocker(withIdentifier:completionHandler:)
And you call it like this (Swift 3):