react-native-notify-kit 10.3.2 → 10.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -12
- package/app.plugin.js +3 -0
- package/cli/dist/commands/initNse.js +8 -9
- package/cli/dist/commands/initNse.js.map +1 -1
- package/cli/dist/lib/detectProject.d.ts +1 -4
- package/cli/dist/lib/detectProject.js +3 -32
- package/cli/dist/lib/detectProject.js.map +1 -1
- package/cli/dist/lib/initNseCore.d.ts +8 -0
- package/cli/dist/lib/initNseCore.js +197 -0
- package/cli/dist/lib/initNseCore.js.map +1 -0
- package/cli/dist/lib/patchPodfile.d.ts +9 -0
- package/cli/dist/lib/patchPodfile.js +22 -15
- package/cli/dist/lib/patchPodfile.js.map +1 -1
- package/cli/dist/lib/patchXcodeProject.d.ts +16 -0
- package/cli/dist/lib/patchXcodeProject.js +54 -26
- package/cli/dist/lib/patchXcodeProject.js.map +1 -1
- package/cli/dist/lib/writeTemplates.js +5 -14
- package/cli/dist/lib/writeTemplates.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/ios/NotifeeCore/NotifeeCore+NSNotificationCenter.m +6 -0
- package/ios/NotifeeCore/NotifeeCore+UNUserNotificationCenter.m +95 -20
- package/ios/NotifeeCore/NotifeeCore.m +13 -0
- package/ios/RNNotifee/NotifeeApiModule.mm +7 -0
- package/ios/RNNotifee/NotifeeExtensionHelper.h +2 -2
- package/ios/RNNotifee/NotifeeExtensionHelper.m +1 -0
- package/package.json +16 -3
- package/plugin/build/android/withNotifyKitAndroidManifest.js +236 -0
- package/plugin/build/index.js +62 -0
- package/plugin/build/ios/withNotifyKitIosNseAppExtension.js +142 -0
- package/plugin/build/ios/withNotifyKitIosNseFiles.js +79 -0
- package/plugin/build/ios/withNotifyKitIosNsePodfile.js +130 -0
- package/plugin/build/ios/withNotifyKitIosNseXcodeProject.js +49 -0
- package/plugin/build/options.js +224 -0
- package/plugin/build/shared/nse/index.js +7 -0
- package/plugin/build/shared/nse/initNseCore.js +220 -0
- package/plugin/build/shared/nse/patchPodfile.js +261 -0
- package/plugin/build/shared/nse/patchXcodeProject.js +199 -0
- package/src/version.ts +1 -1
|
@@ -34,8 +34,10 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.patchPodfile = patchPodfile;
|
|
37
|
+
exports.patchPodfileForNotifyKitNse = patchPodfileForNotifyKitNse;
|
|
37
38
|
exports.getPatchedPodfile = getPatchedPodfile;
|
|
38
39
|
const fs = __importStar(require("fs"));
|
|
40
|
+
const DEFAULT_PACKAGE_PATH_FROM_IOS = '../node_modules/react-native-notify-kit';
|
|
39
41
|
const RNFB_INFO_PLIST_INPUT_PATH = '$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)';
|
|
40
42
|
const RNFB_POST_INSTALL_MARKER = 'NotifyKitNSE: avoid an Xcode build cycle between the embedded app extension';
|
|
41
43
|
/**
|
|
@@ -48,27 +50,24 @@ const RNFB_POST_INSTALL_MARKER = 'NotifyKitNSE: avoid an Xcode build cycle betwe
|
|
|
48
50
|
*/
|
|
49
51
|
function patchPodfile(podfilePath, targetName, dryRun) {
|
|
50
52
|
const content = fs.readFileSync(podfilePath, 'utf-8');
|
|
51
|
-
const
|
|
52
|
-
if (
|
|
53
|
+
const result = patchPodfileForNotifyKitNse(content, { targetName });
|
|
54
|
+
if (!result.didChange) {
|
|
53
55
|
return false; // Already patched
|
|
54
56
|
}
|
|
55
57
|
if (!dryRun) {
|
|
56
|
-
fs.writeFileSync(podfilePath,
|
|
58
|
+
fs.writeFileSync(podfilePath, result.contents, 'utf-8');
|
|
57
59
|
}
|
|
58
60
|
return true;
|
|
59
61
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
* preview or testing).
|
|
63
|
-
*/
|
|
64
|
-
function getPatchedPodfile(content, targetName) {
|
|
65
|
-
let patched = content;
|
|
62
|
+
function patchPodfileForNotifyKitNse(podfileText, options) {
|
|
63
|
+
let patched = podfileText;
|
|
66
64
|
let changed = false;
|
|
65
|
+
const packagePathFromIos = options.packagePathFromIos ?? DEFAULT_PACKAGE_PATH_FROM_IOS;
|
|
67
66
|
// Idempotency check — skip commented lines (# prefix)
|
|
68
|
-
if (!hasUncommentedTarget(patched, targetName)) {
|
|
69
|
-
const withNseTarget = insertNseTarget(patched, targetName);
|
|
67
|
+
if (!hasUncommentedTarget(patched, options.targetName)) {
|
|
68
|
+
const withNseTarget = insertNseTarget(patched, options.targetName, packagePathFromIos);
|
|
70
69
|
if (withNseTarget === null) {
|
|
71
|
-
return
|
|
70
|
+
return { contents: patched, didChange: changed };
|
|
72
71
|
}
|
|
73
72
|
patched = withNseTarget;
|
|
74
73
|
changed = true;
|
|
@@ -78,7 +77,15 @@ function getPatchedPodfile(content, targetName) {
|
|
|
78
77
|
patched = withRnfbPatch;
|
|
79
78
|
changed = true;
|
|
80
79
|
}
|
|
81
|
-
return
|
|
80
|
+
return { contents: patched, didChange: changed };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Returns the patched Podfile content without writing to disk (for dry-run
|
|
84
|
+
* preview or testing).
|
|
85
|
+
*/
|
|
86
|
+
function getPatchedPodfile(content, targetName) {
|
|
87
|
+
const result = patchPodfileForNotifyKitNse(content, { targetName });
|
|
88
|
+
return result.didChange ? result.contents : null;
|
|
82
89
|
}
|
|
83
90
|
/**
|
|
84
91
|
* Inserts the NSE target block inside the main app target, just before
|
|
@@ -92,11 +99,11 @@ function getPatchedPodfile(content, targetName) {
|
|
|
92
99
|
* sub-target there.
|
|
93
100
|
* Discovered: F3 Round 3, Check 3 smoke-app integration (2026-04).
|
|
94
101
|
*/
|
|
95
|
-
function insertNseTarget(content, targetName) {
|
|
102
|
+
function insertNseTarget(content, targetName, packagePathFromIos) {
|
|
96
103
|
// Build the NSE block (indented since it's inside the parent target)
|
|
97
104
|
let block = `\n target '${targetName}' do\n`;
|
|
98
105
|
block += ` inherit! :search_paths\n`;
|
|
99
|
-
block += ` pod 'RNNotifeeCore', :path => '
|
|
106
|
+
block += ` pod 'RNNotifeeCore', :path => '${packagePathFromIos}'\n`;
|
|
100
107
|
block += ` end\n`;
|
|
101
108
|
// Find the main app target's closing `end`.
|
|
102
109
|
// Strategy: find the first `target '...' do` and then its matching `end`.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patchPodfile.js","sourceRoot":"","sources":["../../src/lib/patchPodfile.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"patchPodfile.js","sourceRoot":"","sources":["../../src/lib/patchPodfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
* Round 3 Check 3 smoke-app integration test to confirm which workarounds
|
|
12
12
|
* remain necessary.
|
|
13
13
|
*/
|
|
14
|
+
import xcode from 'xcode';
|
|
15
|
+
export type XcodeProject = ReturnType<typeof xcode.project>;
|
|
14
16
|
export interface PatchXcodeOptions {
|
|
15
17
|
pbxprojPath: string;
|
|
16
18
|
targetName: string;
|
|
@@ -18,8 +20,22 @@ export interface PatchXcodeOptions {
|
|
|
18
20
|
iosDir: string;
|
|
19
21
|
dryRun: boolean;
|
|
20
22
|
}
|
|
23
|
+
export interface NotifyKitNseXcodePatchOptions {
|
|
24
|
+
targetName: string;
|
|
25
|
+
bundleIdentifier: string;
|
|
26
|
+
parentTargetName?: string;
|
|
27
|
+
deploymentTarget?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface NotifyKitNseXcodePatchResult {
|
|
30
|
+
didChange: boolean;
|
|
31
|
+
targetUuid?: string;
|
|
32
|
+
productUuid?: string;
|
|
33
|
+
hostTargetUuid?: string;
|
|
34
|
+
warnings: string[];
|
|
35
|
+
}
|
|
21
36
|
/**
|
|
22
37
|
* Adds an NSE target to the .pbxproj file via the xcode library.
|
|
23
38
|
* Idempotent: if a target with the given name already exists, returns false.
|
|
24
39
|
*/
|
|
25
40
|
export declare function patchXcodeProject(opts: PatchXcodeOptions): boolean;
|
|
41
|
+
export declare function patchXcodeProjectForNotifyKitNse(proj: XcodeProject, options: NotifyKitNseXcodePatchOptions): NotifyKitNseXcodePatchResult;
|
|
@@ -50,6 +50,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
50
50
|
};
|
|
51
51
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
52
52
|
exports.patchXcodeProject = patchXcodeProject;
|
|
53
|
+
exports.patchXcodeProjectForNotifyKitNse = patchXcodeProjectForNotifyKitNse;
|
|
53
54
|
const crypto = __importStar(require("crypto"));
|
|
54
55
|
const fs = __importStar(require("fs"));
|
|
55
56
|
const xcode_1 = __importDefault(require("xcode"));
|
|
@@ -60,15 +61,30 @@ const xcode_1 = __importDefault(require("xcode"));
|
|
|
60
61
|
function patchXcodeProject(opts) {
|
|
61
62
|
const proj = xcode_1.default.project(opts.pbxprojPath);
|
|
62
63
|
proj.parseSync();
|
|
64
|
+
const result = patchXcodeProjectForNotifyKitNse(proj, {
|
|
65
|
+
targetName: opts.targetName,
|
|
66
|
+
bundleIdentifier: opts.bundleId,
|
|
67
|
+
});
|
|
68
|
+
// writeSync() returns content as string, must write manually.
|
|
69
|
+
if (result.didChange && !opts.dryRun) {
|
|
70
|
+
fs.writeFileSync(opts.pbxprojPath, proj.writeSync());
|
|
71
|
+
}
|
|
72
|
+
return result.didChange;
|
|
73
|
+
}
|
|
74
|
+
function patchXcodeProjectForNotifyKitNse(proj, options) {
|
|
75
|
+
const { targetName, bundleIdentifier, parentTargetName, deploymentTarget = '15.1' } = options;
|
|
76
|
+
const warnings = [];
|
|
63
77
|
// Idempotency: check if target already exists
|
|
64
|
-
if (targetExists(proj,
|
|
65
|
-
return false;
|
|
78
|
+
if (targetExists(proj, targetName)) {
|
|
79
|
+
return { didChange: false, warnings };
|
|
66
80
|
}
|
|
67
81
|
// 1. Add the extension target
|
|
68
|
-
const target = proj.addTarget(
|
|
82
|
+
const target = proj.addTarget(targetName, 'app_extension', targetName);
|
|
69
83
|
if (!target || !target.uuid) {
|
|
70
|
-
throw new Error(`xcode library failed to create target '${
|
|
84
|
+
throw new Error(`xcode library failed to create target '${targetName}'`);
|
|
71
85
|
}
|
|
86
|
+
const targetUuid = target.uuid;
|
|
87
|
+
const productUuid = getTargetProductUuid(target);
|
|
72
88
|
// xcode@3.x bug: addTarget creates the .appex product reference with
|
|
73
89
|
// `fileEncoding = undefined` and `lastKnownFileType = undefined` instead
|
|
74
90
|
// of omitting these keys entirely. CocoaPods' pbxproj parser rejects
|
|
@@ -76,15 +92,15 @@ function patchXcodeProject(opts) {
|
|
|
76
92
|
// `pod install`. Strip these fields post-addTarget to restore a clean
|
|
77
93
|
// product reference that CocoaPods accepts.
|
|
78
94
|
// Discovered: F3 Round 3, Check 3 smoke-app integration (2026-04).
|
|
79
|
-
fixProductFileReference(proj,
|
|
95
|
+
fixProductFileReference(proj, targetName);
|
|
80
96
|
// 2. Add build phases
|
|
81
|
-
proj.addBuildPhase([], 'PBXSourcesBuildPhase', 'Sources',
|
|
82
|
-
proj.addBuildPhase([], 'PBXFrameworksBuildPhase', 'Frameworks',
|
|
83
|
-
proj.addBuildPhase([], 'PBXResourcesBuildPhase', 'Resources',
|
|
97
|
+
proj.addBuildPhase([], 'PBXSourcesBuildPhase', 'Sources', targetUuid);
|
|
98
|
+
proj.addBuildPhase([], 'PBXFrameworksBuildPhase', 'Frameworks', targetUuid);
|
|
99
|
+
proj.addBuildPhase([], 'PBXResourcesBuildPhase', 'Resources', targetUuid);
|
|
84
100
|
// 3. Create PBX group for the NSE target files, then register the source file
|
|
85
|
-
const group = proj.addPbxGroup([],
|
|
86
|
-
proj.addSourceFile(`${
|
|
87
|
-
target:
|
|
101
|
+
const group = proj.addPbxGroup([], targetName, targetName);
|
|
102
|
+
proj.addSourceFile(`${targetName}/NotificationService.swift`, {
|
|
103
|
+
target: targetUuid,
|
|
88
104
|
}, group.uuid);
|
|
89
105
|
// xcode@3.x bug: addTargetDependency() adds the dependency to an internal
|
|
90
106
|
// cache but does not serialize it to the project hash, so writeSync()
|
|
@@ -97,20 +113,25 @@ function patchXcodeProject(opts) {
|
|
|
97
113
|
// CocoaPods' post_install to crash. Xcode auto-creates the embed phase
|
|
98
114
|
// when the user opens the project and sees the dependency.
|
|
99
115
|
// Discovered: F3 Round 3, Check 3 smoke-app integration (2026-04).
|
|
100
|
-
const hostUuid = findHostTarget(proj);
|
|
116
|
+
const hostUuid = findHostTarget(proj, parentTargetName);
|
|
101
117
|
if (hostUuid) {
|
|
102
|
-
addTargetDependencyManual(proj, hostUuid,
|
|
118
|
+
addTargetDependencyManual(proj, hostUuid, targetUuid, targetName);
|
|
103
119
|
stripRnfbInfoPlistInputPath(proj, hostUuid);
|
|
104
120
|
}
|
|
105
121
|
// 5. Set build settings for all configurations
|
|
106
|
-
setBuildSettings(proj,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
122
|
+
setBuildSettings(proj, targetName, bundleIdentifier, deploymentTarget);
|
|
123
|
+
return {
|
|
124
|
+
didChange: true,
|
|
125
|
+
targetUuid,
|
|
126
|
+
productUuid,
|
|
127
|
+
hostTargetUuid: hostUuid ?? undefined,
|
|
128
|
+
warnings,
|
|
129
|
+
};
|
|
112
130
|
}
|
|
113
|
-
function findHostTarget(proj) {
|
|
131
|
+
function findHostTarget(proj, parentTargetName) {
|
|
132
|
+
if (parentTargetName) {
|
|
133
|
+
return findTargetByName(proj, parentTargetName);
|
|
134
|
+
}
|
|
114
135
|
const targets = proj.pbxNativeTargetSection();
|
|
115
136
|
for (const [key, value] of Object.entries(targets)) {
|
|
116
137
|
if (typeof value !== 'object' || key.endsWith('_comment'))
|
|
@@ -123,20 +144,27 @@ function findHostTarget(proj) {
|
|
|
123
144
|
}
|
|
124
145
|
return null;
|
|
125
146
|
}
|
|
126
|
-
function
|
|
147
|
+
function findTargetByName(proj, name) {
|
|
127
148
|
const targets = proj.pbxNativeTargetSection();
|
|
128
|
-
for (const [, value] of Object.entries(targets)) {
|
|
149
|
+
for (const [key, value] of Object.entries(targets)) {
|
|
129
150
|
if (typeof value !== 'object')
|
|
130
151
|
continue;
|
|
131
152
|
const target = value;
|
|
132
153
|
const targetName = String(target.name ?? '').replace(/"/g, '');
|
|
133
154
|
if (targetName === name) {
|
|
134
|
-
return
|
|
155
|
+
return key;
|
|
135
156
|
}
|
|
136
157
|
}
|
|
137
|
-
return
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
function targetExists(proj, name) {
|
|
161
|
+
return findTargetByName(proj, name) !== null;
|
|
162
|
+
}
|
|
163
|
+
function getTargetProductUuid(target) {
|
|
164
|
+
const productReference = target.pbxNativeTarget?.productReference;
|
|
165
|
+
return typeof productReference === 'string' ? productReference : undefined;
|
|
138
166
|
}
|
|
139
|
-
function setBuildSettings(proj, targetName, bundleId) {
|
|
167
|
+
function setBuildSettings(proj, targetName, bundleId, deploymentTarget) {
|
|
140
168
|
const configs = proj.pbxXCBuildConfigurationSection();
|
|
141
169
|
for (const [, value] of Object.entries(configs)) {
|
|
142
170
|
if (typeof value !== 'object')
|
|
@@ -150,7 +178,7 @@ function setBuildSettings(proj, targetName, bundleId) {
|
|
|
150
178
|
settings.INFOPLIST_FILE = `"${targetName}/Info.plist"`;
|
|
151
179
|
settings.PRODUCT_BUNDLE_IDENTIFIER = `"${bundleId}"`;
|
|
152
180
|
settings.TARGETED_DEVICE_FAMILY = `"1,2"`;
|
|
153
|
-
settings.IPHONEOS_DEPLOYMENT_TARGET =
|
|
181
|
+
settings.IPHONEOS_DEPLOYMENT_TARGET = deploymentTarget;
|
|
154
182
|
settings.SWIFT_VERSION = '5.0';
|
|
155
183
|
settings.CODE_SIGN_ENTITLEMENTS = `"${targetName}/${targetName}.entitlements"`;
|
|
156
184
|
settings.GENERATE_INFOPLIST_FILE = 'NO';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patchXcodeProject.js","sourceRoot":"","sources":["../../src/lib/patchXcodeProject.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"patchXcodeProject.js","sourceRoot":"","sources":["../../src/lib/patchXcodeProject.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,12 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.writeTemplates = writeTemplates;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
-
|
|
40
|
-
// and at cli/dist/templates/ in the bundled prepack (relative to cli/dist/cli.bundle.js).
|
|
41
|
-
// The fallback path handles the bundled context where __dirname is the bundle's dir.
|
|
42
|
-
const TEMPLATES_DIR = fs.existsSync(path.join(__dirname, 'templates'))
|
|
43
|
-
? path.join(__dirname, 'templates')
|
|
44
|
-
: path.join(__dirname, '..', 'templates');
|
|
39
|
+
const initNseCore_1 = require("./initNseCore");
|
|
45
40
|
/**
|
|
46
41
|
* Writes the NSE template files (Swift, Info.plist, entitlements) to the
|
|
47
42
|
* target directory under the iOS project.
|
|
@@ -55,24 +50,20 @@ function writeTemplates(opts) {
|
|
|
55
50
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
56
51
|
const files = [
|
|
57
52
|
{
|
|
58
|
-
template: 'NotificationService.swift.tmpl',
|
|
59
53
|
output: 'NotificationService.swift',
|
|
54
|
+
content: (0, initNseCore_1.renderNotificationServiceSwift)(),
|
|
60
55
|
},
|
|
61
56
|
{
|
|
62
|
-
template: 'Info.plist.tmpl',
|
|
63
57
|
output: 'Info.plist',
|
|
58
|
+
content: (0, initNseCore_1.renderNseInfoPlist)({ targetName: opts.targetName }),
|
|
64
59
|
},
|
|
65
60
|
{
|
|
66
|
-
template: 'NotifyKitNSE.entitlements.tmpl',
|
|
67
61
|
output: `${opts.targetName}.entitlements`,
|
|
62
|
+
content: (0, initNseCore_1.renderNseEntitlementsPlist)(),
|
|
68
63
|
},
|
|
69
64
|
];
|
|
70
65
|
const written = [];
|
|
71
|
-
for (const {
|
|
72
|
-
const templatePath = path.join(TEMPLATES_DIR, template);
|
|
73
|
-
let content = fs.readFileSync(templatePath, 'utf-8');
|
|
74
|
-
content = content.replace(/\{\{TARGET_NAME\}\}/g, opts.targetName);
|
|
75
|
-
content = content.replace(/\{\{BUNDLE_ID\}\}/g, opts.bundleId);
|
|
66
|
+
for (const { output, content } of files) {
|
|
76
67
|
const outputPath = path.join(targetDir, output);
|
|
77
68
|
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
78
69
|
written.push(outputPath);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writeTemplates.js","sourceRoot":"","sources":["../../src/lib/writeTemplates.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"writeTemplates.js","sourceRoot":"","sources":["../../src/lib/writeTemplates.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,wCAmCC;AAtDD,uCAAyB;AACzB,2CAA6B;AAC7B,+CAIuB;AASvB;;;GAGG;AACH,SAAgB,cAAc,CAAC,IAA2B;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAE1D,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,CAAC,UAAU,yBAAyB,SAAS,KAAK;YACnE,sEAAsE,CACzE,CAAC;IACJ,CAAC;IAED,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,KAAK,GAAG;QACZ;YACE,MAAM,EAAE,2BAA2B;YACnC,OAAO,EAAE,IAAA,4CAA8B,GAAE;SAC1C;QACD;YACE,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,IAAA,gCAAkB,EAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;SAC7D;QACD;YACE,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,eAAe;YACzC,OAAO,EAAE,IAAA,wCAA0B,GAAE;SACtC;KACF,CAAC;IAEF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,KAAK,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAChD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "10.
|
|
1
|
+
export declare const version = "10.4.0";
|
package/dist/version.js
CHANGED
|
@@ -24,6 +24,10 @@
|
|
|
24
24
|
+ (void)topUpRollingTimestampTriggersWithCompletion:(void (^)(NSError *error))completion;
|
|
25
25
|
@end
|
|
26
26
|
|
|
27
|
+
@interface NotifeeCoreUNUserNotificationCenter (Rechain)
|
|
28
|
+
- (void)rechainUserNotificationCenterDelegate;
|
|
29
|
+
@end
|
|
30
|
+
|
|
27
31
|
@implementation NotifeeCoreNSNotificationCenter
|
|
28
32
|
|
|
29
33
|
+ (instancetype)instance {
|
|
@@ -75,6 +79,8 @@
|
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
- (void)application_didBecomeActiveNotification:(nonnull NSNotification *)notification {
|
|
82
|
+
[[NotifeeCoreUNUserNotificationCenter instance] rechainUserNotificationCenterDelegate];
|
|
83
|
+
|
|
78
84
|
[NotifeeCore topUpRollingTimestampTriggersWithCompletion:^(NSError *error) {
|
|
79
85
|
if (error != nil) {
|
|
80
86
|
NSLog(@"NotifeeCore: Failed to top up rolling timestamp triggers after app became active: %@",
|
|
@@ -21,10 +21,63 @@
|
|
|
21
21
|
#import "NotifeeCoreDelegateHolder.h"
|
|
22
22
|
#import "NotifeeCoreUtil.h"
|
|
23
23
|
|
|
24
|
+
typedef void (^NotifeeCorePresentationCompletionHandler)(UNNotificationPresentationOptions options);
|
|
25
|
+
typedef void (^NotifeeCoreVoidCompletionHandler)(void);
|
|
26
|
+
|
|
24
27
|
@interface NotifeeCore (RollingTimestampTopUp)
|
|
25
28
|
+ (void)topUpRollingTimestampTriggersWithCompletion:(void (^)(NSError *error))completion;
|
|
26
29
|
@end
|
|
27
30
|
|
|
31
|
+
@interface NotifeeCoreUNUserNotificationCenter ()
|
|
32
|
+
- (void)refreshOriginalDelegateSelectorFlags;
|
|
33
|
+
- (void)rechainUserNotificationCenterDelegate;
|
|
34
|
+
@end
|
|
35
|
+
|
|
36
|
+
static NotifeeCorePresentationCompletionHandler NotifeeCoreOneShotPresentationCompletionHandler(
|
|
37
|
+
NotifeeCorePresentationCompletionHandler completionHandler) {
|
|
38
|
+
NSObject *completionLock = [NSObject new];
|
|
39
|
+
__block BOOL completionCalled = NO;
|
|
40
|
+
|
|
41
|
+
NotifeeCorePresentationCompletionHandler oneShotCompletionHandler =
|
|
42
|
+
^(UNNotificationPresentationOptions options) {
|
|
43
|
+
BOOL shouldCallCompletion = NO;
|
|
44
|
+
@synchronized(completionLock) {
|
|
45
|
+
if (!completionCalled) {
|
|
46
|
+
completionCalled = YES;
|
|
47
|
+
shouldCallCompletion = YES;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (shouldCallCompletion && completionHandler != nil) {
|
|
52
|
+
completionHandler(options);
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
return [oneShotCompletionHandler copy];
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
static NotifeeCoreVoidCompletionHandler NotifeeCoreOneShotVoidCompletionHandler(
|
|
60
|
+
NotifeeCoreVoidCompletionHandler completionHandler) {
|
|
61
|
+
NSObject *completionLock = [NSObject new];
|
|
62
|
+
__block BOOL completionCalled = NO;
|
|
63
|
+
|
|
64
|
+
NotifeeCoreVoidCompletionHandler oneShotCompletionHandler = ^{
|
|
65
|
+
BOOL shouldCallCompletion = NO;
|
|
66
|
+
@synchronized(completionLock) {
|
|
67
|
+
if (!completionCalled) {
|
|
68
|
+
completionCalled = YES;
|
|
69
|
+
shouldCallCompletion = YES;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (shouldCallCompletion && completionHandler != nil) {
|
|
74
|
+
completionHandler();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
return [oneShotCompletionHandler copy];
|
|
79
|
+
}
|
|
80
|
+
|
|
28
81
|
@implementation NotifeeCoreUNUserNotificationCenter
|
|
29
82
|
|
|
30
83
|
struct {
|
|
@@ -47,25 +100,41 @@ struct {
|
|
|
47
100
|
}
|
|
48
101
|
|
|
49
102
|
- (void)observe {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
103
|
+
[self rechainUserNotificationCenterDelegate];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
- (void)refreshOriginalDelegateSelectorFlags {
|
|
107
|
+
id<UNUserNotificationCenterDelegate> originalDelegate = self.originalDelegate;
|
|
108
|
+
|
|
109
|
+
originalUNCDelegateRespondsTo.openSettingsForNotification =
|
|
110
|
+
originalDelegate != nil &&
|
|
111
|
+
[originalDelegate respondsToSelector:@selector(userNotificationCenter:
|
|
112
|
+
openSettingsForNotification:)];
|
|
113
|
+
originalUNCDelegateRespondsTo.willPresentNotification =
|
|
114
|
+
originalDelegate != nil &&
|
|
115
|
+
[originalDelegate respondsToSelector:@selector
|
|
116
|
+
(userNotificationCenter:willPresentNotification:withCompletionHandler:)];
|
|
117
|
+
originalUNCDelegateRespondsTo.didReceiveNotificationResponse =
|
|
118
|
+
originalDelegate != nil &&
|
|
119
|
+
[originalDelegate
|
|
60
120
|
respondsToSelector:@selector(userNotificationCenter:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
121
|
+
didReceiveNotificationResponse:withCompletionHandler:)];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
- (void)rechainUserNotificationCenterDelegate {
|
|
125
|
+
@synchronized(self) {
|
|
126
|
+
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
|
|
127
|
+
id<UNUserNotificationCenterDelegate> currentDelegate = center.delegate;
|
|
128
|
+
|
|
129
|
+
if (currentDelegate == self) {
|
|
130
|
+
[self refreshOriginalDelegateSelectorFlags];
|
|
131
|
+
return;
|
|
66
132
|
}
|
|
67
|
-
|
|
68
|
-
|
|
133
|
+
|
|
134
|
+
self.originalDelegate = currentDelegate;
|
|
135
|
+
[self refreshOriginalDelegateSelectorFlags];
|
|
136
|
+
center.delegate = self;
|
|
137
|
+
}
|
|
69
138
|
}
|
|
70
139
|
|
|
71
140
|
- (void)markInitialNotificationGathered {
|
|
@@ -176,9 +245,11 @@ struct {
|
|
|
176
245
|
}
|
|
177
246
|
|
|
178
247
|
} else if (_originalDelegate != nil && originalUNCDelegateRespondsTo.willPresentNotification) {
|
|
248
|
+
NotifeeCorePresentationCompletionHandler oneShotCompletionHandler =
|
|
249
|
+
NotifeeCoreOneShotPresentationCompletionHandler(completionHandler);
|
|
179
250
|
[_originalDelegate userNotificationCenter:center
|
|
180
251
|
willPresentNotification:notification
|
|
181
|
-
withCompletionHandler:
|
|
252
|
+
withCompletionHandler:oneShotCompletionHandler];
|
|
182
253
|
} else {
|
|
183
254
|
// No original delegate captured and the notification is not Notifee-owned.
|
|
184
255
|
// Returning UNNotificationPresentationOptionNone would silently drop the
|
|
@@ -214,9 +285,11 @@ struct {
|
|
|
214
285
|
// Flag OFF: always forward to original delegate, never parse as Notifee
|
|
215
286
|
if (_originalDelegate != nil &&
|
|
216
287
|
originalUNCDelegateRespondsTo.didReceiveNotificationResponse) {
|
|
288
|
+
NotifeeCoreVoidCompletionHandler oneShotCompletionHandler =
|
|
289
|
+
NotifeeCoreOneShotVoidCompletionHandler(completionHandler);
|
|
217
290
|
[_originalDelegate userNotificationCenter:center
|
|
218
291
|
didReceiveNotificationResponse:response
|
|
219
|
-
withCompletionHandler:
|
|
292
|
+
withCompletionHandler:oneShotCompletionHandler];
|
|
220
293
|
} else {
|
|
221
294
|
completionHandler();
|
|
222
295
|
}
|
|
@@ -224,9 +297,11 @@ struct {
|
|
|
224
297
|
}
|
|
225
298
|
// Flag ON (default): existing behavior
|
|
226
299
|
if (_originalDelegate != nil && originalUNCDelegateRespondsTo.didReceiveNotificationResponse) {
|
|
300
|
+
NotifeeCoreVoidCompletionHandler oneShotCompletionHandler =
|
|
301
|
+
NotifeeCoreOneShotVoidCompletionHandler(completionHandler);
|
|
227
302
|
[_originalDelegate userNotificationCenter:center
|
|
228
303
|
didReceiveNotificationResponse:response
|
|
229
|
-
withCompletionHandler:
|
|
304
|
+
withCompletionHandler:oneShotCompletionHandler];
|
|
230
305
|
return;
|
|
231
306
|
} else {
|
|
232
307
|
notifeeNotification =
|
|
@@ -26,6 +26,10 @@
|
|
|
26
26
|
#import "NotifeeCoreExtensionHelper.h"
|
|
27
27
|
#import "NotifeeCoreUtil.h"
|
|
28
28
|
|
|
29
|
+
@interface NotifeeCoreUNUserNotificationCenter (Rechain)
|
|
30
|
+
- (void)rechainUserNotificationCenterDelegate;
|
|
31
|
+
@end
|
|
32
|
+
|
|
29
33
|
static NSString *const kNotifeeRollingPublicId = @"notifee_rolling_public_id";
|
|
30
34
|
static NSString *const kNotifeeRollingOccurrenceMs = @"notifee_rolling_occurrence_ms";
|
|
31
35
|
static NSString *const kNotifeeRollingInternalId = @"notifee_rolling_internal_id";
|
|
@@ -1140,6 +1144,8 @@ typedef NS_ENUM(NSInteger, NotifeeCoreRollingErrorCode) {
|
|
|
1140
1144
|
* @param block notifeeMethodVoidBlock
|
|
1141
1145
|
*/
|
|
1142
1146
|
+ (void)displayNotification:(NSDictionary *)notification withBlock:(notifeeMethodVoidBlock)block {
|
|
1147
|
+
[[NotifeeCoreUNUserNotificationCenter instance] rechainUserNotificationCenterDelegate];
|
|
1148
|
+
|
|
1143
1149
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
1144
1150
|
UNMutableNotificationContent *content = [self buildNotificationContent:notification
|
|
1145
1151
|
withTrigger:nil];
|
|
@@ -1223,6 +1229,8 @@ typedef NS_ENUM(NSInteger, NotifeeCoreRollingErrorCode) {
|
|
|
1223
1229
|
+ (void)createTriggerNotification:(NSDictionary *)notification
|
|
1224
1230
|
withTrigger:(NSDictionary *)trigger
|
|
1225
1231
|
withBlock:(notifeeMethodVoidBlock)block {
|
|
1232
|
+
[[NotifeeCoreUNUserNotificationCenter instance] rechainUserNotificationCenterDelegate];
|
|
1233
|
+
|
|
1226
1234
|
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
|
|
1227
1235
|
UNMutableNotificationContent *content =
|
|
1228
1236
|
[self triggerNotificationContentForNotification:notification trigger:trigger];
|
|
@@ -1543,6 +1551,8 @@ typedef NS_ENUM(NSInteger, NotifeeCoreRollingErrorCode) {
|
|
|
1543
1551
|
*/
|
|
1544
1552
|
+ (void)requestPermission:(NSDictionary *)permissions
|
|
1545
1553
|
withBlock:(notifeeMethodNSDictionaryBlock)block {
|
|
1554
|
+
[[NotifeeCoreUNUserNotificationCenter instance] rechainUserNotificationCenterDelegate];
|
|
1555
|
+
|
|
1546
1556
|
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
|
|
1547
1557
|
|
|
1548
1558
|
UNAuthorizationOptions options = UNAuthorizationOptionNone;
|
|
@@ -1678,6 +1688,8 @@ typedef NS_ENUM(NSInteger, NotifeeCoreRollingErrorCode) {
|
|
|
1678
1688
|
}
|
|
1679
1689
|
|
|
1680
1690
|
+ (void)getInitialNotification:(notifeeMethodNSDictionaryBlock)block {
|
|
1691
|
+
[[NotifeeCoreUNUserNotificationCenter instance] rechainUserNotificationCenterDelegate];
|
|
1692
|
+
|
|
1681
1693
|
[NotifeeCoreUNUserNotificationCenter instance].initialNotificationBlock = block;
|
|
1682
1694
|
[[NotifeeCoreUNUserNotificationCenter instance] getInitialNotification];
|
|
1683
1695
|
}
|
|
@@ -1784,6 +1796,7 @@ typedef NS_ENUM(NSInteger, NotifeeCoreRollingErrorCode) {
|
|
|
1784
1796
|
[NotifeeCoreUNUserNotificationCenter instance].shouldHandleRemoteNotifications =
|
|
1785
1797
|
[config[@"ios"][@"handleRemoteNotifications"] boolValue];
|
|
1786
1798
|
}
|
|
1799
|
+
[[NotifeeCoreUNUserNotificationCenter instance] rechainUserNotificationCenterDelegate];
|
|
1787
1800
|
block(nil);
|
|
1788
1801
|
}
|
|
1789
1802
|
|
|
@@ -18,6 +18,11 @@
|
|
|
18
18
|
#import "NotifeeApiModule.h"
|
|
19
19
|
#import <React/RCTUtils.h>
|
|
20
20
|
#import <UIKit/UIKit.h>
|
|
21
|
+
#import "NotifeeCore+UNUserNotificationCenter.h"
|
|
22
|
+
|
|
23
|
+
@interface NotifeeCoreUNUserNotificationCenter (Rechain)
|
|
24
|
+
- (void)rechainUserNotificationCenterDelegate;
|
|
25
|
+
@end
|
|
21
26
|
|
|
22
27
|
static NSString *kReactNativeNotifeeNotificationEvent = @"app.notifee.notification-event";
|
|
23
28
|
static NSString *kReactNativeNotifeeNotificationBackgroundEvent =
|
|
@@ -56,6 +61,8 @@ RCT_EXPORT_MODULE();
|
|
|
56
61
|
}
|
|
57
62
|
|
|
58
63
|
- (void)startObserving {
|
|
64
|
+
[[NotifeeCoreUNUserNotificationCenter instance] rechainUserNotificationCenterDelegate];
|
|
65
|
+
|
|
59
66
|
NSArray *eventsToFlush;
|
|
60
67
|
@synchronized(self) {
|
|
61
68
|
hasListeners = YES;
|