Skip to content

Commit 34423f8

Browse files
committed
Add SMS integration
* Add setSMSNumber and logoutSMSNumber methods * Add example app SMS Number input and buttons
1 parent 70e570c commit 34423f8

File tree

4 files changed

+146
-0
lines changed

4 files changed

+146
-0
lines changed

android/src/main/java/com/onesignal/flutter/OneSignalPlugin.java

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ else if (call.method.contentEquals("OneSignal#setEmail"))
109109
this.setEmail(call, result);
110110
else if (call.method.contentEquals("OneSignal#logoutEmail"))
111111
this.logoutEmail(result);
112+
else if (call.method.contentEquals("OneSignal#setSMSNumber"))
113+
this.setSMSNumber(call, result);
114+
else if (call.method.contentEquals("OneSignal#logoutSMSNumber"))
115+
this.logoutSMSNumber(result);
112116
else if (call.method.contentEquals("OneSignal#setExternalUserId"))
113117
this.setExternalUserId(call, result);
114118
else if (call.method.contentEquals("OneSignal#removeExternalUserId"))
@@ -284,6 +288,51 @@ public void onFailure(EmailUpdateError error) {
284288
});
285289
}
286290

291+
private void setSMSNumber(MethodCall call, final Result reply) {
292+
String smsNumber = call.argument("smsNumber");
293+
String smsAuthHashToken = call.argument("smsAuthHashToken");
294+
295+
OneSignal.setSMSNumber(smsNumber, smsAuthHashToken, new OneSignal.OSSMSUpdateHandler() {
296+
@Override
297+
public void onSuccess(JSONObject result) {
298+
try {
299+
replySuccess(reply, OneSignalSerializer.convertJSONObjectToHashMap(result));
300+
} catch (JSONException e) {
301+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR,
302+
"Encountered an error attempting to deserialize server response for setSMSNumber: " + e.getMessage());
303+
}
304+
}
305+
306+
@Override
307+
public void onFailure(OneSignal.OSSMSUpdateError error) {
308+
replyError(reply, "OneSignal",
309+
"Encountered an error setting SMS Number: " + error.getMessage(),
310+
null);
311+
}
312+
});
313+
}
314+
315+
private void logoutSMSNumber(final Result reply) {
316+
OneSignal.logoutSMSNumber(new OneSignal.OSSMSUpdateHandler() {
317+
@Override
318+
public void onSuccess(JSONObject result) {
319+
try {
320+
replySuccess(reply, OneSignalSerializer.convertJSONObjectToHashMap(result));
321+
} catch (JSONException e) {
322+
OneSignal.onesignalLog(OneSignal.LOG_LEVEL.ERROR,
323+
"Encountered an error attempting to deserialize server response for logoutSMSNumber: " + e.getMessage());
324+
}
325+
}
326+
327+
@Override
328+
public void onFailure(OneSignal.OSSMSUpdateError error) {
329+
replyError(reply, "OneSignal",
330+
"Encountered an error logging out SMS number: " + error.getMessage(),
331+
null);
332+
}
333+
});
334+
}
335+
287336
private void setExternalUserId(MethodCall call, final Result result) {
288337
String externalUserId = call.argument("externalUserId");
289338
String authHashToken = call.argument("authHashToken");

example/lib/main.dart

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class MyApp extends StatefulWidget {
1414
class _MyAppState extends State<MyApp> {
1515
String _debugLabelString = "";
1616
String? _emailAddress;
17+
String? _smsNumber;
1718
String? _externalUserId;
1819
bool _enableConsentButton = false;
1920

@@ -161,13 +162,36 @@ class _MyAppState extends State<MyApp> {
161162

162163
void _handleLogoutEmail() {
163164
print("Logging out of email");
165+
164166
OneSignal.shared.logoutEmail().then((v) {
165167
print("Successfully logged out of email");
166168
}).catchError((error) {
167169
print("Failed to log out of email: $error");
168170
});
169171
}
170172

173+
void _handleSetSMSNumber() {
174+
if (_smsNumber == null) return;
175+
176+
print("Setting SMS Number");
177+
178+
OneSignal.shared.setSMSNumber(smsNumber: _smsNumber!).then((response) {
179+
print("Successfully set SMSNumber with response $response");
180+
}).catchError((error) {
181+
print("Failed to set SMS Number with error: $error");
182+
});
183+
}
184+
185+
void _handleLogoutSMSNumber() {
186+
print("Logging out of smsNumber");
187+
188+
OneSignal.shared.logoutSMSNumber().then((response) {
189+
print("Successfully logoutEmail with response $response");
190+
}).catchError((error) {
191+
print("Failed to log out of SMSNumber: $error");
192+
});
193+
}
194+
171195
void _handleConsent() {
172196
print("Setting consent to true");
173197
OneSignal.shared.consentGranted(true);
@@ -386,6 +410,34 @@ class _MyAppState extends State<MyApp> {
386410
new OneSignalButton("Logout Email", _handleLogoutEmail,
387411
!_enableConsentButton)
388412
]),
413+
new TableRow(children: [
414+
new TextField(
415+
textAlign: TextAlign.center,
416+
decoration: InputDecoration(
417+
hintText: "SMS Number",
418+
labelStyle: TextStyle(
419+
color: Color.fromARGB(255, 212, 86, 83),
420+
)),
421+
onChanged: (text) {
422+
this.setState(() {
423+
_smsNumber = text == "" ? null : text;
424+
});
425+
},
426+
)
427+
]),
428+
new TableRow(children: [
429+
Container(
430+
height: 8.0,
431+
)
432+
]),
433+
new TableRow(children: [
434+
new OneSignalButton(
435+
"Set SMS Number", _handleSetSMSNumber, !_enableConsentButton)
436+
]),
437+
new TableRow(children: [
438+
new OneSignalButton("Logout SMS Number", _handleLogoutSMSNumber,
439+
!_enableConsentButton)
440+
]),
389441
new TableRow(children: [
390442
new OneSignalButton("Provide GDPR Consent", _handleConsent,
391443
_enableConsentButton)

ios/Classes/OneSignalPlugin.m

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,10 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
133133
[self setEmail:call withResult:result];
134134
else if ([@"OneSignal#logoutEmail" isEqualToString:call.method])
135135
[self logoutEmail:call withResult:result];
136+
else if ([@"OneSignal#setSMSNumber" isEqualToString:call.method])
137+
[self setSMSNumber:call withResult:result];
138+
else if ([@"OneSignal#logoutSMSNumber" isEqualToString:call.method])
139+
[self logoutSMSNumber:call withResult:result];
136140
else if ([@"OneSignal#setExternalUserId" isEqualToString:call.method])
137141
[self setExternalUserId:call withResult:result];
138142
else if ([@"OneSignal#removeExternalUserId" isEqualToString:call.method])
@@ -265,6 +269,28 @@ - (void)logoutEmail:(FlutterMethodCall *)call withResult:(FlutterResult)result {
265269
}];
266270
}
267271

272+
- (void)setSMSNumber:(FlutterMethodCall *)call withResult:(FlutterResult)result {
273+
NSString *smsNumber = call.arguments[@"smsNumber"];
274+
NSString *smsAuthHashToken = call.arguments[@"smsAuthHashToken"];
275+
276+
if ([smsAuthHashToken isKindOfClass:[NSNull class]])
277+
smsAuthHashToken = nil;
278+
279+
[OneSignal setSMSNumber:smsNumber withSMSAuthHashToken:smsAuthHashToken withSuccess:^(NSDictionary *results){
280+
result(results);
281+
} withFailure:^(NSError *error) {
282+
result(error.flutterError);
283+
}];
284+
}
285+
286+
- (void)logoutSMSNumber:(FlutterMethodCall *)call withResult:(FlutterResult)result {
287+
[OneSignal logoutSMSNumberWithSuccess:^(NSDictionary *results){
288+
result(results);
289+
} withFailure:^(NSError *error) {
290+
result(error.flutterError);
291+
}];
292+
}
293+
268294
- (void)setExternalUserId:(FlutterMethodCall *)call withResult:(FlutterResult)result {
269295
id externalId = call.arguments[@"externalUserId"];
270296
id authHashToken = call.arguments[@"authHashToken"];

lib/onesignal_flutter.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,25 @@ class OneSignal {
285285
return await _channel.invokeMethod("OneSignal#logoutEmail");
286286
}
287287

288+
/// Sets the user's SMS number so you can send them SMSs through the OneSignal dashboard
289+
/// and API. The `smsAuthHashToken` is optional (but highly recommended) as part of
290+
/// Identity Verification. The SMS auth hash is a hash of your app's API key and the
291+
/// user ID. We recommend you generate this token from your backend server, do NOT
292+
/// store your API key in your app as this is highly insecure.
293+
Future<Map<String, dynamic>> setSMSNumber({required String smsNumber, String? smsAuthHashToken}) async {
294+
Map<dynamic, dynamic> results =
295+
await _channel.invokeMethod("OneSignal#setSMSNumber", {'smsNumber': smsNumber, 'smsAuthHashToken': smsAuthHashToken});
296+
return results.cast<String, dynamic>();
297+
}
298+
299+
/// Dissociates the user's SMS number from OneSignal, akin to turning off push notifications
300+
/// for SMS number.
301+
Future<Map<String, dynamic>> logoutSMSNumber() async {
302+
Map<dynamic, dynamic> results =
303+
await _channel.invokeMethod("OneSignal#logoutSMSNumber");
304+
return results.cast<String, dynamic>();
305+
}
306+
288307
/// OneSignal allows you to set a custom ID for your users. This makes it so that
289308
/// if your app has its own user ID's, you can use your own custom user ID's with
290309
/// our API instead of having to save their OneSignal user ID's.

0 commit comments

Comments
 (0)