Skip to content

Commit

Permalink
allows unsafe suppression of change alert ios only
Browse files Browse the repository at this point in the history
  • Loading branch information
NoodleOfDeath committed May 18, 2024
1 parent 6f2b68e commit c271faf
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 10 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ yarn-error.log
# Android
local.properties
.idea/
.gradle/
.gradle/
**/xcuserdata/
8 changes: 6 additions & 2 deletions NativeChangeIcon.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

export type IconChangeOptions = {
/** iOS only - prevents alert from appearing */
useUnsafeSupressAlert?: boolean;
}
export interface Spec extends TurboModule {
readonly getConstants: () => {};
changeIcon: (iconName?: string) => Promise<string>;
resetIcon: () => Promise<string>;
changeIcon: (iconName?: string, options?: IconChangeOptions) => Promise<string>;
resetIcon: (optionsv: IconChangeOptions) => Promise<string>;
getIcon: () => Promise<string>;
}

Expand Down
30 changes: 25 additions & 5 deletions ios/ChangeIcon.mm
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ + (BOOL)requiresMainQueueSetup {
});
}

RCT_REMAP_METHOD(changeIcon, iconName:(NSString *)iconName resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
RCT_REMAP_METHOD(changeIcon, iconName:(NSString *)iconName options:(NSDictionary *)options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
dispatch_async(dispatch_get_main_queue(), ^{

Bool useUnsafeSuppressAlert = [[options objectForKey: @"useUnsafeSuppressAlert"] boolValue];
NSError *error = nil;

if ([[UIApplication sharedApplication] supportsAlternateIcons] == NO) {
Expand All @@ -42,10 +44,28 @@ + (BOOL)requiresMainQueueSetup {
newIconName = iconName;
resolve(newIconName);
}

[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
return;
}];

if (useUnsafeSuppressAlert == true) {
@try {
typedef void (*setAlternateIconName)(NSObject *, SEL, NSString *, void (^)(NSError *));
NSString *selectorString = @"_setAlternateIconName:completionHandler:";
SEL selector = NSSelectorFromString(selectorString);
IMP imp = [[UIApplication sharedApplication] methodForSelector:selector];
setAlternateIconName method = (setAlternateIconName)imp;
method([UIApplication sharedApplication], selector, iconName, ^(NSError *error) {});
}
@catch {
// fallback on safe method
[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
return;
}];
}
} else {
[[UIApplication sharedApplication] setAlternateIconName:newIconName completionHandler:^(NSError * _Nullable error) {
return;
}];
}

});
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
9 changes: 7 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
import { NativeModules } from "react-native";

export const changeIcon = (iconName?: string): Promise<string> => NativeModules.ChangeIcon.changeIcon(iconName);
export const resetIcon = () => changeIcon();
export type IconChangeOptions = {
/** iOS only - prevents alert from appearing */
useUnsafeSupressAlert?: boolean;
}

export const changeIcon = (iconName?: string, options?: IconChangeOptions): Promise<string> => NativeModules.ChangeIcon.changeIcon(iconName, options);
export const resetIcon = (options?: IconChangeOptions) => changeIcon(undefined, options);
export const getIcon = (): Promise<string> => NativeModules.ChangeIcon.getIcon();

0 comments on commit c271faf

Please sign in to comment.