Skip to content

Commit

Permalink
feat(ios): add Dynamic Island support (#13625)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
hansemannn committed Dec 12, 2022
1 parent 51288dd commit f000f3b
Show file tree
Hide file tree
Showing 11 changed files with 197 additions and 1 deletion.
38 changes: 38 additions & 0 deletions apidoc/Titanium/App/iOS/ActivityAttributes.yml
@@ -0,0 +1,38 @@
---
name: Titanium.App.iOS.ActivityAttributes
summary: |
Use this module to communicate with the native iOS 16+ Dynamic Island APIs.
description: |
To properly use these APIs, you need to habe your Widget Extension ready.
You can follow this [sample repository](https://github.com/hansemannn/titanium-widget-kit-sample-app) for an extended example.
since: "12.0.0"
platforms: [iphone, ipad]

methods:
- name: startActivity
summary: Starts a new activity (aka the Dynamic Island) with the provided parameters
parameters:
- name: value
summary: |
The values to pass to your extension. For maximum flexibility, this parameter should be passed
as a String-based Object, e.g.
```
{
"param1": "Hello",
"param2": "World"
}
If you need to pass other types, please serialize them to a valid JSON object and pass it's
stringified representation to this method.
type: Object

examples:
- title: Start a new activity
example: |
``` js
const attributes = Ti.App.iOS.createActivityAttributes();
attributes.startActivity({
param1: "Hello",
param2: "World",
data: JSON.stringify({ intKey: 1, boolKey: true })
});
```
18 changes: 18 additions & 0 deletions iphone/Classes/TiActivityAttributes.swift
@@ -0,0 +1,18 @@
/**
* Appcelerator Titanium Mobile
* Copyright TiDev, Inc. 04/07/2022-Present. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/

#if canImport(ActivityKit)
import Foundation
import ActivityKit

public struct TiActivityAttributes: ActivityAttributes {
public typealias Status = ContentState
public struct ContentState: Codable, Hashable {
var value: [String: String]
}
}
#endif
36 changes: 36 additions & 0 deletions iphone/Classes/TiAppiOSActivityAttributesProxy+startActivity.swift
@@ -0,0 +1,36 @@
/**
* Appcelerator Titanium Mobile
* Copyright TiDev, Inc. 04/07/2022-Present. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/

import TitaniumKit
#if canImport(ActivityKit)
import ActivityKit
#endif

extension TiAppiOSActivityAttributesProxy {

@objc(_startActivity:)
class func _startActivity(args: Any) {
guard let params = args as? [String: String] else {
fatalError("Invalid parameters passed to \"startActivity\" method!")
}

#if canImport(ActivityKit)
let attributes = TiActivityAttributes()
let contentState = TiActivityAttributes.Status(value: params)

do {
if #available(iOS 16.1, *) {
_ = try Activity<TiActivityAttributes>.request(attributes: attributes, contentState: contentState)
}
} catch let error {
NSLog("[ERROR] Cannot start activity: \(error.localizedDescription)")
}
#else
NSLog("[ERROR] Cannot call \"startActivity\" on iOS < 16.1. Please add a guard to prevent this error log!")
#endif
}
}
14 changes: 14 additions & 0 deletions iphone/Classes/TiAppiOSActivityAttributesProxy.h
@@ -0,0 +1,14 @@
/**
* Axway Titanium
* Copyright (c) 2009-present by Axway Appcelerator. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/

#import <TitaniumKit/TitaniumKit.h>

@interface TiAppiOSActivityAttributesProxy : TiProxy

- (void)startActivity:(id)args;

@end
18 changes: 18 additions & 0 deletions iphone/Classes/TiAppiOSActivityAttributesProxy.m
@@ -0,0 +1,18 @@
/**
* Axway Titanium
* Copyright (c) 2009-present by Axway Appcelerator. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/

#import "TiAppiOSActivityAttributesProxy.h"

@implementation TiAppiOSActivityAttributesProxy

- (void)startActivity:(id)args
{
ENSURE_SINGLE_ARG(args, NSDictionary);
[TiAppiOSActivityAttributesProxy _startActivity:args];
}

@end
6 changes: 6 additions & 0 deletions iphone/Classes/TiAppiOSProxy.m
Expand Up @@ -11,6 +11,7 @@
#import <TitaniumKit/TiUtils.h>

#ifdef USE_TI_APPIOS
#import "TiAppiOSActivityAttributesProxy.h"
#import "TiAppiOSBackgroundServiceProxy.h"
#import "TiAppiOSLocalNotificationProxy.h"
#import "TiAppiOSSearchableIndexProxy.h"
Expand Down Expand Up @@ -502,6 +503,11 @@ - (TiAppiOSUserNotificationActionProxy *)createUserNotificationAction:(id)args
return [[[TiAppiOSUserNotificationActionProxy alloc] _initWithPageContext:[self executionContext] args:args] autorelease];
}

- (TiAppiOSActivityAttributesProxy *)createActivityAttributes:(id)args
{
return [[[TiAppiOSActivityAttributesProxy alloc] _initWithPageContext:[self executionContext] args:args] autorelease];
}

- (TiAppiOSUserNotificationCategoryProxy *)createUserNotificationCategory:(id)args
{
return [[[TiAppiOSUserNotificationCategoryProxy alloc] _initWithPageContext:[self executionContext] args:args] autorelease];
Expand Down
2 changes: 1 addition & 1 deletion iphone/TitaniumKit/TitaniumKit.xcodeproj/project.pbxproj
Expand Up @@ -774,7 +774,7 @@
TargetAttributes = {
DB258CCC1F09757E000D0D8D = {
CreatedOnToolsVersion = 8.3.3;
LastSwiftMigration = 1200;
LastSwiftMigration = 1410;
};
DB9635BE1F0AB4AC00C41B20 = {
CreatedOnToolsVersion = 8.3.3;
Expand Down
@@ -0,0 +1,18 @@
/**
* Appcelerator Titanium Mobile
* Copyright TiDev, Inc. 04/07/2022-Present. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/

#if canImport(ActivityKit)
import Foundation
import ActivityKit

public struct TiActivityAttributes: ActivityAttributes {
public typealias Status = ContentState
public struct ContentState: Codable, Hashable {
var value: [String: String]
}
}
#endif
@@ -0,0 +1,32 @@
/**
* Appcelerator Titanium Mobile
* Copyright TiDev, Inc. 04/07/2022-Present. All Rights Reserved.
* Licensed under the terms of the Apache Public License
* Please see the LICENSE included with this distribution for details.
*/

#if canImport(ActivityKit)
import TitaniumKit
import ActivityKit

@objc(TiAppiOSActivityAttributesProxy)
public class TiAppiOSActivityAttributesProxy : TiProxy {

@objc(startActivity:)
@available(iOS 16.1, *)
func startActivity(args: [Any]) {
guard let params = args.first as? [String: String] else {
fatalError("Missing required parameters")
}

let attributes = TiActivityAttributes()
let contentState = TiActivityAttributes.Status(value: params)

do {
let _ = try Activity<TiActivityAttributes>.request(attributes: attributes, contentState: contentState)
} catch (let error) {
NSLog("[ERROR] Cannot start activity: \(error.localizedDescription)")
}
}
}
#endif
2 changes: 2 additions & 0 deletions iphone/iphone/Titanium-Bridging-Header.h
@@ -1,3 +1,5 @@
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "TiAppiOSActivityAttributesProxy.h"
14 changes: 14 additions & 0 deletions iphone/iphone/Titanium.xcodeproj/project.pbxproj
Expand Up @@ -152,6 +152,8 @@
2B94603713F0A2AE000C5BEA /* TiUIiOSCoverFlowViewProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2B94603513F0A2AE000C5BEA /* TiUIiOSCoverFlowViewProxy.m */; };
2BCD59C51429561D00DEC2E8 /* TiUIToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BCD59C21429561D00DEC2E8 /* TiUIToolbar.m */; };
3186097F192BDB4E00093482 /* AnalyticsModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 3186097E192BDB4E00093482 /* AnalyticsModule.m */; };
3A0858422915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A08583F2915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift */; };
3A0858432915C3C5002D5E3A /* TiActivityAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A0858412915C3C5002D5E3A /* TiActivityAttributes.swift */; };
3A0B56791C0CD81C00709DA4 /* TiUIiOSLivePhoto.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A0B56741C0CD81C00709DA4 /* TiUIiOSLivePhoto.m */; };
3A0B567A1C0CD81C00709DA4 /* TiUIiOSLivePhotoView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A0B56761C0CD81C00709DA4 /* TiUIiOSLivePhotoView.m */; };
3A0B567B1C0CD81C00709DA4 /* TiUIiOSLivePhotoViewProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3A0B56781C0CD81C00709DA4 /* TiUIiOSLivePhotoViewProxy.m */; };
Expand All @@ -176,6 +178,7 @@
3AB9137C1BB60F070063A4AD /* TiPreviewingDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AB9137B1BB60F070063A4AD /* TiPreviewingDelegate.m */; };
3AB913801BB61FDA0063A4AD /* TiUIiOSPreviewActionProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AB9137F1BB61FDA0063A4AD /* TiUIiOSPreviewActionProxy.m */; };
3ABA85AB1D7204B100BCD3F1 /* TiAppiOSSearchQueryProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3ABA85AA1D7204B100BCD3F1 /* TiAppiOSSearchQueryProxy.m */; };
3AC8F4592916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3AC8F4582916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m */; };
673144D6211DBAD7001BDBF2 /* TiUIApplication.m in Sources */ = {isa = PBXBuildFile; fileRef = 673144D5211DBAD7001BDBF2 /* TiUIApplication.m */; };
6CF8E95921CDA58800519245 /* TiUITabbedBarProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6CF8E95821CDA58800519245 /* TiUITabbedBarProxy.m */; };
823CC8AC1B7F0E4D00D220C7 /* WatchSessionModule.m in Sources */ = {isa = PBXBuildFile; fileRef = 823CC8AB1B7F0E4D00D220C7 /* WatchSessionModule.m */; };
Expand Down Expand Up @@ -591,6 +594,8 @@
3186097D192BDB4E00093482 /* AnalyticsModule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AnalyticsModule.h; sourceTree = "<group>"; };
3186097E192BDB4E00093482 /* AnalyticsModule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AnalyticsModule.m; sourceTree = "<group>"; };
32CA4F630368D1EE00C91783 /* Titanium_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Titanium_Prefix.pch; sourceTree = "<group>"; };
3A08583F2915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TiAppiOSActivityAttributesProxy+startActivity.swift"; sourceTree = "<group>"; };
3A0858412915C3C5002D5E3A /* TiActivityAttributes.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TiActivityAttributes.swift; sourceTree = "<group>"; };
3A0B56731C0CD81C00709DA4 /* TiUIiOSLivePhoto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiUIiOSLivePhoto.h; sourceTree = "<group>"; };
3A0B56741C0CD81C00709DA4 /* TiUIiOSLivePhoto.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiUIiOSLivePhoto.m; sourceTree = "<group>"; };
3A0B56751C0CD81C00709DA4 /* TiUIiOSLivePhotoView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiUIiOSLivePhotoView.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -635,6 +640,8 @@
3AB9137F1BB61FDA0063A4AD /* TiUIiOSPreviewActionProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiUIiOSPreviewActionProxy.m; sourceTree = "<group>"; };
3ABA85A91D7204B100BCD3F1 /* TiAppiOSSearchQueryProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TiAppiOSSearchQueryProxy.h; sourceTree = "<group>"; };
3ABA85AA1D7204B100BCD3F1 /* TiAppiOSSearchQueryProxy.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TiAppiOSSearchQueryProxy.m; sourceTree = "<group>"; };
3AC8F4572916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TiAppiOSActivityAttributesProxy.h; sourceTree = "<group>"; };
3AC8F4582916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TiAppiOSActivityAttributesProxy.m; sourceTree = "<group>"; };
50115A9315D5DE0500122055 /* ThirdpartyNS.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ThirdpartyNS.h; path = ../Classes/ThirdpartyNS.h; sourceTree = SOURCE_ROOT; };
673144D4211DBAD7001BDBF2 /* TiUIApplication.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TiUIApplication.h; path = ../Classes/TiUIApplication.h; sourceTree = "<group>"; };
673144D5211DBAD7001BDBF2 /* TiUIApplication.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = TiUIApplication.m; path = ../Classes/TiUIApplication.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -897,6 +904,10 @@
24ADC50F1299F5A50014DB75 /* iOS */ = {
isa = PBXGroup;
children = (
3A0858412915C3C5002D5E3A /* TiActivityAttributes.swift */,
3A08583F2915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift */,
3AC8F4572916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.h */,
3AC8F4582916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m */,
1953DD611E0A5E6E00414348 /* TiAppiOSUserActivityProxy.h */,
1953DD621E0A5E6E00414348 /* TiAppiOSUserActivityProxy.m */,
24ADC5101299F60C0014DB75 /* TiAppiOSProxy.h */,
Expand Down Expand Up @@ -2211,6 +2222,7 @@
24CA8BD2111161FE0084E2DE /* TiAction.m in Sources */,
24CA8BD9111161FE0084E2DE /* TiPlatformDisplayCaps.m in Sources */,
24CA8BDA111161FE0084E2DE /* PlatformModule.m in Sources */,
3A0858422915C3C5002D5E3A /* TiAppiOSActivityAttributesProxy+startActivity.swift in Sources */,
84A00FFF17FB833000D4BF94 /* TiPushBehavior.m in Sources */,
1592CC2E1C47148D00C3DB83 /* TiUIiOSTableViewScrollPositionProxy.m in Sources */,
24CA8BDC111161FE0084E2DE /* NetworkModule.m in Sources */,
Expand Down Expand Up @@ -2253,6 +2265,7 @@
15CB440E1C4EBE4000D81480 /* TiUIiOSStatusBarProxy.m in Sources */,
C6BEA5861D8FD0B100485DAC /* TiMediaSystemAlertProxy.m in Sources */,
245B3C3D11375A6600CE7530 /* UtilsModule.m in Sources */,
3AC8F4592916A6B900A8A3D7 /* TiAppiOSActivityAttributesProxy.m in Sources */,
1592CC3D1C4D800B00C3DB83 /* TiUIiOSScrollIndicatorStyleProxy.m in Sources */,
24C0128C1140D30B00A94CE2 /* TiUIMaskedImageProxy.m in Sources */,
24C012921140D31C00A94CE2 /* TiUIMaskedImage.m in Sources */,
Expand All @@ -2271,6 +2284,7 @@
24E50E27116066A800AF54AF /* TiUIDashboardViewProxy.m in Sources */,
24E50E30116066B400AF54AF /* TiUIDashboardView.m in Sources */,
3A811CD31C2C21FE0023468C /* TiUIiOSBlurView.m in Sources */,
3A0858432915C3C5002D5E3A /* TiActivityAttributes.swift in Sources */,
24E50F911160792D00AF54AF /* TiUIDashboardItemProxy.m in Sources */,
24596694118E70D300519F79 /* ApplicationRouting.m in Sources */,
B606EF4A190B14ED00663EFC /* Reachability.m in Sources */,
Expand Down

0 comments on commit f000f3b

Please sign in to comment.