Skip to content
This repository was archived by the owner on Apr 4, 2023. It is now read-only.

Commit 8ed90be

Browse files
In App Messaging throws this error #1203
Feature Request: Support In-App Messaging #1112
1 parent f0950bf commit 8ed90be

15 files changed

+332
-49
lines changed

demo-vue/app/App_Resources/iOS/build.xcconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// You can add custom settings here
22
// for example you can uncomment the following line to force distribution code signing
3-
// CODE_SIGN_IDENTITY = iPhone Distribution
3+
// CODE_SIGN_IDENTITY = iPhone Distribution
44
// To build for device with Xcode 8 you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html
55
// DEVELOPMENT_TEAM = YOUR_TEAM_ID;
66
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;

demo-vue/app/components/App.vue

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,46 +6,42 @@
66
<!--<Button @tap="onTapHasPermission" class="btn" text="Has Permission?"></Button>-->
77
<!--<Button @tap="onTapScheduleNotification" class="btn" text="Schedule Notification"></Button>-->
88
<!--<Button @tap="onTapCancelAll" class="btn" text="Cancel notifications"></Button>-->
9-
<Label class="message" :text="message" textWrap="true"></Label>
10-
<MLKitTextRecognition width="260"
9+
<Label class="message" :text="message" textWrap="true" horizontalAlignment="center"></Label>
10+
<!--MLKitTextRecognition width="260"
1111
height="340"
1212
processEveryNthFrame="5"
1313
@scanResult="onTextRecognitionResult">
14-
</MLKitTextRecognition>
14+
</MLKitTextRecognition-->
1515

1616
</StackLayout>
1717
</Page>
1818
</template>
1919

2020
<script>
2121
const firebase = require("nativescript-plugin-firebase");
22-
23-
firebase.init({
24-
onDynamicLinkCallback: function (result) {
25-
console.log("Dynamic Link received: " + result);
26-
console.log("Dynamic Link received, url: " + result.url);
27-
if (result.url.indexOf("/campaigns/shit") > -1) {
28-
// note that you could deeplink/route the user now, but let's just show an alert
29-
alert({
30-
title: "Campaign button tapped!",
31-
message: "You tapped the button in the 'Firebase is the 💩' campaign - well don!",
32-
okButtonText: "Yep!"
33-
})
34-
}
35-
}
36-
}).then(function () {
37-
console.log("Firebase initialized");
38-
}).catch(function (error) {
39-
console.log("Error initializing Firebase: " + error);
40-
});
22+
import { inappmessaging } from "nativescript-plugin-firebase/inappmessaging";
4123
4224
export default {
4325
data() {
4426
return {
45-
message: "Tap a button above.."
27+
message: "Fear not, young Skywalker"
4628
}
4729
},
4830
31+
created() {
32+
// wire up an 'onMessageClicked' callback
33+
inappmessaging.onMessageClicked(message => {
34+
console.log(">> inappmessaging onMessageClicked, campaign: " + message.campaignName);
35+
this.message = `Campaign ${message.campaignName} clicked`;
36+
});
37+
38+
// 👉 .. and for fun, wire an 'onMessageImpression' callback so when know when the message is shown
39+
inappmessaging.onMessageImpression(message => {
40+
console.log(">> inappmessaging onMessageImpression, campaign: " + message.campaignName);
41+
this.message = `Campaign ${message.campaignName} seen`;
42+
});
43+
},
44+
4945
methods: {
5046
onTextRecognitionResult() {
5147
console.log("onTextRecognitionResult");
@@ -124,8 +120,8 @@
124120
}
125121
126122
.message {
127-
font-size: 14;
128-
margin: 16;
123+
font-size: 17;
124+
margin: 17;
129125
color: #53ba82;
130126
}
131127

demo-vue/app/main.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,25 @@
11
import Vue from "nativescript-vue";
22
import App from "./components/App";
33

4-
require("nativescript-plugin-firebase");
4+
const firebase = require("nativescript-plugin-firebase");
55
Vue.registerElement("MLKitTextRecognition", () => require("nativescript-plugin-firebase/mlkit/textrecognition").MLKitTextRecognition);
66

77
// Prints Vue logs when --env.production is *NOT* set while building
88
Vue.config.silent = (TNS_ENV === "production");
99

10+
firebase.init({
11+
// can be used to catch in-app-messaging dynamic links, but it's not mandatory
12+
onDynamicLinkCallback: result => {
13+
console.log("Dynamic Link received: " + result);
14+
console.log("Dynamic Link received, url: " + result.url);
15+
if (result.url.indexOf("/shit") > -1) {
16+
// note that you could deeplink/route the user now, but let's just show an alert
17+
}
18+
}
19+
})
20+
.then(() => console.log("Firebase initialized"))
21+
.catch(error => console.log("Error initializing Firebase: " + error));
22+
1023
new Vue({
1124
render: h => h('frame', [h(App)])
1225
}).$start();
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { OnMessageCallbackData } from "./inappmessaging";
2+
3+
export function onMessageClicked(callback: (data: OnMessageCallbackData) => void): void {
4+
const listener = new com.google.firebase.inappmessaging.FirebaseInAppMessagingClickListener({
5+
messageClicked: (message: com.google.firebase.inappmessaging.model.InAppMessage, action: com.google.firebase.inappmessaging.model.Action) => {
6+
console.log(">> listener, messageClicked");
7+
console.log(">> listener, messageClicked, message: " + message);
8+
console.log(">> listener, messageClicked, action: " + action);
9+
console.log(">> listener, messageClicked, campaign: " + message.getCampaignName());
10+
callback({
11+
campaignName: message.getCampaignName()
12+
})
13+
}
14+
});
15+
16+
com.google.firebase.inappmessaging.FirebaseInAppMessaging.getInstance().addClickListener(listener)
17+
}
18+
19+
export function onMessageImpression(callback: (data: OnMessageCallbackData) => void): void {
20+
const listener = new com.google.firebase.inappmessaging.FirebaseInAppMessagingImpressionListener({
21+
impressionDetected: (message: com.google.firebase.inappmessaging.model.InAppMessage) => {
22+
console.log(">> listener, impressionDetected");
23+
console.log(">> listener, impressionDetected, message: " + message);
24+
console.log(">> listener, impressionDetected, campaign: " + message.getCampaignName());
25+
callback({
26+
campaignName: message.getCampaignName()
27+
})
28+
}
29+
});
30+
31+
com.google.firebase.inappmessaging.FirebaseInAppMessaging.getInstance().addImpressionListener(listener)
32+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface OnMessageCallbackData {
2+
campaignName: string;
3+
}
4+
5+
export declare function onMessageClicked(callback: (data: OnMessageCallbackData) => void): void;
6+
7+
export declare function onMessageImpression(callback: (data: OnMessageCallbackData) => void): void;
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { OnMessageCallbackData } from "./inappmessaging";
2+
3+
let _firInAppMessagingDisplayDelegate: FIRInAppMessagingDisplayDelegateImpl;
4+
5+
export function onMessageClicked(callback: (data: OnMessageCallbackData) => void): void {
6+
ensureDelegate();
7+
_firInAppMessagingDisplayDelegate.setOnMessageClickedCallback(callback);
8+
}
9+
10+
export function onMessageImpression(callback: (data: OnMessageCallbackData) => void): void {
11+
ensureDelegate();
12+
_firInAppMessagingDisplayDelegate.setOnMessageImpressionCallback(callback);
13+
}
14+
15+
function ensureDelegate(): void {
16+
if (!_firInAppMessagingDisplayDelegate) {
17+
FIRInAppMessaging.inAppMessaging().delegate = _firInAppMessagingDisplayDelegate = FIRInAppMessagingDisplayDelegateImpl.new();
18+
}
19+
}
20+
21+
class FIRInAppMessagingDisplayDelegateImpl extends NSObject implements FIRInAppMessagingDisplayDelegate {
22+
public static ObjCProtocols = [];
23+
24+
static new(): FIRInAppMessagingDisplayDelegateImpl {
25+
if (FIRInAppMessagingDisplayDelegateImpl.ObjCProtocols.length === 0 && typeof (FIRInAppMessagingDisplayDelegate) !== "undefined") {
26+
FIRInAppMessagingDisplayDelegateImpl.ObjCProtocols.push(FIRInAppMessagingDisplayDelegate);
27+
}
28+
return <FIRInAppMessagingDisplayDelegateImpl>super.new();
29+
}
30+
31+
private onMessageClickedCallback: (data: OnMessageCallbackData) => void;
32+
private onMessageImpressionCallback: (data: OnMessageCallbackData) => void;
33+
34+
public setOnMessageClickedCallback(callback: (data: OnMessageCallbackData) => void): void {
35+
this.onMessageClickedCallback = callback;
36+
}
37+
38+
public setOnMessageImpressionCallback(callback: (data: OnMessageCallbackData) => void): void {
39+
this.onMessageImpressionCallback = callback;
40+
}
41+
42+
displayErrorForMessageError(inAppMessage: FIRInAppMessagingDisplayMessage, error: NSError): void {
43+
console.log("InAppMessaging error: " + error.localizedDescription);
44+
}
45+
46+
impressionDetectedForMessage(inAppMessage: FIRInAppMessagingDisplayMessage): void {
47+
console.log("InAppMessaging impression");
48+
this.onMessageImpressionCallback && this.onMessageImpressionCallback({
49+
campaignName: inAppMessage.campaignInfo.campaignName
50+
});
51+
}
52+
53+
messageClicked(inAppMessage: FIRInAppMessagingDisplayMessage): void {
54+
console.log("InAppMessaging clicked");
55+
this.onMessageClickedCallback && this.onMessageClickedCallback({
56+
campaignName: inAppMessage.campaignInfo.campaignName
57+
});
58+
}
59+
60+
messageDismissedDismissType(inAppMessage: FIRInAppMessagingDisplayMessage, dismissType: FIRInAppMessagingDismissType): void {
61+
console.log("InAppMessaging dismissed");
62+
}
63+
}

src/inappmessaging/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import * as inappmessage from "./inappmessaging";
2+
export const inappmessaging = inappmessage;

src/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ export * from './crashlytics';
88
export * from './performance';
99
export * from './storage';
1010
export * from './messaging';
11+
export * from './inappmessaging';
1112
import * as ml from './mlkit';
1213
export declare const mlkit: typeof ml;

src/platforms/ios/typings/objc!FirebaseFunctions.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@ declare class FIRHTTPSCallable extends NSObject {
6565

6666
static new(): FIRHTTPSCallable; // inherited from NSObject
6767

68+
timeoutInterval: number;
69+
6870
callWithCompletion(completion: (p1: FIRHTTPSCallableResult, p2: NSError) => void): void;
6971

7072
callWithObjectCompletion(data: any, completion: (p1: FIRHTTPSCallableResult, p2: NSError) => void): void;

0 commit comments

Comments
 (0)