Skip to content

Commit ba104f2

Browse files
committed
allows unsafe suppression of change alert ios only
1 parent 6f2b68e commit ba104f2

File tree

6 files changed

+50
-11
lines changed

6 files changed

+50
-11
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,5 @@ yarn-error.log
1414
# Android
1515
local.properties
1616
.idea/
17-
.gradle/
17+
.gradle/
18+
**/xcuserdata/

NativeChangeIcon.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import type { TurboModule } from 'react-native';
22
import { TurboModuleRegistry } from 'react-native';
33

4+
export type IconChangeOptions = {
5+
/** iOS only - prevents alert from appearing */
6+
useUnsafeSupressAlert?: boolean;
7+
}
48
export interface Spec extends TurboModule {
59
readonly getConstants: () => {};
6-
changeIcon: (iconName?: string) => Promise<string>;
7-
resetIcon: () => Promise<string>;
10+
changeIcon: (iconName?: string, options?: IconChangeOptions) => Promise<string>;
11+
resetIcon: (optionsv: IconChangeOptions) => Promise<string>;
812
getIcon: () => Promise<string>;
913
}
1014

android/src/main/java/com/reactnativechangeicon/ChangeIconModule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.facebook.react.bridge.ReactApplicationContext;
1313
import com.facebook.react.bridge.ReactContextBaseJavaModule;
1414
import com.facebook.react.bridge.ReactMethod;
15+
import com.facebook.react.bridge.ReadableMap;
1516
import com.facebook.react.module.annotations.ReactModule;
1617

1718
import java.util.HashSet;
@@ -60,7 +61,7 @@ public void getIcon(Promise promise) {
6061
}
6162

6263
@ReactMethod
63-
public void changeIcon(String iconName, Promise promise) {
64+
public void changeIcon(String iconName, ReadableMap params, Promise promise) {
6465
final Activity activity = getCurrentActivity();
6566
final String activityName = activity.getComponentName().getClassName();
6667
if (activity == null) {

ios/ChangeIcon.mm

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@ + (BOOL)requiresMainQueueSetup {
1818
});
1919
}
2020

21-
RCT_REMAP_METHOD(changeIcon, iconName:(NSString *)iconName resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
21+
RCT_REMAP_METHOD(changeIcon, iconName:(NSString *)iconName options:(NSDictionary *)options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
2222
dispatch_async(dispatch_get_main_queue(), ^{
23+
24+
Bool useUnsafeSuppressAlert = [[options objectForKey: @"useUnsafeSuppressAlert"] boolValue];
2325
NSError *error = nil;
2426

2527
if ([[UIApplication sharedApplication] supportsAlternateIcons] == NO) {
@@ -42,10 +44,28 @@ + (BOOL)requiresMainQueueSetup {
4244
newIconName = iconName;
4345
resolve(newIconName);
4446
}
45-
46-
[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
47-
return;
48-
}];
47+
48+
if (useUnsafeSuppressAlert == true) {
49+
@try {
50+
typedef void (*setAlternateIconName)(NSObject *, SEL, NSString *, void (^)(NSError *));
51+
NSString *selectorString = @"_setAlternateIconName:completionHandler:";
52+
SEL selector = NSSelectorFromString(selectorString);
53+
IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];
54+
setAlternateIconName method = (setAlternateIconName)imp;
55+
method([UIApplication sharedApplication], selector, iconName, ^(NSError *error) {});
56+
}
57+
@catch {
58+
// fallback on safe method
59+
[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
60+
return;
61+
}];
62+
}
63+
} else {
64+
[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
65+
return;
66+
}];
67+
}
68+
4969
});
5070
}
5171

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3+
<plist version="1.0">
4+
<dict>
5+
<key>IDEDidComputeMac32BitWarning</key>
6+
<true/>
7+
</dict>
8+
</plist>

src/index.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { NativeModules } from "react-native";
22

3-
export const changeIcon = (iconName?: string): Promise<string> => NativeModules.ChangeIcon.changeIcon(iconName);
4-
export const resetIcon = () => changeIcon();
3+
export type IconChangeOptions = {
4+
/** iOS only - prevents alert from appearing */
5+
useUnsafeSupressAlert?: boolean;
6+
}
7+
8+
export const changeIcon = (iconName?: string, options?: IconChangeOptions): Promise<string> => NativeModules.ChangeIcon.changeIcon(iconName, options);
9+
export const resetIcon = (options?: IconChangeOptions) => changeIcon(undefined, options);
510
export const getIcon = (): Promise<string> => NativeModules.ChangeIcon.getIcon();

0 commit comments

Comments
 (0)