์ค๋ช
:
๋๋ ์ฌ๊ธฐ์์ React Native SDK์ ๋ํ ์ง์นจ์ ๋ฐ๋์ต๋๋ค - https://documentation.onesignal.com/docs/react-native-sdk-setup
npm ํจํค์ง๋ฅผ ์ถ๊ฐํ๊ณ react-native link
๋ฐ pod install
. ๋ชจ๋ ๊ฒ์ด ์์กฐ๋กญ๊ฒ ์งํ๋์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ ์๋ฆผ ํ์ฅ ์์ฑ์ ์งํํฉ๋๋ค. Link Binary with Libararies
์ค์ ์ libRCTOneSignal.a
๋ฅผ ์ถ๊ฐํ๋ผ๋ ์ง์๋ฅผ ๋ฐ์ ๋ถ๋ถ์ ์ด๋ฅด๋ฉด Xcode๊ฐ ํ์ํ๋ ๋ชฉ๋ก์์ ์ฐพ์ ์ ์์ต๋๋ค. One Signal์ ๊ฒ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
๋ด ํค๋ ๊ฒ์ ํ์ด์ง ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ด์ libreact-native-onesignal.a
์ถ๊ฐํ๋ ค๊ณ ์๋ํ์ง๋ง ๋น๋ํ ๋ ๋ค์ ์ฐ๊ฒฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ld: library not found for -lreact-native-onesignal
clang: error: linker command failed with exit code 1 (use -v to see invocation)
ํ๊ฒฝ
3.2.6
0.55.4
9.2
react-native link
๊ฐ ํ์์ ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. DI๋ RCTOneSignal
ํ๋ก์ ํธ๋ฅผ Libraries
์ ์๋์ผ๋ก ์ถ๊ฐํด์ผ ํ๊ณ ๊ทธ๋ฐ ๋ค์ libRCTOneSignal.a
๋ฅผ ์ถ๊ฐํ ์ ์์์ต๋๋ค.
์ฌ๋๋ค์ด ๋งํฌ๊ฐ ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ ์ ์๋๋ก react-native link
์ธ์ ์๋ ๋งํฌ์ ๋ํ ์ง์นจ์ ์ถ๊ฐํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. :)
์ด๋ป๊ฒ ์ถ๊ฐํ์ด?
๋ํ RCTOneSignal ํ๋ก์ ํธ๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ ํํ ํ์ ํ๋ ค๊ณ ํฉ๋๋ค.
@nickyhajal @abdul-elah-js @steverob ๋๊ตฐ๊ฐ RCTOneSignal
ํ๋ก์ ํธ๋ฅผ Libraries
์ ์๋์ผ๋ก ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช
ํ ์ ์์ต๋๊น?
์ด ๋ฌธ์ ๋ ๋ฌธ์์๋ ๋์ ์์ด์ผ ํฉ๋๋ค.
@pacozaa ์ฌ๊ธฐ์์ Facebook์ ์ง์นจ์ ๋ฐ๋ฅผ ์ ์์ต๋๋ค: https://facebook.github.io/react-native/docs/linking-libraries-ios
node_modules/react-native-onesignal/ios๋ฅผ ์ฐ ๋ค์ RCTOneSignal.xcodeproj๋ฅผ XCode ํ๋ก์ ํธ ํด๋ Libraries์ ๋์ด๋ค ๋์ผ๋ฉด libRCTOneSignal.a๊ฐ ๊ฒ์์ ๋ํ๋ฉ๋๋ค.
์ด๊ฒ์ ๋ฐ์ํ๊ธฐ ์ํด React-Native ์ค์ ์ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ๊ณ ๋ฌธ์๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋๊ฐ ์์ต๋๋ค.
@rgomezp ์ฃ์กํฉ๋๋ค. ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด์ฃผ์๊ฒ ์ต๋๊น? libRCTOneSignal.a๋ Xcode 12์ ํ์ฅ์์ ์ฐพ์ ์ ์์ต๋๋ค. ํ์ง๋ง Xcode 11.7์์ ์๋ํฉ๋๋ค.
@์๋ ํจ ์จ ,
ios
๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ์ฌ pod deintegrate && pod install
์ด๊ฒ์ Xcode 12์์ ๋ฐ์ํฉ๋๋ค. ํฌ๋๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์๋
,
์ด๊ฒ์ Xcode 12๋ฅผ ์ฌ์ฉํ๊ณ Cocoapods๋ฅผ ์ฌ์ฉํ์ง _์์_ ์ฌ๋๋ค์ ์ํ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ๋ค์ ์ฝ๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ์๋ ํฌ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ Xcode 12๋ฅผ ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ. :(
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํฌ๋๋ก ์ด๋ํด์ผ ํ์ง๋ง ๋ด ์คํ ์ด์ง ๋์์์ ์๋ํ์ง ์์ต๋๋ค. ๋นจ๋ฆฌ ๊ฒํ ํด ์ฃผ์ธ์ ๐
@rgomezp ์ฃ์กํฉ๋๋ค. ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? cocoapods๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง ์ด๋ค ์ด์ ๋ก OneSignal์ด ์ด๊ธฐํ๋์ง ์์์ต๋๋ค. React Native 0.59 ์ฌ์ฉ
react-native-onesignal
์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ค์์ Pod์ ์์
๋๋ค.
# Uncomment the next line to define a global platform for your project
platform :ios, '10.0'
target 'example' do
# Comment the next line if you don't want to use dynamic frameworks
# Pods for example
pod 'Branch', '0.28.1'
pod 'react-native-onesignal', :path => '../node_modules/react-native-onesignal'
pod 'React', :path => '../node_modules/react-native/'
end
target 'exampleDev' do
# Comment the next line if you don't want to use dynamic frameworks
# Pods for exampleDev
pod 'Branch', '0.28.1'
pod 'React', :path => '../node_modules/react-native/'
pod 'react-native-onesignal', :path => '../node_modules/react-native-onesignal'
end
target 'OneSignalNotificationServiceExtension' do
# Comment the next line if you don't want to use dynamic frameworks
pod 'OneSignal', '>= 2.14.2', '< 3.0'
# Pods for OneSignalNotificationServiceExtension
end
target 'DevOneSignalNotificationServiceExtension' do
# Comment the next line if you don't want to use dynamic frameworks
pod 'OneSignal', '>= 2.14.2', '< 3.0'
# Pods for DevOneSignalNotificationServiceExtension
end
@rgomezp ์ด๊ฒ์ ์กฐ์ฌ ํ๋ ์ฌ๋์ด ์์ต๋๊น?
์ฐ๋ฆฌ ํ๋ก์ ํธ๋ react-native 0.59(cocoapods ์์)๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๋ก ์ธํด XCode 12์์ ๋น๋๋์ง ์์ต๋๋ค.
@rgomezp ์ด๊ฒ์ ์กฐ์ฌ ํ๋ ์ฌ๋์ด ์์ต๋๊น?
์ฐ๋ฆฌ ํ๋ก์ ํธ๋ react-native 0.59(cocoapods ์์)๋ฅผ ์ฌ์ฉํ๋ฉฐ ์ฌ๊ธฐ์ ๋ฌธ์ ๋ก ์ธํด XCode 12์์ ๋น๋๋์ง ์์ต๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ๋ง์ง๋ง ์ ๋ฐ์ดํธ ํ react-native 0.59 ๋ฐ Xcode 12์๋ ์ค๋ฅ๊ฐ ์ค๋ช ๋์ด ์์ต๋๋ค. ์ ๋ฐ์ดํธ ์ ์ ๋ชจ๋ ์ ์๋ํฉ๋๋ค. react-native-onesignal 3.9.2๋ฅผ ์ ๊ฑฐํ๊ณ ๋ค์ ์ค์นํ์ต๋๋ค.
clang: error: no such file or directory: '/Users/leonardo/Library/Developer/Xcode/DerivedData/xxxxx/Build/Products/Debug-iphonesimulator/libRCTOneSignal.a'
Command Ld failed with a nonzero exit code
์
๋ฐ์ดํธ 1:
ํ๋ก๋์
์ฉ ์ฑ์ ๋น๋ํ๋ฉด ์๋ํฉ๋๋ค... ๋ฌธ์ ๋ ์๋ฎฌ๋ ์ดํฐ์์ ์คํํ๋ ค๊ณ ํ ๋์
๋๋ค(๋ชจ๋ ๋ค๋ฅธ iOS์์)
์
๋ฐ์ดํธ 2:
๋ฌผ๋ฆฌ์ ์ฅ์น์์๋ ๋๋ฒ๊น
ํ ์ ์์ต๋๋ค.
์
๋ฐ์ดํธ 3:
๋๋ฒ๊น
ํ ์ ์์ง๋ง onesignal์ ์ฌ์ฉ์ ๋์๋ฅผ ํ์ํ์ง ์์ผ๋ฏ๋ก ์๋ฆผ์ด ์๋ํ์ง ์์ต๋๋ค. ์ต์ ๋ฒ์ 3.9.2๋ ์
๋ฐ์ดํธํ์ต๋๋ค.
๋๋ฅผ ์ํ ํด๊ฒฐ์ฑ ์ xcode๋ฅผ 11.7๋ก ๋ค์ด๊ทธ๋ ์ด๋ํ๊ณ ios ํด๋์ ๋ฐฑ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด์์ต๋๋ค. ๋ฌธ์ ๋ xcode 12+์ ๊ด๋ จ๋ ๊ฒ ๊ฐ์ต๋๋ค.
@Tebrynn์ด ๋งํ๋ฏ์ด XCode๋ฅผ ๋ค์ด๊ทธ๋ ์ด๋ํ๋ ค๊ณ ์๋ํ์ง๋ง ๋์ผํ ๋ฌธ์ ๊ฐ ๊ณ์ ๋ฐ์ํฉ๋๋ค.
์ ์๊ฒ ์ ์ผํ ํด๊ฒฐ์ฑ
์ ์๋ ์ค์น๋ฅผ Cocoapods ์ค์น๋ก ๋ฐ๊พธ๋ ๊ฒ์ด์์ต๋๋ค.
๋ฐฉ๊ธ ์ค๋ช
์(https://documentation.onesignal.com/docs/react-native-sdk-setup)์ ์ง์นจ์ ๋ฐ๋์ต๋๋ค.
์ด์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
๋ฐฉ๊ธ Xcode12๋ก ์ ๋ฐ์ดํธํ๋๋ฐ ๋น๋ ์์๋ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ต๊ทผ์ Xcode 12๋ก ์
๋ฐ์ดํธํ์ต๋๋ค. libRCTOneSignal.a๋ฅผ ์ฐพ์ง ๋ชปํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๋๋ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์๋ํ ๋จ๊ณ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฐ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ด๋ฆฌ๋ฅ์ ํ๋ค.
OneSignal์ ๋ํด arm64๋ฅผ ์ ์ธํ๋ ๊ฒ์ ๋ํ ์ฌ๋ฌ ๊ธฐ์ฌ๋ฅผ ์ฝ์์ต๋๋ค. ๋๋ ์ง๊ธ๊น์ง ์ด์ด ์์ด ์ด๊ฒ์ ์๋ํ๋ค. ๊ทธ๋ฌ๋ ์๋ฎฌ๋ ์ดํฐ์๋ง ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ์ด ๋ฌธ์ ์ ๋ ๋ง์ ์๊ฐ์ ํ ์ ํ์ง ์์ ๊ฒ์
๋๋ค.
๋์ผํ ๋ฌธ์ , Xcode 12.4 ๋ฐ RN 0.59.10.
๋์ผํ ๋ฌธ์ ๊ฐ ์ฌ๊ธฐ์ ์์ต๋๋ค.
์๋
,
์ด๋ป๊ฒ๋ ์๋ ์ค์น๊ฐ ์ค๋จ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์กฐ์ฌ๋ฅผ ์ํด ๋ ํํค์ณ์ผ ํฉ๋๋ค.
๊ธฐ๋ค๋ ค ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๊ทธ ๋์ ๊ฐ๋ฅํ๋ฉด Cocoapods ์ค์น ๋ฐฉ์์ผ๋ก ์ ํํด ๋ณด์ธ์.
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉด ํด์๋ค. ์ด๋ค ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
์๋
ํ์ธ์, React-Native-OneSignal ๋ฒ์ 4.0.0๋ถํฐ RCTOneSignal.xcodeproj์ ํฌํจ๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ์
๋ฐ์ดํธ๋์ง ์์์ต๋๋ค. ์ฆ, NotificationServiceExtension์ OneSignal์ ์ถ๊ฐํ๋ ค๋ฉด Cocoapods๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
Podfile์ ๋ค์์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
target 'OneSignalNotificationServiceExtension' do
pod 'OneSignal', '>= 3.0', '< 4.0'
end
๊ทธ๋ฐ ๋ค์ Swift๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ NotificationService ํ์ผ์ ๋ค์์ผ๋ก ์ ๋ฐ์ดํธํ์ญ์์ค.
import UserNotifications
import OneSignal
class NotificationService: UNNotificationServiceExtension {
var contentHandler: ((UNNotificationContent) -> Void)?
var receivedRequest: UNNotificationRequest!
var bestAttemptContent: UNMutableNotificationContent?
override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: <strong i="10">@escaping</strong> (UNNotificationContent) -> Void) {
self.receivedRequest = request;
self.contentHandler = contentHandler
bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)
if let bestAttemptContent = bestAttemptContent {
OneSignal.didReceiveNotificationExtensionRequest(self.receivedRequest, with: self.bestAttemptContent)
contentHandler(bestAttemptContent)
}
}
override func 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.
if let contentHandler = contentHandler, let bestAttemptContent = bestAttemptContent {
OneSignal.serviceExtensionTimeWillExpireRequest(self.receivedRequest, with: self.bestAttemptContent)
contentHandler(bestAttemptContent)
}
}
}
๋๋ Objective-C๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ค์
#import <OneSignal/OneSignal.h>
#import "NotificationService.h"
<strong i="14">@interface</strong> NotificationService ()
<strong i="15">@property</strong> (nonatomic, strong) void (^contentHandler)(UNNotificationContent *contentToDeliver);
<strong i="16">@property</strong> (nonatomic, strong) UNNotificationRequest *receivedRequest;
<strong i="17">@property</strong> (nonatomic, strong) UNMutableNotificationContent *bestAttemptContent;
<strong i="18">@end</strong>
<strong i="19">@implementation</strong> NotificationService
- (void)didReceiveNotificationRequest:(UNNotificationRequest *)request withContentHandler:(void (^)(UNNotificationContent * _Nonnull))contentHandler {
self.receivedRequest = request;
self.contentHandler = contentHandler;
self.bestAttemptContent = [request.content mutableCopy];
[OneSignal didReceiveNotificationExtensionRequest:self.receivedRequest withMutableNotificationContent:self.bestAttemptContent];
// DEBUGGING: Uncomment the 2 lines below and comment out the one above to ensure this extension is excuting
// Note, this extension only runs when mutable-content is set
// Setting an attachment or action buttons automatically adds this
// NSLog(@"Running NotificationServiceExtension");
// self.bestAttemptContent.body = [@"[Modified] " stringByAppendingString:self.bestAttemptContent.body];
self.contentHandler(self.bestAttemptContent);
}
- (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.
[OneSignal serviceExtensionTimeWillExpireRequest:self.receivedRequest withMutableNotificationContent:self.bestAttemptContent];
self.contentHandler(self.bestAttemptContent);
}
<strong i="20">@end</strong>
์ ์ฒด ์ค์ ๊ฐ์ด๋๋ ์ฌ๊ธฐ ์์ ์ฐพ์ ์
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
react-native link
๊ฐ ํ์์ ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์๋ ๊ฒ์ผ๋ก ๋ํ๋ฌ์ต๋๋ค. DI๋RCTOneSignal
ํ๋ก์ ํธ๋ฅผLibraries
์ ์๋์ผ๋ก ์ถ๊ฐํด์ผ ํ๊ณ ๊ทธ๋ฐ ๋ค์libRCTOneSignal.a
๋ฅผ ์ถ๊ฐํ ์ ์์์ต๋๋ค.์ฌ๋๋ค์ด ๋งํฌ๊ฐ ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ ์ ์๋๋ก
react-native link
์ธ์ ์๋ ๋งํฌ์ ๋ํ ์ง์นจ์ ์ถ๊ฐํ ์ ์์ผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. :)