OK, here's what I've got. In my help.html:
<p>To show more options, press the More <img src="symbol:ellipsis.circle"/> button.</p>
In my help screen's view controller, I have something like
symbol_handler = [[SymbolURLHandler alloc] init];
auto config = [[WKWebViewConfiguration alloc] init];
[config setURLSchemeHandler: symbol_handler forURLScheme: @"symbol"];
webview = [[WKWebView alloc] initWithFrame: self.bounds configuration: config];
SymbolURLHandler is:
// SymbolURLHandler.hh:
#import <WebKit/Webkit.h>
@interface SymbolURLHandler: NSObject<WKURLSchemeHandler>
{
};
@end
// SymbolURLHandler.mm:
#import "SymbolURLHandler.hh"
#import <UIKit/UIImage.h>
#import <UIKit/UIImageSymbolConfiguration.h>
@implementation SymbolURLHandler
-(void) webView: (WKWebView*) webView
startURLSchemeTask: (id<WKURLSchemeTask>) urlSchemeTask
{
auto req = urlSchemeTask.request;
auto url = req.URL;
auto name = [url.absoluteString substringFromIndex: 7]; // 7 == strlen("symbol:");
UIImageConfiguration* image_configuration =
[UIImageSymbolConfiguration configurationWithPointSize: 16 // ???
weight: UIImageSymbolWeightLight
scale: UIImageSymbolScaleMedium];
UIImage* uiimg = [UIImage systemImageNamed: name
withConfiguration: image_configuration];
if (!uiimg) {
auto error = [NSError errorWithDomain: NSURLErrorDomain
code: NSURLErrorFileDoesNotExist
userInfo: nil];
[urlSchemeTask didFailWithError: error];
return;
}
auto data = [[NSMutableData alloc] init];
auto dest = CGImageDestinationCreateWithData((CFMutableDataRef)data, (CFStringRef)@"public.png", 1, NULL);
CGImageDestinationAddImage(dest, uiimg.CGImage, NULL);
CGImageDestinationFinalize(dest);
CFRelease(dest);
auto resp = [[NSURLResponse alloc] initWithURL: req.URL
MIMEType: @"image/png"
expectedContentLength: data.length
textEncodingName: nil];
[urlSchemeTask didReceiveResponse: resp];
[urlSchemeTask didReceiveData: data];
[urlSchemeTask didFinish];
}
-(void) webView: (WKWebView*) webView
stopURLSchemeTask: (id<WKURLSchemeTask>) urlSchemeTask
{
}
@end
And it works!
There are clearly a few things missing:
The webview doesn't tell the symbol handler what the current font size, colour etc. is.
The symbol handler doesn't tell the webview the symbol's baseline or padding metrics.
The image is shown with scale 1, not at "retina" resolution.
I'm not sure if I should use dispatch_async() to make multiple invocations run concurrently, or whether WebKit does that for me.
I'm not sure if I should be caching my PNGs, or whether WebKit does that for me, or maybe I need to include something in the response telling it that they are cacheable.
Any thoughts about those or other improvements would be gratefully received!