From a3792357ee651feaa523a7849b1fa7c7a03fcd48 Mon Sep 17 00:00:00 2001 From: Eric Samelson Date: Wed, 30 Oct 2019 22:23:24 -0700 Subject: [PATCH] Revert "[ios][android][docs] Supports rich content (image, audio, and video) in push notifications (#4787)" This reverts commit 3bd027a087c5ab3e23e060506f69b966869c8c48. --- CHANGELOG.md | 1 - .../notifications/PushNotificationHelper.java | 79 +------------- .../api/registerForPushNotificationsAsync.ts | 65 +---------- .../src/screens/NotificationScreen.tsx | 38 +------ apps/test-suite/tests/Notifications.js | 84 --------------- .../unversioned/guides/push-notifications.md | 97 ----------------- .../ExNotificationService.h | 7 -- .../ExNotificationService.m | 102 ------------------ .../Info.plist | 31 ------ ios/Exponent.xcodeproj/project.pbxproj | 101 ----------------- 10 files changed, 13 insertions(+), 592 deletions(-) delete mode 100644 ios/ExpoNotificationServiceExtension/ExNotificationService.h delete mode 100644 ios/ExpoNotificationServiceExtension/ExNotificationService.m delete mode 100644 ios/ExpoNotificationServiceExtension/Info.plist diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c0d0c83d879b..c39dd266f2bcd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,6 @@ This is the log of notable changes to the Expo client that are developer-facing. ### 🎉 New features -- Added rich content supports for push notifications. ([#4787](https://github.com/expo/expo/pull/4787) by [@hesyifei](https://github.com/hesyifei)) - Added `MediaLibrary.saveToAssetsAsync` function that can work without `CAMERA_ROLL` permission. ([#5678](https://github.com/expo/expo/pull/5678) by [@lukmccall](https://github.com/lukmccall)) - Added support for `Speech.getAvailableVoicesAsync()` on Android. ([#5887](f0a9d8ce87451dbce8c0a309ff917c8b26472861) by [@Mitch528](https://github.com/Mitch528)) diff --git a/android/expoview/src/main/java/host/exp/exponent/notifications/PushNotificationHelper.java b/android/expoview/src/main/java/host/exp/exponent/notifications/PushNotificationHelper.java index 1ac329e8e63e0..ed23c23abc8c2 100644 --- a/android/expoview/src/main/java/host/exp/exponent/notifications/PushNotificationHelper.java +++ b/android/expoview/src/main/java/host/exp/exponent/notifications/PushNotificationHelper.java @@ -10,15 +10,11 @@ import android.os.Build; import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; -import android.util.Log; - -import com.squareup.picasso.Picasso; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; -import java.io.IOException; import java.util.HashMap; import java.util.Random; @@ -243,66 +239,14 @@ public Intent provide() { } // Add icon + Notification notification; if (!manifestUrl.equals(Constants.INITIAL_URL)) { - notificationBuilder.setLargeIcon(bitmap); - } - - if (body != null) { - try { - JSONObject bodyObject = new JSONObject(body); - - // Download and display the custom icon. - boolean hasCustomIcon = false; - if (bodyObject.has("_icon")) { - final String iconURL = bodyObject.getString("_icon"); - final Bitmap iconBitmap = loadRemoteImage(iconURL, context); - if (iconBitmap != null) { - notificationBuilder.setLargeIcon(iconBitmap); - hasCustomIcon = true; - } - } - - // Download and display the rich content (the image). - // Do not display any rich content if `isMultiple`. - if (!isMultiple && bodyObject.has("_richContent")) { - final JSONObject richContent = bodyObject.getJSONObject("_richContent"); - if (richContent.has("image")) { - String imageURL; - JSONObject imageOptions = null; - if (richContent.get("image") instanceof String) { - imageURL = richContent.getString("image"); - } else { - imageURL = richContent.getJSONObject("image").getString("url"); - imageOptions = richContent.getJSONObject("image").getJSONObject("options"); - } - - boolean thumbnailHidden = false; - if (imageOptions != null && imageOptions.getBoolean("thumbnailHidden")) { - thumbnailHidden = true; - } - - final Bitmap imageBitmap = loadRemoteImage(imageURL, context); - if (imageBitmap != null) { - NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle() - .bigPicture(imageBitmap) - .setBigContentTitle(message); - if (!hasCustomIcon && !thumbnailHidden) { - // Make the rich content image the thumbnail too if there's no "icon" specified. - // Ref: https://developer.android.com/training/notify-user/expanded#image-style - bigPictureStyle.bigLargeIcon(null); - notificationBuilder.setLargeIcon(imageBitmap); - } - notificationBuilder.setStyle(bigPictureStyle); - } - } - } - } catch (JSONException e) { - Log.e(TAG, "Something is wrong with the user-provided data payload: " + e.toString()); - } + notification = notificationBuilder.setLargeIcon(bitmap).build(); + } else { + // TODO: don't actually need to load bitmap in this case + notification = notificationBuilder.build(); } - Notification notification = notificationBuilder.build(); - // Display manager.notify(experienceId, notificationId, notification); @@ -314,19 +258,6 @@ public Intent provide() { }); } - private Bitmap loadRemoteImage(String imageURL, Context context) { - Bitmap imageBitmap = null; - try { - imageBitmap = Picasso.with(context).load(imageURL).get(); - } catch (IOException ie) { - Log.e(TAG, "The image (" + imageURL + ") in the push notification is not loaded correctly: " + ie.toString()); - } catch (IllegalStateException ise) { - Log.e(TAG, "The image URL (" + imageURL + ") in the push notification is invalid: " + ise.toString()); - } - - return imageBitmap; - } - private void addUnreadNotificationToMetadata(String experienceId, String message, int notificationId) { try { JSONObject notification = new JSONObject(); diff --git a/apps/native-component-list/src/api/registerForPushNotificationsAsync.ts b/apps/native-component-list/src/api/registerForPushNotificationsAsync.ts index 4d98359a6b922..da52fbba93d9f 100644 --- a/apps/native-component-list/src/api/registerForPushNotificationsAsync.ts +++ b/apps/native-component-list/src/api/registerForPushNotificationsAsync.ts @@ -2,71 +2,12 @@ import { Notifications } from 'expo'; import Constants from 'expo-constants'; -const demoBodies: { [type: string]: any } = { - simple: { - title: 'Welcome to Expo!', - body: 'Native Component List is registered for push notifications.', - data: { example: 'sample data' }, - }, - image: { - title: 'Kodiak bear', - body: - 'A Kodiak bear in Kodiak National Wildlife Refuge, Alaska, United States.\n\nSource: https://commons.wikimedia.org/wiki/File:2010-kodiak-bear-1.jpg', - richContent: { - image: 'https://upload.wikimedia.org/wikipedia/commons/7/71/2010-kodiak-bear-1.jpg', - }, - data: { - trinomialName: 'Ursus arctos middendorffi', - }, - }, - audio: { - title: 'Moonlight', - body: - 'Piano Sonata No. 14 in C sharp minor "Moonlight". Recorded 1924.\n\nSource: https://www.gutenberg.org/ebooks/10178', - richContent: { - audio: 'https://www.gutenberg.org/files/10178/10178-m/10178-m-001.mp3', - }, - data: { - composer: 'Ludwig van Beethoven', - }, - }, - gif: { - title: 'Phenakistoscope', - body: - "Eadweard Muybridge's Phenakistoscope: A Couple Waltzing.\n\nSource: https://commons.wikimedia.org/wiki/File:Phenakistoscope_3g07690d.gif", - richContent: { - video: 'https://upload.wikimedia.org/wikipedia/commons/d/d3/Phenakistoscope_3g07690d.gif', - }, - }, - video: { - title: 'Out There Trailer', - body: - 'By the European Southern Observatory.\n\nSource: https://www.eso.org/public/videos/OutThere_trailer_en/', - richContent: { - video: 'https://cdn.eso.org/videos/medium_podcast/OutThere_trailer_en.mp4', - }, - }, - imageWithCustomIcon: { - title: 'Jaguar head shot', - body: - 'Potrait of a jaguar at the Milwaukee County Zoological Gardens in Milwaukee, Wisconsin.\n\nSource: https://commons.wikimedia.org/wiki/File:Jaguar_head_shot-edit2.jpg and https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Jaguar_head_icon.svg/600px-Jaguar_head_icon.svg.png', - richContent: { - image: 'https://upload.wikimedia.org/wikipedia/commons/c/c9/Jaguar_head_shot-edit2.jpg', - }, - icon: - 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/70/Jaguar_head_icon.svg/600px-Jaguar_head_icon.svg.png', - data: { - binomialName: 'Panthera onca', - }, - }, -}; - // In this test app we contact the Expo push service directly. You *never* // should do this in a real app. You should always store the push tokens on your // own server or use the local notification API if you want to notify this user. const PUSH_ENDPOINT = 'https://expo.io/--/api/v2/push/send'; -export default async function registerForPushNotificationsAsync(type: string) { +export default async function registerForPushNotificationsAsync() { // this method assumes the user has already granted permission // to receive remote notificartions. @@ -101,8 +42,10 @@ export default async function registerForPushNotificationsAsync(type: string) { body: JSON.stringify([ { to: token, + title: 'Welcome to Expo!', + body: 'Native Component List is registered for push notifications.', + data: { example: 'sample data' }, _category: `${Constants.manifest.id}:welcome`, - ...demoBodies[type], }, ]), }); diff --git a/apps/native-component-list/src/screens/NotificationScreen.tsx b/apps/native-component-list/src/screens/NotificationScreen.tsx index 33ce35a3cb8bd..bead2133fd445 100644 --- a/apps/native-component-list/src/screens/NotificationScreen.tsx +++ b/apps/native-component-list/src/screens/NotificationScreen.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Alert, Platform, ScrollView } from 'react-native'; +import { Alert, ScrollView } from 'react-native'; import { Notifications } from 'expo'; import * as Permissions from 'expo-permissions'; import HeadingText from '../components/HeadingText'; @@ -43,29 +43,9 @@ export default class NotificationScreen extends React.Component { Push Notifications this._sendNotificationAsync('simple')} + onPress={this._sendNotificationAsync} title="Send me a push notification" /> - this._sendNotificationAsync('image')} - title="Send me a push notification with an image" - /> - this._sendNotificationAsync('audio')} - title="Send me a push notification with an audio" - /> - this._sendNotificationAsync('gif')} - title="Send me a push notification with an animated image" - /> - this._sendNotificationAsync('video')} - title="Send me a push notification with a video" - /> - this._sendNotificationAsync('imageWithCustomIcon')} - title="Send me a push notification with a image and a custom icon" - /> Custom notification categories { - if (type !== 'simple' && type !== 'image' && Platform.OS !== 'ios') { - alert( - 'While you will still receive the notification, you will not see any rich content since rich content other than images are only supported on iOS.' - ); - } - if (type === 'imageWithCustomIcon' && Platform.OS === 'ios') { - alert( - 'While you will still receive the notification, you will not see any custom icon since custom icons are not supported on iOS.' - ); - } + _sendNotificationAsync = async () => { const permission = await this._obtainRemoteNotifPermissionsAsync(); if (permission.status === 'granted') { - registerForPushNotificationsAsync(type); + registerForPushNotificationsAsync(); } } } diff --git a/apps/test-suite/tests/Notifications.js b/apps/test-suite/tests/Notifications.js index 9176867cc42b1..620f638a03fad 100644 --- a/apps/test-suite/tests/Notifications.js +++ b/apps/test-suite/tests/Notifications.js @@ -249,89 +249,5 @@ export async function test(t) { }); }); } - - // In this test app we contact the Expo push service directly. You *never* - // should do this in a real app. You should always store the push tokens on your - // own server or use the local notification API if you want to notify this user. - const PUSH_ENDPOINT = 'https://expo.io/--/api/v2/push/send'; - const demoBodies = { - simple: { - title: 'Welcome to Expo!', - body: 'Native Component List is registered for push notifications.', - data: { example: 'sample data' }, - }, - image: { - title: 'Kodiak bear', - body: - 'A Kodiak bear in Kodiak National Wildlife Refuge, Alaska, United States.\n\nSource: https://commons.wikimedia.org/wiki/File:2010-kodiak-bear-1.jpg', - richContent: { - image: 'https://upload.wikimedia.org/wikipedia/commons/7/71/2010-kodiak-bear-1.jpg', - }, - data: { - trinomialName: 'Ursus arctos middendorffi', - }, - }, - }; - t.describe('Push notifications related', () => { - async function sendPushNotificationAsync(type) { - let receivedPushNotification = false; - const subscription = Notifications.addListener(async notification => { - await testNotificationResponse(notification, demoBodies[type], type); - subscription.remove(); - receivedPushNotification = true; - }); - const token = await Notifications.getExpoPushTokenAsync(); - const response = await fetch(PUSH_ENDPOINT, { - method: 'POST', - headers: { - Accept: 'application/json', - 'Content-Type': 'application/json', - }, - body: JSON.stringify([ - { - to: token, - ...demoBodies[type], - }, - ]), - }); - - // Wait for the push notification to arrive. - await waitFor(5000); - - return receivedPushNotification; - } - - async function testNotificationResponse(notification, sentMessage, type) { - t.expect(notification).toBeDefined(); - switch (type) { - case 'simple': - t.expect(notification.data).toEqual(sentMessage.data); - break; - case 'image': { - const newData = { ...sentMessage.data, _richContent: sentMessage.richContent }; - t.expect(notification.data).toEqual(newData); - break; - } - default: - break; - } - } - - t.it( - 'Simple push notification', - async () => { - t.expect(await sendPushNotificationAsync('simple')).toBe(true); - }, - 10000 - ); - - t.it( - 'Image push notification', - async () => { - t.expect(await sendPushNotificationAsync('image')).toBe(true); - }, - 10000 - ); - }); }); } diff --git a/docs/pages/versions/unversioned/guides/push-notifications.md b/docs/pages/versions/unversioned/guides/push-notifications.md index 7cdc043de14e1..67295449fcf1d 100644 --- a/docs/pages/versions/unversioned/guides/push-notifications.md +++ b/docs/pages/versions/unversioned/guides/push-notifications.md @@ -304,103 +304,6 @@ type PushMessage = { */ ttl?: number, - /** - * Rich content that accomplishes the push notification. - * Note that for iOS, the displaying priority is video > audio > image. - * In other words, if the message specifies both `video` and `image`, - * the video will be displayed on iOS devices (and the image will be - * displayed on Android devices). - */ - richContent?: { - /** - * Remote https url of an image that will be displayed with the notification. - * The image should not have an alpha channel. - * Image restrictions on iOS: https://developer.apple.com/documentation/usernotifications/unnotificationattachment. - * Image formats supported on Android: JPEG, PNG, and GIF (will not be animated). - * - * (Note that an animated GIF will not be animated on Android devices. If you - * wish to use an animated GIF for iOS and a static image for Android, put the - * GIF as a `video` (see below) and the static image as an `image`.) - */ - image?: string | { - url: string, - options?: { - /** - * Whether the image's thumbnail will be displayed. - * Defaults to `false`. - */ - thumbnailHidden?: boolean, - - /** - * (iOS-specific field) - * The clipping rectangle for a thumbnail image. Each value in this key - * is a dictionary containing a unit rectangle whose values are in the - * range 0.0 to 1.0 and represent the portion of the original image that - * you want to display. - * For example, specifying `x: 0.25, y: 0.25, width: 0.5, height: 0.5` - * defines a clipping rectangle that shows only the center portion of - * the image. - * Learn more: https://developer.apple.com/documentation/usernotifications/unnotificationattachmentoptionsthumbnailclippingrectkey - */ - thumbnailClippingRect?: { - x: number, - y: number, - width: number, - height: number - } - } - }, - - /** - * (iOS-specific field) - * Remote https url of an audio file that will be played with the notification. - * Audio restrictions: https://developer.apple.com/documentation/usernotifications/unnotificationattachment - */ - audio?: string, - - /** - * (iOS-specific field) - * Remote https url of a video that will be displayed with the notification. - * Video restrictions: https://developer.apple.com/documentation/usernotifications/unnotificationattachment - */ - video?: string | { - url: string, - options?: { - /** - * Whether the image's thumbnail will be displayed. - * Defaults to `false`. - */ - thumbnailHidden?: boolean, - - /** - * The clipping rectangle for a thumbnail image. Refer to the option - * `image.options.thumbnailClippingRect` above. - */ - thumbnailClippingRect?: { - x: number, - y: number, - width: number, - height: number - }, - - /** - * For a video, it is the time (in seconds) into the video from which to - * grab the thumbnail image. For an animated image (i.e. a GIF file), - * it is the frame number of the animation to use as a thumbnail image. - * Learn more: https://developer.apple.com/documentation/usernotifications/unnotificationattachmentoptionsthumbnailtimekey - */ - thumbnailTime?: number - } - } - }, - - /** - * (Android and web only) - * Remote url of a custom icon that replaces the default notification icon. - * This value overrides `notification.icon` in `app.json`. - */ - icon?: string, - /** * A timestamp since the UNIX epoch specifying when the message expires. This * has the same effect as the `ttl` field and is just an absolute timestamp diff --git a/ios/ExpoNotificationServiceExtension/ExNotificationService.h b/ios/ExpoNotificationServiceExtension/ExNotificationService.h deleted file mode 100644 index 0b1d028fdaf49..0000000000000 --- a/ios/ExpoNotificationServiceExtension/ExNotificationService.h +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2019-present 650 Industries. All rights reserved. - -#import - -@interface ExNotificationService : UNNotificationServiceExtension - -@end diff --git a/ios/ExpoNotificationServiceExtension/ExNotificationService.m b/ios/ExpoNotificationServiceExtension/ExNotificationService.m deleted file mode 100644 index cd983dadd4e46..0000000000000 --- a/ios/ExpoNotificationServiceExtension/ExNotificationService.m +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2019-present 650 Industries. All rights reserved. - -#include -#import "ExNotificationService.h" - -@interface ExNotificationService () - -@property (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver); -@property (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent; - -@end - -@implementation ExNotificationService - -- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler { - self.contentHandler = contentHandler; - self.bestAttemptContent = [request.content mutableCopy]; - - - NSString *attachmentMediaURLString = nil; - NSDictionary *attachmentMediaOptions = @{}; - - NSDictionary *userInfo = request.content.userInfo; - if (userInfo && userInfo[@"body"] && userInfo[@"body"][@"_richContent"]) { - NSDictionary *richContent = userInfo[@"body"][@"_richContent"]; - // Display priority: video > audio > image. - for (NSString* attachmentType in @[@"video", @"audio", @"image"]) { - if (richContent[attachmentType]) { - if ([richContent[attachmentType] isKindOfClass:[NSString class]]) { - attachmentMediaURLString = richContent[attachmentType]; - } else { - attachmentMediaURLString = richContent[attachmentType][@"url"]; - attachmentMediaOptions = richContent[attachmentType][@"options"]; - } - break; - } - } - } - - if (!attachmentMediaURLString) { - self.contentHandler(self.bestAttemptContent); - return; - } - - [[NSURLSession.sharedSession downloadTaskWithURL:[NSURL URLWithString:attachmentMediaURLString] completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable downloadError) { - if (downloadError) { - self.contentHandler(self.bestAttemptContent); - return; - } - - if (location && response) { - // Use `suggestedFilename` to set appropriate file extension. - NSString *temporaryFileName = [response suggestedFilename]; - if (!temporaryFileName) { - temporaryFileName = @".tmp"; - } - // Prefix the filename with a random UUID to avoid having file with the same file name during `moveItem`. - NSString *fullTemporaryFileName = [NSString stringWithFormat:@"%@%@", [[NSUUID UUID] UUIDString], temporaryFileName]; - NSURL *temporaryURL = [[NSURL fileURLWithPath:NSTemporaryDirectory()] URLByAppendingPathComponent:fullTemporaryFileName]; - - NSError *fileManagerError = nil; - [NSFileManager.defaultManager moveItemAtURL:location toURL:temporaryURL error:&fileManagerError]; - if (fileManagerError) { - self.contentHandler(self.bestAttemptContent); - return; - } - - NSMutableDictionary *options = [NSMutableDictionary dictionary]; - if (attachmentMediaOptions[@"thumbnailHidden"] && [attachmentMediaOptions[@"thumbnailHidden"] boolValue]) { - options[UNNotificationAttachmentOptionsThumbnailHiddenKey] = @YES; - } - if (attachmentMediaOptions[@"thumbnailTime"] && [attachmentMediaOptions[@"thumbnailTime"] isKindOfClass:[NSNumber class]]) { - options[UNNotificationAttachmentOptionsThumbnailTimeKey] = attachmentMediaOptions[@"thumbnailTime"]; - } - if (attachmentMediaOptions[@"thumbnailClippingRect"]) { - NSDictionary *clippingRectOptions = attachmentMediaOptions[@"thumbnailClippingRect"]; - CGRect clippingRect = CGRectMake([clippingRectOptions[@"x"] doubleValue], [clippingRectOptions[@"y"] doubleValue], [clippingRectOptions[@"width"] doubleValue], [clippingRectOptions[@"height"] doubleValue]); - options[UNNotificationAttachmentOptionsThumbnailClippingRectKey] = (__bridge id _Nullable)CGRectCreateDictionaryRepresentation(clippingRect); - } - - NSError *attachmentError = nil; - UNNotificationAttachment *attachment = [UNNotificationAttachment attachmentWithIdentifier:[temporaryURL absoluteString] URL:temporaryURL options:options error:&attachmentError]; - if (attachmentError) { - self.contentHandler(self.bestAttemptContent); - return; - } - - self.bestAttemptContent.attachments = @[attachment]; - self.contentHandler(self.bestAttemptContent); - - [NSFileManager.defaultManager removeItemAtURL:temporaryURL error:nil]; - } - }] resume]; -} - -- (void)serviceExtensionTimeWillExpire { - // Called just before the extension will be terminated by the system. - // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used. - self.contentHandler(self.bestAttemptContent); -} - -@end diff --git a/ios/ExpoNotificationServiceExtension/Info.plist b/ios/ExpoNotificationServiceExtension/Info.plist deleted file mode 100644 index 822a83ee43a3c..0000000000000 --- a/ios/ExpoNotificationServiceExtension/Info.plist +++ /dev/null @@ -1,31 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleDisplayName - ExpoNotificationServiceExtension - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - XPC! - CFBundleShortVersionString - 2.11.0 - CFBundleVersion - 2.11.0 - NSExtension - - NSExtensionPointIdentifier - com.apple.usernotifications.service - NSExtensionPrincipalClass - ExNotificationService - - - diff --git a/ios/Exponent.xcodeproj/project.pbxproj b/ios/Exponent.xcodeproj/project.pbxproj index 146d14c4b12d5..af61f792ec56a 100644 --- a/ios/Exponent.xcodeproj/project.pbxproj +++ b/ios/Exponent.xcodeproj/project.pbxproj @@ -339,29 +339,8 @@ remoteGlobalIDString = 78CEE2BF1ACD07D70095B124; remoteInfo = Exponent; }; - EDCF2D4822C6A2EB00D1809C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 78CEE2B81ACD07D70095B124 /* Project object */; - proxyType = 1; - remoteGlobalIDString = EDCF2D4122C6A2EB00D1809C; - remoteInfo = ExpoNotificationServiceExtension; - }; /* End PBXContainerItemProxy section */ -/* Begin PBXCopyFilesBuildPhase section */ - ED1AA0AB22C5329300C7D0CE /* Embed App Extensions */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 13; - files = ( - EDCF2D4A22C6A2EB00D1809C /* ExpoNotificationServiceExtension.appex in Embed App Extensions */, - ); - name = "Embed App Extensions"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ 0726F0572007E438004992E7 /* EXKernelAppRecord.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EXKernelAppRecord.h; sourceTree = ""; }; 0726F0582007E438004992E7 /* EXKernelAppRecord.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EXKernelAppRecord.m; sourceTree = ""; }; @@ -978,10 +957,6 @@ E307EED1B62C455182DBF80B /* RNSharedElementTransitionItem.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; path = RNSharedElementTransitionItem.h; sourceTree = ""; }; E6E68AB99C5B4BA58B372F19 /* RNCWebViewManager.m */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.objc; path = RNCWebViewManager.m; sourceTree = ""; }; EB9676B1E402ED70AEB10A7A /* Pods-Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Tests/Pods-Tests.debug.xcconfig"; sourceTree = ""; }; - EDCF2D4222C6A2EB00D1809C /* ExpoNotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = ExpoNotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; - EDCF2D4422C6A2EB00D1809C /* ExNotificationService.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExNotificationService.h; sourceTree = ""; }; - EDCF2D4522C6A2EB00D1809C /* ExNotificationService.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ExNotificationService.m; sourceTree = ""; wrapsLines = 1; }; - EDCF2D4722C6A2EB00D1809C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F11E530D21601058007ACF56 /* EXHeadlessAppRecord.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = EXHeadlessAppRecord.m; sourceTree = ""; }; F11E530E21601058007ACF56 /* EXHeadlessAppLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EXHeadlessAppLoader.h; sourceTree = ""; }; F11E530F21601059007ACF56 /* EXHeadlessAppRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EXHeadlessAppRecord.h; sourceTree = ""; }; @@ -1027,13 +1002,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EDCF2D3F22C6A2EB00D1809C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -1496,7 +1464,6 @@ B51333411CE649FE00E9FC9E /* ExponentIntegrationTests */, F12A1AB722ABD461008542C6 /* Build-Phases */, B505BA0F20CAF77A0046ACFB /* Tests */, - EDCF2D4322C6A2EB00D1809C /* ExpoNotificationServiceExtension */, 3050F5A98E56E9379C36ABD2 /* Frameworks */, A17682721BE42C7F0057BBF2 /* Libraries */, 78CEE2C11ACD07D70095B124 /* Products */, @@ -1512,7 +1479,6 @@ 78CEE2C01ACD07D70095B124 /* Exponent.app */, B51333401CE649FE00E9FC9E /* ExponentIntegrationTests.xctest */, B505BA0E20CAF77A0046ACFB /* Tests.xctest */, - EDCF2D4222C6A2EB00D1809C /* ExpoNotificationServiceExtension.appex */, ); name = Products; sourceTree = ""; @@ -2201,16 +2167,6 @@ path = Appearance; sourceTree = ""; }; - EDCF2D4322C6A2EB00D1809C /* ExpoNotificationServiceExtension */ = { - isa = PBXGroup; - children = ( - EDCF2D4422C6A2EB00D1809C /* ExNotificationService.h */, - EDCF2D4522C6A2EB00D1809C /* ExNotificationService.m */, - EDCF2D4722C6A2EB00D1809C /* Info.plist */, - ); - path = ExpoNotificationServiceExtension; - sourceTree = ""; - }; F11E530C2160101B007ACF56 /* HeadlessApp */ = { isa = PBXGroup; children = ( @@ -2259,12 +2215,10 @@ B575EEC61D5AA56100DCABBC /* Clean Up Dynamic Macros */, 78F81D401B70746F000E5595 /* Fabric */, 9F407D89B3F72F916C80DD38 /* [CP] Copy Pods Resources */, - ED1AA0AB22C5329300C7D0CE /* Embed App Extensions */, ); buildRules = ( ); dependencies = ( - EDCF2D4922C6A2EB00D1809C /* PBXTargetDependency */, ); name = Exponent; productName = Exponent; @@ -2309,23 +2263,6 @@ productReference = B51333401CE649FE00E9FC9E /* ExponentIntegrationTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; - EDCF2D4122C6A2EB00D1809C /* ExpoNotificationServiceExtension */ = { - isa = PBXNativeTarget; - buildConfigurationList = EDCF2D4B22C6A2EB00D1809C /* Build configuration list for PBXNativeTarget "ExpoNotificationServiceExtension" */; - buildPhases = ( - EDCF2D3E22C6A2EB00D1809C /* Sources */, - EDCF2D3F22C6A2EB00D1809C /* Frameworks */, - EDCF2D4022C6A2EB00D1809C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = ExpoNotificationServiceExtension; - productName = ExpoNotificationServiceExtension; - productReference = EDCF2D4222C6A2EB00D1809C /* ExpoNotificationServiceExtension.appex */; - productType = "com.apple.product-type.app-extension"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -2333,7 +2270,6 @@ isa = PBXProject; attributes = { CLASSPREFIX = EX; - LastSwiftUpdateCheck = 1020; LastUpgradeCheck = 1020; ORGANIZATIONNAME = "650 Industries"; TargetAttributes = { @@ -2372,11 +2308,6 @@ CreatedOnToolsVersion = 7.3.1; TestTargetID = 78CEE2BF1ACD07D70095B124; }; - EDCF2D4122C6A2EB00D1809C = { - CreatedOnToolsVersion = 10.2.1; - DevelopmentTeam = C8D8QTF339; - ProvisioningStyle = Automatic; - }; }; }; buildConfigurationList = 78CEE2BB1ACD07D70095B124 /* Build configuration list for PBXProject "Exponent" */; @@ -2396,7 +2327,6 @@ 78CEE2BF1ACD07D70095B124 /* Exponent */, B513333F1CE649FE00E9FC9E /* ExponentIntegrationTests */, B505BA0D20CAF77A0046ACFB /* Tests */, - EDCF2D4122C6A2EB00D1809C /* ExpoNotificationServiceExtension */, ); }; /* End PBXProject section */ @@ -2440,13 +2370,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EDCF2D4022C6A2EB00D1809C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -2895,14 +2818,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - EDCF2D3E22C6A2EB00D1809C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EDCF2D4622C6A2EB00D1809C /* ExNotificationService.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -2916,11 +2831,6 @@ target = 78CEE2BF1ACD07D70095B124 /* Exponent */; targetProxy = B51333451CE649FE00E9FC9E /* PBXContainerItemProxy */; }; - EDCF2D4922C6A2EB00D1809C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = EDCF2D4122C6A2EB00D1809C /* ExpoNotificationServiceExtension */; - targetProxy = EDCF2D4822C6A2EB00D1809C /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -3044,7 +2954,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 80F51F42EE852A05B015A15E /* Pods-Exponent.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Exponent/Supporting/Exponent.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; @@ -3074,7 +2983,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = 36BC76754E88A8F5C6E57DDD /* Pods-Exponent.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_ENTITLEMENTS = Exponent/Supporting/Exponent.entitlements; CODE_SIGN_IDENTITY = "Apple Distribution"; @@ -3282,15 +3190,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - EDCF2D4B22C6A2EB00D1809C /* Build configuration list for PBXNativeTarget "ExpoNotificationServiceExtension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - EDCF2D4C22C6A2EB00D1809C /* Debug */, - EDCF2D4D22C6A2EB00D1809C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 78CEE2B81ACD07D70095B124 /* Project object */;