Skip to content

Commit f000f3b

Browse files
authored
feat(ios): add Dynamic Island support (#13625)
* feat(ios): add basic dynamic island support * fix(docs): fix invalid description in parameter * fix(ios): generate .swiftinterface files * fix: define default version * chore: move files to main target So it can be better included via the widget (still will require some CLI changes) * chore: move some logic * fix: fix linting errors * fix: fix generic parameter call from ObjC -> Swift
1 parent 51288dd commit f000f3b

11 files changed

+197
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
---
2+
name: Titanium.App.iOS.ActivityAttributes
3+
summary: |
4+
Use this module to communicate with the native iOS 16+ Dynamic Island APIs.
5+
description: |
6+
To properly use these APIs, you need to habe your Widget Extension ready.
7+
You can follow this [sample repository](https://github.com/hansemannn/titanium-widget-kit-sample-app) for an extended example.
8+
since: "12.0.0"
9+
platforms: [iphone, ipad]
10+
11+
methods:
12+
- name: startActivity
13+
summary: Starts a new activity (aka the Dynamic Island) with the provided parameters
14+
parameters:
15+
- name: value
16+
summary: |
17+
The values to pass to your extension. For maximum flexibility, this parameter should be passed
18+
as a String-based Object, e.g.
19+
```
20+
{
21+
"param1": "Hello",
22+
"param2": "World"
23+
}
24+
If you need to pass other types, please serialize them to a valid JSON object and pass it's
25+
stringified representation to this method.
26+
type: Object
27+
28+
examples:
29+
- title: Start a new activity
30+
example: |
31+
``` js
32+
const attributes = Ti.App.iOS.createActivityAttributes();
33+
attributes.startActivity({
34+
param1: "Hello",
35+
param2: "World",
36+
data: JSON.stringify({ intKey: 1, boolKey: true })
37+
});
38+
```
+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Appcelerator Titanium Mobile
3+
* Copyright TiDev, Inc. 04/07/2022-Present. All Rights Reserved.
4+
* Licensed under the terms of the Apache Public License
5+
* Please see the LICENSE included with this distribution for details.
6+
*/
7+
8+
#if canImport(ActivityKit)
9+
import Foundation
10+
import ActivityKit
11+
12+
publicstructTiActivityAttributes:ActivityAttributes{
13+
publictypealiasStatus=ContentState
14+
publicstructContentState:Codable,Hashable{
15+
varvalue:[String:String]
16+
}
17+
}
18+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Appcelerator Titanium Mobile
3+
* Copyright TiDev, Inc. 04/07/2022-Present. All Rights Reserved.
4+
* Licensed under the terms of the Apache Public License
5+
* Please see the LICENSE included with this distribution for details.
6+
*/
7+
8+
import TitaniumKit
9+
#if canImport(ActivityKit)
10+
import ActivityKit
11+
#endif
12+
13+
extensionTiAppiOSActivityAttributesProxy{
14+
15+
@objc(_startActivity:)
16+
classfunc _startActivity(args:Any){
17+
guardlet params = args as?[String:String]else{
18+
fatalError("Invalid parameters passed to \"startActivity\" method!")
19+
}
20+
21+
#if canImport(ActivityKit)
22+
letattributes=TiActivityAttributes()
23+
letcontentState=TiActivityAttributes.Status(value: params)
24+
25+
do{
26+
if #available(iOS 16.1,*){
27+
_ =try Activity<TiActivityAttributes>.request(attributes: attributes, contentState: contentState)
28+
}
29+
}catchlet error{
30+
NSLog("[ERROR] Cannot start activity: \(error.localizedDescription)")
31+
}
32+
#else
33+
NSLog("[ERROR] Cannot call \"startActivity\" on iOS < 16.1. Please add a guard to prevent this error log!")
34+
#endif
35+
}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/**
2+
* Axway Titanium
3+
* Copyright (c) 2009-present by Axway Appcelerator. All Rights Reserved.
4+
* Licensed under the terms of the Apache Public License
5+
* Please see the LICENSE included with this distribution for details.
6+
*/
7+
8+
#import<TitaniumKit/TitaniumKit.h>
9+
10+
@interfaceTiAppiOSActivityAttributesProxy : TiProxy
11+
12+
- (void)startActivity:(id)args;
13+
14+
@end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Axway Titanium
3+
* Copyright (c) 2009-present by Axway Appcelerator. All Rights Reserved.
4+
* Licensed under the terms of the Apache Public License
5+
* Please see the LICENSE included with this distribution for details.
6+
*/
7+
8+
#import"TiAppiOSActivityAttributesProxy.h"
9+
10+
@implementationTiAppiOSActivityAttributesProxy
11+
12+
- (void)startActivity:(id)args
13+
{
14+
ENSURE_SINGLE_ARG(args, NSDictionary);
15+
[TiAppiOSActivityAttributesProxy _startActivity:args];
16+
}
17+
18+
@end

iphone/Classes/TiAppiOSProxy.m

+6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#import<TitaniumKit/TiUtils.h>
1212

1313
#ifdef USE_TI_APPIOS
14+
#import"TiAppiOSActivityAttributesProxy.h"
1415
#import"TiAppiOSBackgroundServiceProxy.h"
1516
#import"TiAppiOSLocalNotificationProxy.h"
1617
#import"TiAppiOSSearchableIndexProxy.h"
@@ -502,6 +503,11 @@ - (TiAppiOSUserNotificationActionProxy *)createUserNotificationAction:(id)args
502503
return [[[TiAppiOSUserNotificationActionProxy alloc] _initWithPageContext:[selfexecutionContext] args:args] autorelease];
503504
}
504505

506+
- (TiAppiOSActivityAttributesProxy *)createActivityAttributes:(id)args
507+
{
508+
return [[[TiAppiOSActivityAttributesProxy alloc] _initWithPageContext:[selfexecutionContext] args:args] autorelease];
509+
}
510+
505511
- (TiAppiOSUserNotificationCategoryProxy *)createUserNotificationCategory:(id)args
506512
{
507513
return [[[TiAppiOSUserNotificationCategoryProxy alloc] _initWithPageContext:[selfexecutionContext] args:args] autorelease];

iphone/TitaniumKit/TitaniumKit.xcodeproj/project.pbxproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -774,7 +774,7 @@
774774
TargetAttributes = {
775775
DB258CCC1F09757E000D0D8D = {
776776
CreatedOnToolsVersion = 8.3.3;
777-
LastSwiftMigration = 1200;
777+
LastSwiftMigration = 1410;
778778
};
779779
DB9635BE1F0AB4AC00C41B20 = {
780780
CreatedOnToolsVersion = 8.3.3;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/**
2+
* Appcelerator Titanium Mobile
3+
* Copyright TiDev, Inc. 04/07/2022-Present. All Rights Reserved.
4+
* Licensed under the terms of the Apache Public License
5+
* Please see the LICENSE included with this distribution for details.
6+
*/
7+
8+
#if canImport(ActivityKit)
9+
import Foundation
10+
import ActivityKit
11+
12+
publicstructTiActivityAttributes:ActivityAttributes{
13+
publictypealiasStatus=ContentState
14+
publicstructContentState:Codable,Hashable{
15+
varvalue:[String:String]
16+
}
17+
}
18+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* Appcelerator Titanium Mobile
3+
* Copyright TiDev, Inc. 04/07/2022-Present. All Rights Reserved.
4+
* Licensed under the terms of the Apache Public License
5+
* Please see the LICENSE included with this distribution for details.
6+
*/
7+
8+
#if canImport(ActivityKit)
9+
import TitaniumKit
10+
import ActivityKit
11+
12+
@objc(TiAppiOSActivityAttributesProxy)
13+
publicclassTiAppiOSActivityAttributesProxy:TiProxy{
14+
15+
@objc(startActivity:)
16+
@available(iOS 16.1,*)
17+
func startActivity(args:[Any]){
18+
guardlet params = args.first as?[String:String]else{
19+
fatalError("Missing required parameters")
20+
}
21+
22+
letattributes=TiActivityAttributes()
23+
letcontentState=TiActivityAttributes.Status(value: params)
24+
25+
do{
26+
let _ =try Activity<TiActivityAttributes>.request(attributes: attributes, contentState: contentState)
27+
}catch(let error){
28+
NSLog("[ERROR] Cannot start activity: \(error.localizedDescription)")
29+
}
30+
}
31+
}
32+
#endif
+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
//
22
// Use this file to import your target's public headers that you would like to expose to Swift.
33
//
4+
5+
#import"TiAppiOSActivityAttributesProxy.h"

iphone/iphone/Titanium.xcodeproj/project.pbxproj

+14
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@
152152
2B94603713F0A2AE000C5BEA /* TiUIiOSCoverFlowViewProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B94603513F0A2AE000C5BEA /* TiUIiOSCoverFlowViewProxy.m */; };
153153
2BCD59C51429561D00DEC2E8 /* TiUIToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BCD59C21429561D00DEC2E8 /* TiUIToolbar.m */; };
154154
3186097F192BDB4E00093482 /* AnalyticsModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 3186097E192BDB4E00093482 /* AnalyticsModule.m */; };
155+
3A0858422915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A08583F2915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift */; };
156+
3A0858432915C3C5002D5E3A /* TiActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A0858412915C3C5002D5E3A /* TiActivityAttributes.swift */; };
155157
3A0B56791C0CD81C00709DA4 /* TiUIiOSLivePhoto.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A0B56741C0CD81C00709DA4 /* TiUIiOSLivePhoto.m */; };
156158
3A0B567A1C0CD81C00709DA4 /* TiUIiOSLivePhotoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A0B56761C0CD81C00709DA4 /* TiUIiOSLivePhotoView.m */; };
157159
3A0B567B1C0CD81C00709DA4 /* TiUIiOSLivePhotoViewProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A0B56781C0CD81C00709DA4 /* TiUIiOSLivePhotoViewProxy.m */; };
@@ -176,6 +178,7 @@
176178
3AB9137C1BB60F070063A4AD /* TiPreviewingDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AB9137B1BB60F070063A4AD /* TiPreviewingDelegate.m */; };
177179
3AB913801BB61FDA0063A4AD /* TiUIiOSPreviewActionProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AB9137F1BB61FDA0063A4AD /* TiUIiOSPreviewActionProxy.m */; };
178180
3ABA85AB1D7204B100BCD3F1 /* TiAppiOSSearchQueryProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ABA85AA1D7204B100BCD3F1 /* TiAppiOSSearchQueryProxy.m */; };
181+
3AC8F4592916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AC8F4582916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m */; };
179182
673144D6211DBAD7001BDBF2 /* TiUIApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 673144D5211DBAD7001BDBF2 /* TiUIApplication.m */; };
180183
6CF8E95921CDA58800519245 /* TiUITabbedBarProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CF8E95821CDA58800519245 /* TiUITabbedBarProxy.m */; };
181184
823CC8AC1B7F0E4D00D220C7 /* WatchSessionModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 823CC8AB1B7F0E4D00D220C7 /* WatchSessionModule.m */; };
@@ -591,6 +594,8 @@
591594
3186097D192BDB4E00093482 /* AnalyticsModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnalyticsModule.h; sourceTree = "<group>"; };
592595
3186097E192BDB4E00093482 /* AnalyticsModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnalyticsModule.m; sourceTree = "<group>"; };
593596
32CA4F630368D1EE00C91783 /* Titanium_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Titanium_Prefix.pch; sourceTree = "<group>"; };
597+
3A08583F2915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TiAppiOSActivityAttributesProxy+startActivity.swift"; sourceTree = "<group>"; };
598+
3A0858412915C3C5002D5E3A /* TiActivityAttributes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TiActivityAttributes.swift; sourceTree = "<group>"; };
594599
3A0B56731C0CD81C00709DA4 /* TiUIiOSLivePhoto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiUIiOSLivePhoto.h; sourceTree = "<group>"; };
595600
3A0B56741C0CD81C00709DA4 /* TiUIiOSLivePhoto.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiUIiOSLivePhoto.m; sourceTree = "<group>"; };
596601
3A0B56751C0CD81C00709DA4 /* TiUIiOSLivePhotoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiUIiOSLivePhotoView.h; sourceTree = "<group>"; };
@@ -635,6 +640,8 @@
635640
3AB9137F1BB61FDA0063A4AD /* TiUIiOSPreviewActionProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiUIiOSPreviewActionProxy.m; sourceTree = "<group>"; };
636641
3ABA85A91D7204B100BCD3F1 /* TiAppiOSSearchQueryProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiAppiOSSearchQueryProxy.h; sourceTree = "<group>"; };
637642
3ABA85AA1D7204B100BCD3F1 /* TiAppiOSSearchQueryProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiAppiOSSearchQueryProxy.m; sourceTree = "<group>"; };
643+
3AC8F4572916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TiAppiOSActivityAttributesProxy.h; sourceTree = "<group>"; };
644+
3AC8F4582916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TiAppiOSActivityAttributesProxy.m; sourceTree = "<group>"; };
638645
50115A9315D5DE0500122055 /* ThirdpartyNS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThirdpartyNS.h; path = ../Classes/ThirdpartyNS.h; sourceTree = SOURCE_ROOT; };
639646
673144D4211DBAD7001BDBF2 /* TiUIApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TiUIApplication.h; path = ../Classes/TiUIApplication.h; sourceTree = "<group>"; };
640647
673144D5211DBAD7001BDBF2 /* TiUIApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TiUIApplication.m; path = ../Classes/TiUIApplication.m; sourceTree = "<group>"; };
@@ -897,6 +904,10 @@
897904
24ADC50F1299F5A50014DB75 /* iOS */ = {
898905
isa = PBXGroup;
899906
children = (
907+
3A0858412915C3C5002D5E3A /* TiActivityAttributes.swift */,
908+
3A08583F2915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift */,
909+
3AC8F4572916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.h */,
910+
3AC8F4582916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m */,
900911
1953DD611E0A5E6E00414348 /* TiAppiOSUserActivityProxy.h */,
901912
1953DD621E0A5E6E00414348 /* TiAppiOSUserActivityProxy.m */,
902913
24ADC5101299F60C0014DB75 /* TiAppiOSProxy.h */,
@@ -2211,6 +2222,7 @@
22112222
24CA8BD2111161FE0084E2DE /* TiAction.m in Sources */,
22122223
24CA8BD9111161FE0084E2DE /* TiPlatformDisplayCaps.m in Sources */,
22132224
24CA8BDA111161FE0084E2DE /* PlatformModule.m in Sources */,
2225+
3A0858422915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift in Sources */,
22142226
84A00FFF17FB833000D4BF94 /* TiPushBehavior.m in Sources */,
22152227
1592CC2E1C47148D00C3DB83 /* TiUIiOSTableViewScrollPositionProxy.m in Sources */,
22162228
24CA8BDC111161FE0084E2DE /* NetworkModule.m in Sources */,
@@ -2253,6 +2265,7 @@
22532265
15CB440E1C4EBE4000D81480 /* TiUIiOSStatusBarProxy.m in Sources */,
22542266
C6BEA5861D8FD0B100485DAC /* TiMediaSystemAlertProxy.m in Sources */,
22552267
245B3C3D11375A6600CE7530 /* UtilsModule.m in Sources */,
2268+
3AC8F4592916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m in Sources */,
22562269
1592CC3D1C4D800B00C3DB83 /* TiUIiOSScrollIndicatorStyleProxy.m in Sources */,
22572270
24C0128C1140D30B00A94CE2 /* TiUIMaskedImageProxy.m in Sources */,
22582271
24C012921140D31C00A94CE2 /* TiUIMaskedImage.m in Sources */,
@@ -2271,6 +2284,7 @@
22712284
24E50E27116066A800AF54AF /* TiUIDashboardViewProxy.m in Sources */,
22722285
24E50E30116066B400AF54AF /* TiUIDashboardView.m in Sources */,
22732286
3A811CD31C2C21FE0023468C /* TiUIiOSBlurView.m in Sources */,
2287+
3A0858432915C3C5002D5E3A /* TiActivityAttributes.swift in Sources */,
22742288
24E50F911160792D00AF54AF /* TiUIDashboardItemProxy.m in Sources */,
22752289
24596694118E70D300519F79 /* ApplicationRouting.m in Sources */,
22762290
B606EF4A190B14ED00663EFC /* Reachability.m in Sources */,

0 commit comments

Comments
 (0)
close