react-native-pdf-jsi 2.2.4 → 2.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -35,6 +35,27 @@ Starting November 1, 2025, Google Play will require apps to support 16KB page si
35
35
  - ✅ **Google Play Approved** - Meets all current and future requirements
36
36
  - ✅ **Drop-in Replacement** - Easy migration from existing libraries
37
37
 
38
+ ## 🎉 Version 2.2.6 - Enhanced iOS JSI Integration!
39
+
40
+ **Major improvements to iOS JSI functionality and method forwarding!**
41
+
42
+ ### 🚀 **What's New in v2.2.6:**
43
+ - **🚀 iOS JSI Enhancement** - Comprehensive JSI method declarations and forwarding
44
+ - **✅ JSI Availability Check** - Added checkJSIAvailability method for iOS
45
+ - **✅ Method Forwarding** - All JSI methods now properly forwarded on iOS
46
+ - **✅ Better Integration** - Enhanced iOS bridge integration with PDFJSIManager
47
+ - **✅ Error Handling** - Improved error handling for iOS JSI operations
48
+
49
+ ## 🎉 Version 2.2.5 - iOS Pod Install Fix!
50
+
51
+ **Resolves iOS pod installation issues with correct podspec configuration!**
52
+
53
+ ### 🚀 **What's New in v2.2.5:**
54
+ - **🐛 iOS Pod Install Fix** - Resolved pod installation errors on iOS
55
+ - **✅ Podspec Update** - Fixed react-native-pdf-jsi.podspec configuration
56
+ - **✅ iOS Compatibility** - Improved iOS installation and build process
57
+ - **✅ CocoaPods Support** - Enhanced CocoaPods integration
58
+
38
59
  ## 🎉 Version 2.2.4 - Critical 16KB Bug Fix!
39
60
 
40
61
  **Resolves 16KB page size compatibility issues for Google Play compliance!**
@@ -911,7 +932,35 @@ const Pdf = PdfModule.default;
911
932
 
912
933
  ## 📝 Changelog
913
934
 
914
- ### v2.2.4 (2025) - Latest ✅ CRITICAL 16KB BUG FIX
935
+ ### v2.2.6 (2025) - Latest ✅ ENHANCED IOS JSI INTEGRATION
936
+
937
+ #### 🚀 **iOS JSI Enhancements**
938
+ - **JSI Method Declarations**: Added comprehensive JSI method declarations in PDFJSIManager.h
939
+ - **Method Forwarding**: Implemented JSI method forwarding in RNPDFPdfViewManager
940
+ - **JSI Availability Check**: Added checkJSIAvailability method for iOS JSI detection
941
+ - **All JSI Methods**: Forward renderPageDirect, getPageMetrics, preloadPagesDirect, getCacheMetrics, clearCacheDirect, optimizeMemory, searchTextDirect, getPerformanceMetrics, setRenderQuality
942
+
943
+ #### 📊 **iOS Integration Improvements**
944
+ - **Bridge Integration**: Enhanced iOS bridge integration with PDFJSIManager
945
+ - **Error Handling**: Improved error handling for iOS JSI operations
946
+ - **JSI Stats**: Added getJSIStats method for iOS JSI status
947
+ - **Logging**: Better logging for JSI availability and operations
948
+
949
+ ### v2.2.5 (2025) - ✅ IOS POD INSTALL FIX
950
+
951
+ #### 🐛 **iOS Pod Installation Fix**
952
+ - **Pod Install Error Fix**: Resolved pod installation errors on iOS
953
+ - **Podspec Configuration**: Fixed react-native-pdf-jsi.podspec file configuration
954
+ - **CocoaPods Integration**: Enhanced CocoaPods integration and compatibility
955
+ - **iOS Build Process**: Improved iOS installation and build process
956
+
957
+ #### 📊 **iOS Compatibility**
958
+ - **Installation Fixed**: Pod install now works correctly on iOS
959
+ - **Build Success**: iOS builds complete successfully without errors
960
+ - **CocoaPods Support**: Full CocoaPods support for iOS projects
961
+ - **React Native Compatibility**: Improved compatibility with React Native iOS projects
962
+
963
+ ### v2.2.4 (2025) - ✅ CRITICAL 16KB BUG FIX
915
964
 
916
965
  #### 🐛 **16KB Page Size Compatibility Fix**
917
966
  - **Critical Bug Fix**: Resolved 16KB page size compatibility issues for Google Play compliance
@@ -1517,7 +1566,7 @@ For issues and questions:
1517
1566
 
1518
1567
  *Transform your PDF viewing experience with enterprise-grade performance and reliability.*
1519
1568
 
1520
- **v2.2.4 - Critical 16KB Bug Fix**
1569
+ **v2.2.6 - Enhanced iOS JSI Integration**
1521
1570
  **Copyright (c) 2025-present, Punith M (punithm300@gmail.com). Enhanced PDF JSI Integration. All rights reserved.**
1522
1571
 
1523
1572
  *Original work Copyright (c) 2017-present, Wonday (@wonday.org). All rights reserved.*
@@ -6,10 +6,62 @@
6
6
  * Provides React Native bridge integration for JSI PDF functions
7
7
  */
8
8
 
9
- #import <Foundation/Foundation.h>
10
- #import <React/RCTBridgeModule.h>
11
- #import <React/RCTEventEmitter.h>
12
-
13
- @interface PDFJSIManager : RCTEventEmitter <RCTBridgeModule>
14
-
15
- @end
9
+ #import <Foundation/Foundation.h>
10
+ #import <React/RCTBridgeModule.h>
11
+ #import <React/RCTEventEmitter.h>
12
+
13
+ @interface PDFJSIManager : RCTEventEmitter <RCTBridgeModule>
14
+
15
+ // JSI Method Declarations
16
+ - (void)renderPageDirect:(NSString *)pdfId
17
+ pageNumber:(NSInteger)pageNumber
18
+ scale:(double)scale
19
+ base64Data:(NSString *)base64Data
20
+ resolver:(RCTPromiseResolveBlock)resolve
21
+ rejecter:(RCTPromiseRejectBlock)reject;
22
+
23
+ - (void)getPageMetrics:(NSString *)pdfId
24
+ pageNumber:(NSInteger)pageNumber
25
+ resolver:(RCTPromiseResolveBlock)resolve
26
+ rejecter:(RCTPromiseRejectBlock)reject;
27
+
28
+ - (void)preloadPagesDirect:(NSString *)pdfId
29
+ startPage:(NSInteger)startPage
30
+ endPage:(NSInteger)endPage
31
+ resolver:(RCTPromiseResolveBlock)resolve
32
+ rejecter:(RCTPromiseRejectBlock)reject;
33
+
34
+ - (void)getCacheMetrics:(NSString *)pdfId
35
+ resolver:(RCTPromiseResolveBlock)resolve
36
+ rejecter:(RCTPromiseRejectBlock)reject;
37
+
38
+ - (void)clearCacheDirect:(NSString *)pdfId
39
+ cacheType:(NSString *)cacheType
40
+ resolver:(RCTPromiseResolveBlock)resolve
41
+ rejecter:(RCTPromiseRejectBlock)reject;
42
+
43
+ - (void)optimizeMemory:(NSString *)pdfId
44
+ resolver:(RCTPromiseResolveBlock)resolve
45
+ rejecter:(RCTPromiseRejectBlock)reject;
46
+
47
+ - (void)searchTextDirect:(NSString *)pdfId
48
+ searchTerm:(NSString *)searchTerm
49
+ startPage:(NSInteger)startPage
50
+ endPage:(NSInteger)endPage
51
+ resolver:(RCTPromiseResolveBlock)resolve
52
+ rejecter:(RCTPromiseRejectBlock)reject;
53
+
54
+ - (void)getPerformanceMetrics:(NSString *)pdfId
55
+ resolver:(RCTPromiseResolveBlock)resolve
56
+ rejecter:(RCTPromiseRejectBlock)reject;
57
+
58
+ - (void)setRenderQuality:(NSString *)pdfId
59
+ quality:(NSInteger)quality
60
+ resolver:(RCTPromiseResolveBlock)resolve
61
+ rejecter:(RCTPromiseRejectBlock)reject;
62
+
63
+ - (void)check16KBSupport:(RCTPromiseResolveBlock)resolve
64
+ rejecter:(RCTPromiseRejectBlock)reject;
65
+
66
+ @end
67
+
@@ -6,13 +6,18 @@
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */
8
8
 
9
- #if __has_include(<React/RCTAssert.h>)
10
- #import <React/RCTViewManager.h>
11
- #else
12
- #import "RCTViewManager.h"
13
- #endif
14
-
15
-
16
- @interface RNPDFPdfViewManager : RCTViewManager
17
-
18
- @end
9
+ #if __has_include(<React/RCTAssert.h>)
10
+ #import <React/RCTViewManager.h>
11
+ #else
12
+ #import "RCTViewManager.h"
13
+ #endif
14
+
15
+
16
+ @interface RNPDFPdfViewManager : RCTViewManager
17
+
18
+ // JSI availability check
19
+ - (void)checkJSIAvailability:(RCTPromiseResolveBlock)resolve
20
+ rejecter:(RCTPromiseRejectBlock)reject;
21
+
22
+ @end
23
+
@@ -10,7 +10,13 @@
10
10
 
11
11
  #import "RNPDFPdfViewManager.h"
12
12
  #import "RNPDFPdfView.h"
13
+ #import "PDFJSIManager.h"
13
14
 
15
+ #if __has_include(<React/RCTLog.h>)
16
+ #import <React/RCTLog.h>
17
+ #else
18
+ #import "RCTLog.h"
19
+ #endif
14
20
 
15
21
  @implementation RNPDFPdfViewManager
16
22
 
@@ -57,6 +63,193 @@ RCT_EXPORT_METHOD(supportPDFKit:(RCTResponseSenderBlock)callback)
57
63
 
58
64
  }
59
65
 
66
+ // CRITICAL: Export JSI availability check method
67
+ RCT_EXPORT_METHOD(checkJSIAvailability:(RCTPromiseResolveBlock)resolve
68
+ rejecter:(RCTPromiseRejectBlock)reject)
69
+ {
70
+ @try {
71
+ RCTLogInfo(@"📱 RNPDFPdfViewManager: Checking JSI availability");
72
+
73
+ // Check if PDFJSIManager is available
74
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
75
+
76
+ if (jsiManager) {
77
+ RCTLogInfo(@"✅ RNPDFPdfViewManager: JSI Manager found - JSI is AVAILABLE");
78
+ resolve(@{
79
+ @"available": @YES,
80
+ @"message": @"JSI is available via PDFJSIManager",
81
+ @"platform": @"ios"
82
+ });
83
+ } else {
84
+ RCTLogWarn(@"⚠️ RNPDFPdfViewManager: JSI Manager not found - falling back to bridge mode");
85
+ resolve(@{
86
+ @"available": @NO,
87
+ @"message": @"JSI not available, using bridge mode",
88
+ @"platform": @"ios"
89
+ });
90
+ }
91
+
92
+ } @catch (NSException *exception) {
93
+ RCTLogError(@"❌ RNPDFPdfViewManager: Error checking JSI availability: %@", exception.reason);
94
+ reject(@"JSI_CHECK_ERROR", exception.reason, nil);
95
+ }
96
+ }
97
+
98
+ // Forward JSI methods to PDFJSIManager
99
+ RCT_EXPORT_METHOD(renderPageDirect:(NSString *)pdfId
100
+ pageNumber:(NSInteger)pageNumber
101
+ scale:(double)scale
102
+ base64Data:(NSString *)base64Data
103
+ resolver:(RCTPromiseResolveBlock)resolve
104
+ rejecter:(RCTPromiseRejectBlock)reject)
105
+ {
106
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
107
+ if (jsiManager) {
108
+ [jsiManager renderPageDirect:pdfId pageNumber:pageNumber scale:scale base64Data:base64Data resolver:resolve rejecter:reject];
109
+ } else {
110
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
111
+ }
112
+ }
113
+
114
+ RCT_EXPORT_METHOD(getPageMetrics:(NSString *)pdfId
115
+ pageNumber:(NSInteger)pageNumber
116
+ resolver:(RCTPromiseResolveBlock)resolve
117
+ rejecter:(RCTPromiseRejectBlock)reject)
118
+ {
119
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
120
+ if (jsiManager) {
121
+ [jsiManager getPageMetrics:pdfId pageNumber:pageNumber resolver:resolve rejecter:reject];
122
+ } else {
123
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
124
+ }
125
+ }
126
+
127
+ RCT_EXPORT_METHOD(preloadPagesDirect:(NSString *)pdfId
128
+ startPage:(NSInteger)startPage
129
+ endPage:(NSInteger)endPage
130
+ resolver:(RCTPromiseResolveBlock)resolve
131
+ rejecter:(RCTPromiseRejectBlock)reject)
132
+ {
133
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
134
+ if (jsiManager) {
135
+ [jsiManager preloadPagesDirect:pdfId startPage:startPage endPage:endPage resolver:resolve rejecter:reject];
136
+ } else {
137
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
138
+ }
139
+ }
140
+
141
+ RCT_EXPORT_METHOD(getCacheMetrics:(RCTPromiseResolveBlock)resolve
142
+ rejecter:(RCTPromiseRejectBlock)reject)
143
+ {
144
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
145
+ if (jsiManager) {
146
+ [jsiManager getCacheMetrics:@"default" resolver:resolve rejecter:reject];
147
+ } else {
148
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
149
+ }
150
+ }
151
+
152
+ RCT_EXPORT_METHOD(clearCacheDirect:(NSString *)pdfId
153
+ cacheType:(NSString *)cacheType
154
+ resolver:(RCTPromiseResolveBlock)resolve
155
+ rejecter:(RCTPromiseRejectBlock)reject)
156
+ {
157
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
158
+ if (jsiManager) {
159
+ [jsiManager clearCacheDirect:pdfId cacheType:cacheType resolver:resolve rejecter:reject];
160
+ } else {
161
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
162
+ }
163
+ }
164
+
165
+ RCT_EXPORT_METHOD(optimizeMemory:(NSString *)pdfId
166
+ resolver:(RCTPromiseResolveBlock)resolve
167
+ rejecter:(RCTPromiseRejectBlock)reject)
168
+ {
169
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
170
+ if (jsiManager) {
171
+ [jsiManager optimizeMemory:pdfId resolver:resolve rejecter:reject];
172
+ } else {
173
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
174
+ }
175
+ }
176
+
177
+ RCT_EXPORT_METHOD(searchTextDirect:(NSString *)pdfId
178
+ searchTerm:(NSString *)searchTerm
179
+ resolver:(RCTPromiseResolveBlock)resolve
180
+ rejecter:(RCTPromiseRejectBlock)reject)
181
+ {
182
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
183
+ if (jsiManager) {
184
+ [jsiManager searchTextDirect:pdfId searchTerm:searchTerm startPage:1 endPage:999 resolver:resolve rejecter:reject];
185
+ } else {
186
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
187
+ }
188
+ }
189
+
190
+ RCT_EXPORT_METHOD(getPerformanceMetricsDirect:(NSString *)pdfId
191
+ resolver:(RCTPromiseResolveBlock)resolve
192
+ rejecter:(RCTPromiseRejectBlock)reject)
193
+ {
194
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
195
+ if (jsiManager) {
196
+ [jsiManager getPerformanceMetrics:pdfId resolver:resolve rejecter:reject];
197
+ } else {
198
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
199
+ }
200
+ }
201
+
202
+ RCT_EXPORT_METHOD(setRenderQuality:(NSString *)pdfId
203
+ quality:(NSInteger)quality
204
+ resolver:(RCTPromiseResolveBlock)resolve
205
+ rejecter:(RCTPromiseRejectBlock)reject)
206
+ {
207
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
208
+ if (jsiManager) {
209
+ [jsiManager setRenderQuality:pdfId quality:quality resolver:resolve rejecter:reject];
210
+ } else {
211
+ reject(@"JSI_NOT_AVAILABLE", @"PDFJSIManager not available", nil);
212
+ }
213
+ }
214
+
215
+ RCT_EXPORT_METHOD(getJSIStats:(RCTPromiseResolveBlock)resolve
216
+ rejecter:(RCTPromiseRejectBlock)reject)
217
+ {
218
+ @try {
219
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
220
+
221
+ NSDictionary *stats = @{
222
+ @"jsiAvailable": jsiManager ? @YES : @NO,
223
+ @"platform": @"ios",
224
+ @"version": @"2.2.5",
225
+ @"message": jsiManager ? @"JSI stats available" : @"JSI not available"
226
+ };
227
+
228
+ resolve(stats);
229
+
230
+ } @catch (NSException *exception) {
231
+ reject(@"JSI_STATS_ERROR", exception.reason, nil);
232
+ }
233
+ }
234
+
235
+ RCT_EXPORT_METHOD(check16KBSupport:(RCTPromiseResolveBlock)resolve
236
+ rejecter:(RCTPromiseRejectBlock)reject)
237
+ {
238
+ PDFJSIManager *jsiManager = [self.bridge moduleForClass:[PDFJSIManager class]];
239
+ if (jsiManager) {
240
+ [jsiManager check16KBSupport:resolve rejecter:reject];
241
+ } else {
242
+ // Fallback response for iOS
243
+ resolve(@{
244
+ @"supported": @YES,
245
+ @"platform": @"ios",
246
+ @"message": @"iOS is compatible with 16KB page size requirements",
247
+ @"googlePlayCompliant": @YES,
248
+ @"iosCompatible": @YES
249
+ });
250
+ }
251
+ }
252
+
60
253
  + (BOOL)requiresMainQueueSetup {
61
254
  return YES;
62
255
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-pdf-jsi",
3
- "version": "2.2.4",
3
+ "version": "2.2.6",
4
4
  "summary": "High-performance React Native PDF viewer with JSI acceleration - up to 80x faster than traditional bridge",
5
5
  "description": "🚀 Ultra-fast React Native PDF viewer with JSI (JavaScript Interface) integration for maximum performance. Features lazy loading, smart caching, progressive loading, and zero-bridge overhead operations. Perfect for large PDF files with 30-day persistent cache and advanced memory optimization. Google Play 16KB page size compliant for Android 15+. Supports iOS, Android, and Windows platforms.",
6
6
  "main": "index.js",
@@ -1,31 +0,0 @@
1
- require 'json'
2
-
3
- package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
4
-
5
- fabric_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'
6
-
7
- Pod::Spec.new do |s|
8
- s.name = package['name']
9
- s.version = package['version']
10
- s.summary = package['summary']
11
- s.description = package['description']
12
- s.author = package['author']['name']
13
- s.author_email = package['author']['email']
14
- s.license = package['license']
15
- s.homepage = package['homepage']
16
- s.source = { :git => 'https://github.com/126punith/react-native-pdf-enhanced.git', :tag => "v#{s.version}" }
17
- s.requires_arc = true
18
- s.framework = "PDFKit"
19
-
20
- if fabric_enabled
21
- s.platforms = { ios: '11.0', tvos: '11.0' }
22
- s.source_files = 'ios/**/*.{h,m,mm,cpp}'
23
- s.requires_arc = true
24
- install_modules_dependencies(s)
25
-
26
- else
27
- s.platform = :ios, '8.0'
28
- s.source_files = 'ios/**/*.{h,m,mm}'
29
- s.dependency 'React-Core'
30
- end
31
- end