forked from glawson/electron-deeplink
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathelectron-deeplink.mm
74 lines (59 loc) · 2.64 KB
/
electron-deeplink.mm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <napi.h>
#import <CoreFoundation/CoreFoundation.h>
#import <Foundation/Foundation.h>
Napi::Object SetRuntimeAppProtocol(const Napi::CallbackInfo &info) {
Napi::Env env = info.Env();
const std::string path = info[0].As<Napi::String>().Utf8Value();
const std::string protocol = info[1].As<Napi::String>().Utf8Value();
const Boolean debug = info[2].As<Napi::Boolean>();
NSString *appProtocol =
[NSString stringWithCString:protocol.c_str()
encoding:[NSString defaultCStringEncoding]];
NSString *appPath =
[NSString stringWithCString:path.c_str()
encoding:[NSString defaultCStringEncoding]];
NSURL *inUrl = [NSURL fileURLWithPath:appPath];
OSStatus registerStatus =
LSRegisterURL((__bridge CFURLRef _Nonnull)(inUrl), true);
NSString *bundleID =
[NSString stringWithFormat:@"com.deeplink.%@", appProtocol];
OSStatus setDefaultStatus = LSSetDefaultHandlerForURLScheme(
(__bridge CFStringRef)appProtocol, (__bridge CFStringRef)bundleID);
NSURL *url =
[NSURL URLWithString:[NSString stringWithFormat:@"%@://", appProtocol]];
CFArrayRef urlList =
LSCopyApplicationURLsForURL((__bridge CFURLRef)url, kLSRolesAll);
Napi::Object results = Napi::Object::New(env);
if (debug) {
NSString *registerStatusMsg = [((NSString *)SecCopyErrorMessageString(
registerStatus, NULL)) autorelease];
NSString *setDefaultStatusMsg = [((NSString *)SecCopyErrorMessageString(
setDefaultStatus, NULL)) autorelease];
if (urlList == NULL) {
Napi::Array appUrls = Napi::Array::New(env);
results.Set("urlList", appUrls);
} else {
Napi::Array appUrls = Napi::Array::New(env, CFArrayGetCount(urlList));
for (int i = 0; i < CFArrayGetCount(urlList); i++) {
NSString *urlItem = [NSString
stringWithFormat:@"%@", CFArrayGetValueAtIndex(urlList, i)];
appUrls[i] = [urlItem UTF8String];
}
results.Set("urlList", appUrls);
}
results.Set("appProtocol", [appProtocol UTF8String]);
results.Set("appPath", [appPath UTF8String]);
results.Set("inUrl", [inUrl.absoluteString UTF8String]);
results.Set("registerStatus", [registerStatusMsg UTF8String]);
results.Set("setDefaultStatus", [setDefaultStatusMsg UTF8String]);
results.Set("bundleID", [bundleID UTF8String]);
results.Set("url", [url.absoluteString UTF8String]);
}
return results;
}
Napi::Object Init(Napi::Env env, Napi::Object exports) {
exports.Set(Napi::String::New(env, "SetRuntimeAppProtocol"),
Napi::Function::New(env, SetRuntimeAppProtocol));
return exports;
}
NODE_API_MODULE(handler, Init)