Merge branch 'develop' into chore.circleci_caching
This commit is contained in:
commit
19c129d4d7
|
@ -1,7 +1,34 @@
|
|||
<!-- INSTRUCTION: Keep the line below to notify all core developers about this new PR -->
|
||||
@RocketChat/ReactNative
|
||||
<!-- This is a pull request template, you do not need to uncomment or remove the comments, they won't show up in the PR text. -->
|
||||
|
||||
<!-- INSTRUCTION: Inform the issue number that this PR closes, or remove the line below -->
|
||||
Closes #ISSUE_NUMBER
|
||||
## Proposed changes
|
||||
<!-- Describe the big picture of your changes here to communicate to the maintainers why we should accept this pull request. If it fixes a bug or resolves a feature request, be sure to link to that issue below. -->
|
||||
|
||||
<!-- INSTRUCTION: Tell us more about your PR with screen shots if you can -->
|
||||
## Issue(s)
|
||||
<!-- Link the issues being closed by or related to this PR. For example, you can use #594 if this PR closes issue number 594 -->
|
||||
|
||||
## How to test or reproduce
|
||||
<!-- Mention how you would reproduce the bug if not mentioned on the issue page already. Also mention which screens are going to have the changes if applicable -->
|
||||
|
||||
## Screenshots
|
||||
|
||||
## Types of changes
|
||||
<!-- What types of changes does your code introduce to Rocket.Chat? -->
|
||||
<!-- Put an `x` in the boxes that apply -->
|
||||
|
||||
- [ ] Bugfix (non-breaking change which fixes an issue)
|
||||
- [ ] Improvement (non-breaking change which improves a current function)
|
||||
- [ ] New feature (non-breaking change which adds functionality)
|
||||
- [ ] Documentation update (if none of the other choices apply)
|
||||
|
||||
## Checklist
|
||||
<!-- Put an `x` in the boxes that apply. You can also fill these out after creating the PR. If you're unsure about any of them, don't hesitate to ask. We're here to help! This is simply a reminder of what we are going to look for before merging your code. -->
|
||||
|
||||
- [ ] I have read the [CONTRIBUTING](https://github.com/RocketChat/Rocket.Chat/blob/develop/.github/CONTRIBUTING.md#contributing-to-rocketchat) doc
|
||||
- [ ] I have signed the [CLA](https://cla-assistant.io/RocketChat/Rocket.Chat.ReactNative)
|
||||
- [ ] Lint and unit tests pass locally with my changes
|
||||
- [ ] I have added tests that prove my fix is effective or that my feature works (if applicable)
|
||||
- [ ] I have added necessary documentation (if applicable)
|
||||
- [ ] Any dependent changes have been merged and published in downstream modules
|
||||
|
||||
## Further comments
|
||||
<!-- If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did and what alternatives you considered, etc... -->
|
||||
|
|
|
@ -4994,137 +4994,6 @@ exports[`Storyshots Message list message 1`] = `
|
|||
</RCTScrollView>
|
||||
`;
|
||||
|
||||
exports[`Storyshots RoomItem list roomitem 1`] = `
|
||||
<RCTScrollView
|
||||
style={
|
||||
Object {
|
||||
"backgroundColor": "#efeff4",
|
||||
}
|
||||
}
|
||||
>
|
||||
<View>
|
||||
<Text
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"fontSize": 20,
|
||||
"fontWeight": "300",
|
||||
"marginLeft": 10,
|
||||
"marginTop": 30,
|
||||
},
|
||||
Object {
|
||||
"backgroundColor": "#ffffff",
|
||||
"color": "#0d0e12",
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
>
|
||||
Basic
|
||||
</Text>
|
||||
View
|
||||
<Text
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"fontSize": 20,
|
||||
"fontWeight": "300",
|
||||
"marginLeft": 10,
|
||||
"marginTop": 30,
|
||||
},
|
||||
Object {
|
||||
"backgroundColor": "#ffffff",
|
||||
"color": "#0d0e12",
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
>
|
||||
User
|
||||
</Text>
|
||||
View
|
||||
View
|
||||
<Text
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"fontSize": 20,
|
||||
"fontWeight": "300",
|
||||
"marginLeft": 10,
|
||||
"marginTop": 30,
|
||||
},
|
||||
Object {
|
||||
"backgroundColor": "#ffffff",
|
||||
"color": "#0d0e12",
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
>
|
||||
Type
|
||||
</Text>
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
<Text
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"fontSize": 20,
|
||||
"fontWeight": "300",
|
||||
"marginLeft": 10,
|
||||
"marginTop": 30,
|
||||
},
|
||||
Object {
|
||||
"backgroundColor": "#ffffff",
|
||||
"color": "#0d0e12",
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
>
|
||||
Alerts
|
||||
</Text>
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
<Text
|
||||
style={
|
||||
Array [
|
||||
Object {
|
||||
"fontSize": 20,
|
||||
"fontWeight": "300",
|
||||
"marginLeft": 10,
|
||||
"marginTop": 30,
|
||||
},
|
||||
Object {
|
||||
"backgroundColor": "#ffffff",
|
||||
"color": "#0d0e12",
|
||||
},
|
||||
undefined,
|
||||
]
|
||||
}
|
||||
>
|
||||
Last Message
|
||||
</Text>
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
View
|
||||
</View>
|
||||
</RCTScrollView>
|
||||
`;
|
||||
|
||||
exports[`Storyshots UiKitMessage list uikitmessage 1`] = `
|
||||
<RCTSafeAreaView
|
||||
emulateUnlessSupported={true}
|
||||
|
|
|
@ -171,12 +171,12 @@ android {
|
|||
}
|
||||
}
|
||||
|
||||
packagingOptions {
|
||||
pickFirst '**/armeabi-v7a/libc++_shared.so'
|
||||
pickFirst '**/x86/libc++_shared.so'
|
||||
pickFirst '**/arm64-v8a/libc++_shared.so'
|
||||
pickFirst '**/x86_64/libc++_shared.so'
|
||||
}
|
||||
// packagingOptions {
|
||||
// pickFirst '**/armeabi-v7a/libc++_shared.so'
|
||||
// pickFirst '**/x86/libc++_shared.so'
|
||||
// pickFirst '**/arm64-v8a/libc++_shared.so'
|
||||
// pickFirst '**/x86_64/libc++_shared.so'
|
||||
// }
|
||||
|
||||
// applicationVariants are e.g. debug, release
|
||||
applicationVariants.all { variant ->
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||
buildscript {
|
||||
ext {
|
||||
buildToolsVersion = "28.0.3"
|
||||
buildToolsVersion = "29.0.2"
|
||||
minSdkVersion = 21
|
||||
compileSdkVersion = 28
|
||||
targetSdkVersion = 28
|
||||
compileSdkVersion = 29
|
||||
targetSdkVersion = 29
|
||||
glideVersion = "4.9.0"
|
||||
kotlin_version = "1.3.50"
|
||||
supportLibVersion = "28.0.0"
|
||||
|
@ -18,7 +18,7 @@ buildscript {
|
|||
}
|
||||
}
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:3.5.2'
|
||||
classpath 'com.android.tools.build:gradle:3.5.3'
|
||||
classpath 'com.google.gms:google-services:4.2.0'
|
||||
classpath 'io.fabric.tools:gradle:1.28.1'
|
||||
classpath 'com.google.firebase:perf-plugin:1.2.1'
|
||||
|
|
|
@ -27,7 +27,7 @@ android.useAndroidX=true
|
|||
android.enableJetifier=true
|
||||
|
||||
# Version of flipper SDK to use with React Native
|
||||
FLIPPER_VERSION=0.33.1
|
||||
FLIPPER_VERSION=0.37.0
|
||||
|
||||
# App properties
|
||||
VERSIONCODE=999999999
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-all.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
|
@ -154,19 +154,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
|||
else
|
||||
eval `echo args$i`="\"$arg\""
|
||||
fi
|
||||
i=$((i+1))
|
||||
i=`expr $i + 1`
|
||||
done
|
||||
case $i in
|
||||
(0) set -- ;;
|
||||
(1) set -- "$args0" ;;
|
||||
(2) set -- "$args0" "$args1" ;;
|
||||
(3) set -- "$args0" "$args1" "$args2" ;;
|
||||
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
0) set -- ;;
|
||||
1) set -- "$args0" ;;
|
||||
2) set -- "$args0" "$args1" ;;
|
||||
3) set -- "$args0" "$args1" "$args2" ;;
|
||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
|
@ -175,14 +175,9 @@ save () {
|
|||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
||||
echo " "
|
||||
}
|
||||
APP_ARGS=$(save "$@")
|
||||
APP_ARGS=`save "$@"`
|
||||
|
||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
||||
|
||||
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
|
||||
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
|
||||
cd "$(dirname "$0")"
|
||||
fi
|
||||
|
||||
exec "$JAVACMD" "$@"
|
|
@ -5,7 +5,7 @@
|
|||
@rem you may not use this file except in compliance with the License.
|
||||
@rem You may obtain a copy of the License at
|
||||
@rem
|
||||
@rem http://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem https://www.apache.org/licenses/LICENSE-2.0
|
||||
@rem
|
||||
@rem Unless required by applicable law or agreed to in writing, software
|
||||
@rem distributed under the License is distributed on an "AS IS" BASIS,
|
||||
|
@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
|
|||
set APP_BASE_NAME=%~n0
|
||||
set APP_HOME=%DIRNAME%
|
||||
|
||||
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
|
||||
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
|
||||
|
||||
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
|
||||
|
||||
|
|
|
@ -122,6 +122,7 @@ class MessageBox extends Component {
|
|||
command: {}
|
||||
};
|
||||
this.text = '';
|
||||
this.selection = { start: 0, end: 0 };
|
||||
this.focused = false;
|
||||
|
||||
// MessageBox Actions
|
||||
|
@ -331,6 +332,10 @@ class MessageBox extends Component {
|
|||
this.setInput(text);
|
||||
}
|
||||
|
||||
onSelectionChange = (e) => {
|
||||
this.selection = e.nativeEvent.selection;
|
||||
}
|
||||
|
||||
// eslint-disable-next-line react/sort-comp
|
||||
debouncedOnChangeText = debounce(async(text) => {
|
||||
const { sharing } = this.props;
|
||||
|
@ -358,9 +363,9 @@ class MessageBox extends Component {
|
|||
|
||||
if (!isTextEmpty) {
|
||||
try {
|
||||
const { start, end } = this.component?.lastNativeSelection;
|
||||
const { start, end } = this.selection;
|
||||
const cursor = Math.max(start, end);
|
||||
const lastNativeText = this.component?.lastNativeText || '';
|
||||
const lastNativeText = this.text;
|
||||
// matches if text either starts with '/' or have (@,#,:) then it groups whatever comes next of mention type
|
||||
let regexp = /(#|@|:|^\/)([a-z0-9._-]+)$/im;
|
||||
|
||||
|
@ -399,7 +404,7 @@ class MessageBox extends Component {
|
|||
}
|
||||
const { trackingType } = this.state;
|
||||
const msg = this.text;
|
||||
const { start, end } = this.component?.lastNativeSelection;
|
||||
const { start, end } = this.selection;
|
||||
const cursor = Math.max(start, end);
|
||||
const regexp = /([a-z0-9._-]+)$/im;
|
||||
const result = msg.substr(0, cursor).replace(regexp, '');
|
||||
|
@ -410,7 +415,8 @@ class MessageBox extends Component {
|
|||
if ((trackingType === MENTIONS_TRACKING_TYPE_COMMANDS) && item.providesPreview) {
|
||||
this.setState({ showCommandPreview: true });
|
||||
}
|
||||
this.setInput(text);
|
||||
const newCursor = cursor + mentionName.length;
|
||||
this.setInput(text, { start: newCursor, end: newCursor });
|
||||
this.focus();
|
||||
requestAnimationFrame(() => this.stopTrackingMention());
|
||||
}
|
||||
|
@ -443,15 +449,11 @@ class MessageBox extends Component {
|
|||
let newText = '';
|
||||
|
||||
// if messagebox has an active cursor
|
||||
if (this.component?.lastNativeSelection) {
|
||||
const { start, end } = this.component.lastNativeSelection;
|
||||
const cursor = Math.max(start, end);
|
||||
newText = `${ text.substr(0, cursor) }${ emoji }${ text.substr(cursor) }`;
|
||||
} else {
|
||||
// if messagebox doesn't have a cursor, just append selected emoji
|
||||
newText = `${ text }${ emoji }`;
|
||||
}
|
||||
this.setInput(newText);
|
||||
const { start, end } = this.selection;
|
||||
const cursor = Math.max(start, end);
|
||||
newText = `${ text.substr(0, cursor) }${ emoji }${ text.substr(cursor) }`;
|
||||
const newCursor = cursor + emoji.length;
|
||||
this.setInput(newText, { start: newCursor, end: newCursor });
|
||||
this.setShowSend(true);
|
||||
}
|
||||
|
||||
|
@ -551,11 +553,12 @@ class MessageBox extends Component {
|
|||
this.setState({ commandPreview: [], showCommandPreview: true, command: {} });
|
||||
}
|
||||
|
||||
setInput = (text) => {
|
||||
setInput = (text, selection) => {
|
||||
this.text = text;
|
||||
if (this.component && this.component.setNativeProps) {
|
||||
this.component.setNativeProps({ text });
|
||||
if (selection) {
|
||||
return this.component.setTextAndSelection(text, selection);
|
||||
}
|
||||
this.component.setNativeProps({ text });
|
||||
}
|
||||
|
||||
setShowSend = (showSend) => {
|
||||
|
@ -888,6 +891,7 @@ class MessageBox extends Component {
|
|||
blurOnSubmit={false}
|
||||
placeholder={I18n.t('New_Message')}
|
||||
onChangeText={this.onChangeText}
|
||||
onSelectionChange={this.onSelectionChange}
|
||||
underlineColorAndroid='transparent'
|
||||
defaultValue=''
|
||||
multiline
|
||||
|
|
|
@ -845,6 +845,12 @@ const RocketChat = {
|
|||
return other && other.length ? other[0] : me;
|
||||
},
|
||||
|
||||
isRead(item) {
|
||||
let isUnread = item.archived !== true && item.open === true; // item is not archived and not opened
|
||||
isUnread = isUnread && (item.unread > 0 || item.alert === true); // either its unread count > 0 or its alert
|
||||
return !isUnread;
|
||||
},
|
||||
|
||||
isGroupChat(room) {
|
||||
return (room.uids && room.uids.length > 2) || (room.usernames && room.usernames.length > 2);
|
||||
},
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
|
||||
import { KeyboardAwareScrollView } from '@codler/react-native-keyboard-aware-scroll-view';
|
||||
import scrollPersistTaps from '../utils/scrollPersistTaps';
|
||||
|
||||
export default class KeyboardView extends React.PureComponent {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import React, { useEffect } from 'react';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { View, Text } from 'react-native';
|
||||
import { connect } from 'react-redux';
|
||||
|
@ -16,82 +16,79 @@ import { themes } from '../../constants/colors';
|
|||
export { ROW_HEIGHT };
|
||||
|
||||
const attrs = [
|
||||
'name',
|
||||
'unread',
|
||||
'userMentions',
|
||||
'showLastMessage',
|
||||
'useRealName',
|
||||
'alert',
|
||||
'type',
|
||||
'width',
|
||||
'isRead',
|
||||
'favorite',
|
||||
'status',
|
||||
'connected',
|
||||
'theme',
|
||||
'isFocused'
|
||||
'isFocused',
|
||||
'forceUpdate',
|
||||
'showLastMessage'
|
||||
];
|
||||
|
||||
const arePropsEqual = (oldProps, newProps) => {
|
||||
const { _updatedAt: _updatedAtOld } = oldProps;
|
||||
const { _updatedAt: _updatedAtNew } = newProps;
|
||||
if (_updatedAtOld && _updatedAtNew && _updatedAtOld.toISOString() !== _updatedAtNew.toISOString()) {
|
||||
return false;
|
||||
}
|
||||
return attrs.every(key => oldProps[key] === newProps[key]);
|
||||
};
|
||||
const arePropsEqual = (oldProps, newProps) => attrs.every(key => oldProps[key] === newProps[key]);
|
||||
|
||||
const RoomItem = React.memo(({
|
||||
item,
|
||||
onPress,
|
||||
width,
|
||||
favorite,
|
||||
toggleFav,
|
||||
isRead,
|
||||
rid,
|
||||
toggleRead,
|
||||
hideChannel,
|
||||
testID,
|
||||
unread,
|
||||
userMentions,
|
||||
name,
|
||||
_updatedAt,
|
||||
alert,
|
||||
type,
|
||||
avatarSize,
|
||||
baseUrl,
|
||||
userId,
|
||||
username,
|
||||
token,
|
||||
id,
|
||||
prid,
|
||||
showLastMessage,
|
||||
hideUnreadStatus,
|
||||
lastMessage,
|
||||
status,
|
||||
avatar,
|
||||
useRealName,
|
||||
getUserPresence,
|
||||
isGroupChat,
|
||||
connected,
|
||||
theme,
|
||||
isFocused
|
||||
isFocused,
|
||||
getRoomTitle,
|
||||
getRoomAvatar,
|
||||
getIsGroupChat,
|
||||
getIsRead
|
||||
}) => {
|
||||
const [, setForceUpdate] = useState(1);
|
||||
|
||||
useEffect(() => {
|
||||
if (connected && type === 'd' && id) {
|
||||
if (connected && item.t === 'd' && id) {
|
||||
getUserPresence(id);
|
||||
}
|
||||
}, [connected]);
|
||||
|
||||
const date = lastMessage && formatDate(lastMessage.ts);
|
||||
useEffect(() => {
|
||||
if (item?.observe) {
|
||||
const observable = item.observe();
|
||||
const subscription = observable?.subscribe?.(() => {
|
||||
setForceUpdate(prevForceUpdate => prevForceUpdate + 1);
|
||||
});
|
||||
|
||||
return () => {
|
||||
subscription?.unsubscribe?.();
|
||||
};
|
||||
}
|
||||
}, []);
|
||||
|
||||
const name = getRoomTitle(item);
|
||||
const avatar = getRoomAvatar(item);
|
||||
const isGroupChat = getIsGroupChat(item);
|
||||
const isRead = getIsRead(item);
|
||||
const _onPress = () => onPress(item);
|
||||
const date = item.lastMessage?.ts && formatDate(item.lastMessage.ts);
|
||||
|
||||
let accessibilityLabel = name;
|
||||
if (unread === 1) {
|
||||
accessibilityLabel += `, ${ unread } ${ I18n.t('alert') }`;
|
||||
} else if (unread > 1) {
|
||||
accessibilityLabel += `, ${ unread } ${ I18n.t('alerts') }`;
|
||||
if (item.unread === 1) {
|
||||
accessibilityLabel += `, ${ item.unread } ${ I18n.t('alert') }`;
|
||||
} else if (item.unread > 1) {
|
||||
accessibilityLabel += `, ${ item.unread } ${ I18n.t('alerts') }`;
|
||||
}
|
||||
|
||||
if (userMentions > 0) {
|
||||
if (item.userMentions > 0) {
|
||||
accessibilityLabel += `, ${ I18n.t('you_were_mentioned') }`;
|
||||
}
|
||||
|
||||
|
@ -101,16 +98,16 @@ const RoomItem = React.memo(({
|
|||
|
||||
return (
|
||||
<Touchable
|
||||
onPress={onPress}
|
||||
onPress={_onPress}
|
||||
width={width}
|
||||
favorite={favorite}
|
||||
favorite={item.f}
|
||||
toggleFav={toggleFav}
|
||||
isRead={isRead}
|
||||
rid={rid}
|
||||
rid={item.rid}
|
||||
toggleRead={toggleRead}
|
||||
hideChannel={hideChannel}
|
||||
testID={testID}
|
||||
type={type}
|
||||
type={item.t}
|
||||
theme={theme}
|
||||
isFocused={isFocused}
|
||||
>
|
||||
|
@ -121,7 +118,7 @@ const RoomItem = React.memo(({
|
|||
<Avatar
|
||||
text={avatar}
|
||||
size={avatarSize}
|
||||
type={type}
|
||||
type={item.t}
|
||||
baseUrl={baseUrl}
|
||||
style={styles.avatar}
|
||||
userId={userId}
|
||||
|
@ -137,8 +134,8 @@ const RoomItem = React.memo(({
|
|||
>
|
||||
<View style={styles.titleContainer}>
|
||||
<TypeIcon
|
||||
type={type}
|
||||
prid={prid}
|
||||
type={item.t}
|
||||
prid={item.prid}
|
||||
status={status}
|
||||
isGroupChat={isGroupChat}
|
||||
theme={theme}
|
||||
|
@ -146,7 +143,7 @@ const RoomItem = React.memo(({
|
|||
<Text
|
||||
style={[
|
||||
styles.title,
|
||||
alert && !hideUnreadStatus && styles.alert,
|
||||
item.alert && !item.hideUnreadStatus && styles.alert,
|
||||
{ color: themes[theme].titleText }
|
||||
]}
|
||||
ellipsizeMode='tail'
|
||||
|
@ -154,7 +151,7 @@ const RoomItem = React.memo(({
|
|||
>
|
||||
{name}
|
||||
</Text>
|
||||
{_updatedAt ? (
|
||||
{item.roomUpdatedAt ? (
|
||||
<Text
|
||||
style={[
|
||||
styles.date,
|
||||
|
@ -163,7 +160,7 @@ const RoomItem = React.memo(({
|
|||
themes[theme]
|
||||
.auxiliaryText
|
||||
},
|
||||
alert && !hideUnreadStatus && [
|
||||
item.alert && !item.hideUnreadStatus && [
|
||||
styles.updateAlert,
|
||||
{
|
||||
color:
|
||||
|
@ -181,18 +178,18 @@ const RoomItem = React.memo(({
|
|||
</View>
|
||||
<View style={styles.row}>
|
||||
<LastMessage
|
||||
lastMessage={lastMessage}
|
||||
type={type}
|
||||
lastMessage={item.lastMessage}
|
||||
type={item.t}
|
||||
showLastMessage={showLastMessage}
|
||||
username={username}
|
||||
alert={alert && !hideUnreadStatus}
|
||||
alert={item.alert && !item.hideUnreadStatus}
|
||||
useRealName={useRealName}
|
||||
theme={theme}
|
||||
/>
|
||||
<UnreadBadge
|
||||
unread={unread}
|
||||
userMentions={userMentions}
|
||||
type={type}
|
||||
unread={item.unread}
|
||||
userMentions={item.userMentions}
|
||||
type={item.t}
|
||||
theme={theme}
|
||||
/>
|
||||
</View>
|
||||
|
@ -203,17 +200,10 @@ const RoomItem = React.memo(({
|
|||
}, arePropsEqual);
|
||||
|
||||
RoomItem.propTypes = {
|
||||
type: PropTypes.string.isRequired,
|
||||
name: PropTypes.string.isRequired,
|
||||
item: PropTypes.object.isRequired,
|
||||
baseUrl: PropTypes.string.isRequired,
|
||||
showLastMessage: PropTypes.bool,
|
||||
_updatedAt: PropTypes.string,
|
||||
lastMessage: PropTypes.object,
|
||||
alert: PropTypes.bool,
|
||||
unread: PropTypes.number,
|
||||
userMentions: PropTypes.number,
|
||||
id: PropTypes.string,
|
||||
prid: PropTypes.string,
|
||||
onPress: PropTypes.func,
|
||||
userId: PropTypes.string,
|
||||
username: PropTypes.string,
|
||||
|
@ -221,27 +211,29 @@ RoomItem.propTypes = {
|
|||
avatarSize: PropTypes.number,
|
||||
testID: PropTypes.string,
|
||||
width: PropTypes.number,
|
||||
favorite: PropTypes.bool,
|
||||
isRead: PropTypes.bool,
|
||||
rid: PropTypes.string,
|
||||
status: PropTypes.string,
|
||||
toggleFav: PropTypes.func,
|
||||
toggleRead: PropTypes.func,
|
||||
hideChannel: PropTypes.func,
|
||||
avatar: PropTypes.bool,
|
||||
hideUnreadStatus: PropTypes.bool,
|
||||
useRealName: PropTypes.bool,
|
||||
getUserPresence: PropTypes.func,
|
||||
connected: PropTypes.bool,
|
||||
isGroupChat: PropTypes.bool,
|
||||
theme: PropTypes.string,
|
||||
isFocused: PropTypes.bool
|
||||
isFocused: PropTypes.bool,
|
||||
getRoomTitle: PropTypes.func,
|
||||
getRoomAvatar: PropTypes.func,
|
||||
getIsGroupChat: PropTypes.func,
|
||||
getIsRead: PropTypes.func
|
||||
};
|
||||
|
||||
RoomItem.defaultProps = {
|
||||
avatarSize: 48,
|
||||
status: 'offline',
|
||||
getUserPresence: () => {}
|
||||
getUserPresence: () => {},
|
||||
getRoomTitle: () => 'title',
|
||||
getRoomAvatar: () => '',
|
||||
getIsGroupChat: () => false,
|
||||
getIsRead: () => false
|
||||
};
|
||||
|
||||
const mapStateToProps = (state, ownProps) => {
|
||||
|
|
|
@ -3,7 +3,7 @@ import { StyleSheet, View } from 'react-native';
|
|||
import PropTypes from 'prop-types';
|
||||
import isEqual from 'lodash/isEqual';
|
||||
import { connect } from 'react-redux';
|
||||
import { KeyboardAwareScrollView } from 'react-native-keyboard-aware-scroll-view';
|
||||
import { KeyboardAwareScrollView } from '@codler/react-native-keyboard-aware-scroll-view';
|
||||
|
||||
import { withTheme } from '../theme';
|
||||
import EventEmitter from '../utils/events';
|
||||
|
|
|
@ -7,7 +7,7 @@ import { connect } from 'react-redux';
|
|||
import * as FileSystem from 'expo-file-system';
|
||||
import DocumentPicker from 'react-native-document-picker';
|
||||
import RNUserDefaults from 'rn-user-defaults';
|
||||
import { encode } from 'base-64';
|
||||
import { Base64 } from 'js-base64';
|
||||
import parse from 'url-parse';
|
||||
|
||||
import EventEmitter from '../utils/events';
|
||||
|
@ -161,7 +161,7 @@ class NewServerView extends React.Component {
|
|||
try {
|
||||
const parsedUrl = parse(text, true);
|
||||
if (parsedUrl.auth.length) {
|
||||
const credentials = encode(parsedUrl.auth);
|
||||
const credentials = Base64.encode(parsedUrl.auth);
|
||||
await RNUserDefaults.set(`${ BASIC_AUTH_KEY }-${ server }`, credentials);
|
||||
setBasicAuth(credentials);
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
import React from 'react';
|
||||
import { FlatList, RefreshControl } from 'react-native';
|
||||
import PropTypes from 'prop-types';
|
||||
import orderBy from 'lodash/orderBy';
|
||||
import { Q } from '@nozbe/watermelondb';
|
||||
import moment from 'moment';
|
||||
import isEqual from 'lodash/isEqual';
|
||||
|
@ -15,9 +14,10 @@ import EmptyRoom from './EmptyRoom';
|
|||
import { isIOS } from '../../utils/deviceInfo';
|
||||
import { animateNextTransition } from '../../utils/layoutAnimation';
|
||||
import ActivityIndicator from '../../containers/ActivityIndicator';
|
||||
import debounce from '../../utils/debounce';
|
||||
import { themes } from '../../constants/colors';
|
||||
|
||||
const QUERY_SIZE = 50;
|
||||
|
||||
class List extends React.Component {
|
||||
static propTypes = {
|
||||
onEndReached: PropTypes.func,
|
||||
|
@ -47,7 +47,8 @@ class List extends React.Component {
|
|||
super(props);
|
||||
console.time(`${ this.constructor.name } init`);
|
||||
console.time(`${ this.constructor.name } mount`);
|
||||
|
||||
this.count = 0;
|
||||
this.needsFetch = false;
|
||||
this.mounted = false;
|
||||
this.state = {
|
||||
loading: true,
|
||||
|
@ -56,7 +57,7 @@ class List extends React.Component {
|
|||
refreshing: false,
|
||||
animated: false
|
||||
};
|
||||
this.init();
|
||||
this.query();
|
||||
this.unsubscribeFocus = props.navigation.addListener('focus', () => {
|
||||
if (this.mounted) {
|
||||
this.setState({ animated: true });
|
||||
|
@ -72,72 +73,6 @@ class List extends React.Component {
|
|||
console.timeEnd(`${ this.constructor.name } mount`);
|
||||
}
|
||||
|
||||
// eslint-disable-next-line react/sort-comp
|
||||
async init() {
|
||||
const { rid, tmid } = this.props;
|
||||
const db = database.active;
|
||||
|
||||
// handle servers with version < 3.0.0
|
||||
let { hideSystemMessages = [] } = this.props;
|
||||
if (!Array.isArray(hideSystemMessages)) {
|
||||
hideSystemMessages = [];
|
||||
}
|
||||
|
||||
if (tmid) {
|
||||
try {
|
||||
this.thread = await db.collections
|
||||
.get('threads')
|
||||
.find(tmid);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
this.messagesObservable = db.collections
|
||||
.get('thread_messages')
|
||||
.query(Q.where('rid', tmid), Q.or(Q.where('t', Q.notIn(hideSystemMessages)), Q.where('t', Q.eq(null))))
|
||||
.observe();
|
||||
} else if (rid) {
|
||||
this.messagesObservable = db.collections
|
||||
.get('messages')
|
||||
.query(Q.where('rid', rid), Q.or(Q.where('t', Q.notIn(hideSystemMessages)), Q.where('t', Q.eq(null))))
|
||||
.observe();
|
||||
}
|
||||
|
||||
if (rid) {
|
||||
this.unsubscribeMessages();
|
||||
this.messagesSubscription = this.messagesObservable
|
||||
.subscribe((data) => {
|
||||
if (tmid && this.thread) {
|
||||
data = [this.thread, ...data];
|
||||
}
|
||||
const messages = orderBy(data, ['ts'], ['desc']);
|
||||
if (this.mounted) {
|
||||
this.setState({ messages }, () => this.update());
|
||||
} else {
|
||||
this.state.messages = messages;
|
||||
}
|
||||
this.readThreads();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line react/sort-comp
|
||||
reload = () => {
|
||||
this.unsubscribeMessages();
|
||||
this.init();
|
||||
}
|
||||
|
||||
readThreads = async() => {
|
||||
const { tmid } = this.props;
|
||||
|
||||
if (tmid) {
|
||||
try {
|
||||
await RocketChat.readThreads(tmid);
|
||||
} catch {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
shouldComponentUpdate(nextProps, nextState) {
|
||||
const { loading, end, refreshing } = this.state;
|
||||
const { hideSystemMessages, theme } = this.props;
|
||||
|
@ -177,7 +112,7 @@ class List extends React.Component {
|
|||
console.countReset(`${ this.constructor.name }.render calls`);
|
||||
}
|
||||
|
||||
onEndReached = debounce(async() => {
|
||||
fetchData = async() => {
|
||||
const {
|
||||
loading, end, messages, latest = messages[messages.length - 1]?.ts
|
||||
} = this.state;
|
||||
|
@ -196,12 +131,99 @@ class List extends React.Component {
|
|||
result = await RocketChat.loadMessagesForRoom({ rid, t, latest });
|
||||
}
|
||||
|
||||
this.setState({ end: result.length < 50, loading: false, latest: result[result.length - 1]?.ts }, () => this.loadMoreMessages(result));
|
||||
this.setState({ end: result.length < QUERY_SIZE, loading: false, latest: result[result.length - 1]?.ts }, () => this.loadMoreMessages(result));
|
||||
} catch (e) {
|
||||
this.setState({ loading: false });
|
||||
log(e);
|
||||
}
|
||||
}, 300)
|
||||
}
|
||||
|
||||
query = async() => {
|
||||
this.count += QUERY_SIZE;
|
||||
const { rid, tmid } = this.props;
|
||||
const db = database.active;
|
||||
|
||||
// handle servers with version < 3.0.0
|
||||
let { hideSystemMessages = [] } = this.props;
|
||||
if (!Array.isArray(hideSystemMessages)) {
|
||||
hideSystemMessages = [];
|
||||
}
|
||||
|
||||
if (tmid) {
|
||||
try {
|
||||
this.thread = await db.collections
|
||||
.get('threads')
|
||||
.find(tmid);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
this.messagesObservable = db.collections
|
||||
.get('thread_messages')
|
||||
.query(
|
||||
Q.where('rid', tmid),
|
||||
Q.experimentalSortBy('ts', Q.desc),
|
||||
Q.experimentalSkip(0),
|
||||
Q.experimentalTake(this.count)
|
||||
)
|
||||
.observe();
|
||||
} else if (rid) {
|
||||
this.messagesObservable = db.collections
|
||||
.get('messages')
|
||||
.query(
|
||||
Q.where('rid', rid),
|
||||
Q.experimentalSortBy('ts', Q.desc),
|
||||
Q.experimentalSkip(0),
|
||||
Q.experimentalTake(this.count)
|
||||
)
|
||||
.observe();
|
||||
}
|
||||
|
||||
if (rid) {
|
||||
this.unsubscribeMessages();
|
||||
this.messagesSubscription = this.messagesObservable
|
||||
.subscribe((messages) => {
|
||||
if (messages.length <= this.count) {
|
||||
this.needsFetch = true;
|
||||
}
|
||||
if (tmid && this.thread) {
|
||||
messages = [...messages, this.thread];
|
||||
}
|
||||
messages = messages.filter(m => !m.t || !hideSystemMessages?.includes(m.t));
|
||||
|
||||
if (this.mounted) {
|
||||
this.setState({ messages }, () => this.update());
|
||||
} else {
|
||||
this.state.messages = messages;
|
||||
}
|
||||
this.readThreads();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
reload = () => {
|
||||
this.count = 0;
|
||||
this.query();
|
||||
}
|
||||
|
||||
readThreads = async() => {
|
||||
const { tmid } = this.props;
|
||||
|
||||
if (tmid) {
|
||||
try {
|
||||
await RocketChat.readThreads(tmid);
|
||||
} catch {
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
onEndReached = async() => {
|
||||
if (this.needsFetch) {
|
||||
this.needsFetch = false;
|
||||
await this.fetchData();
|
||||
}
|
||||
this.query();
|
||||
}
|
||||
|
||||
loadMoreMessages = (result) => {
|
||||
const { end } = this.state;
|
||||
|
@ -305,7 +327,7 @@ class List extends React.Component {
|
|||
removeClippedSubviews={isIOS}
|
||||
initialNumToRender={7}
|
||||
onEndReached={this.onEndReached}
|
||||
onEndReachedThreshold={5}
|
||||
onEndReachedThreshold={0.5}
|
||||
maxToRenderPerBatch={5}
|
||||
windowSize={10}
|
||||
ListFooterComponent={this.renderFooter}
|
||||
|
|
|
@ -206,12 +206,10 @@ class RoomView extends React.Component {
|
|||
const { appState, insets } = this.props;
|
||||
|
||||
if (appState === 'foreground' && appState !== prevProps.appState && this.rid) {
|
||||
this.onForegroundInteraction = InteractionManager.runAfterInteractions(() => {
|
||||
// Fire List.init() just to keep observables working
|
||||
if (this.list && this.list.current) {
|
||||
this.list.current.init();
|
||||
}
|
||||
});
|
||||
// Fire List.query() just to keep observables working
|
||||
if (this.list && this.list.current) {
|
||||
this.list.current?.query?.();
|
||||
}
|
||||
}
|
||||
// If it's not direct message
|
||||
if (this.t !== 'd') {
|
||||
|
@ -267,9 +265,6 @@ class RoomView extends React.Component {
|
|||
if (this.didMountInteraction && this.didMountInteraction.cancel) {
|
||||
this.didMountInteraction.cancel();
|
||||
}
|
||||
if (this.onForegroundInteraction && this.onForegroundInteraction.cancel) {
|
||||
this.onForegroundInteraction.cancel();
|
||||
}
|
||||
if (this.willBlurListener && this.willBlurListener.remove) {
|
||||
this.willBlurListener.remove();
|
||||
}
|
||||
|
|
|
@ -41,7 +41,7 @@ const Header = React.memo(({
|
|||
const { isLandscape } = useOrientation();
|
||||
const scale = isIOS && isLandscape && !isTablet ? 0.8 : 1;
|
||||
const titleFontSize = 16 * scale;
|
||||
const subTitleFontSize = 12 * scale;
|
||||
const subTitleFontSize = 14 * scale;
|
||||
|
||||
if (showSearchHeader) {
|
||||
return (
|
||||
|
@ -78,11 +78,11 @@ const Header = React.memo(({
|
|||
<CustomIcon
|
||||
name='chevron-down'
|
||||
color={themes[theme].headerTintColor}
|
||||
style={[showServerDropdown && styles.upsideDown, { fontSize: subTitleFontSize }]}
|
||||
style={[showServerDropdown && styles.upsideDown]}
|
||||
size={18}
|
||||
/>
|
||||
</View>
|
||||
{subtitle ? <Text style={[styles.subtitle, { color: themes[theme].auxiliaryText }]} numberOfLines={1}>{subtitle}</Text> : null}
|
||||
{subtitle ? <Text style={[styles.subtitle, { color: themes[theme].auxiliaryText, fontSize: subTitleFontSize }]} numberOfLines={1}>{subtitle}</Text> : null}
|
||||
</TouchableOpacity>
|
||||
</View>
|
||||
);
|
||||
|
|
|
@ -9,7 +9,7 @@ import {
|
|||
RefreshControl
|
||||
} from 'react-native';
|
||||
import { connect } from 'react-redux';
|
||||
import { isEqual, orderBy } from 'lodash';
|
||||
import isEqual from 'react-fast-compare';
|
||||
import Orientation from 'react-native-orientation-locker';
|
||||
import { Q } from '@nozbe/watermelondb';
|
||||
import { withSafeAreaInsets } from 'react-native-safe-area-context';
|
||||
|
@ -71,6 +71,7 @@ const DISCUSSIONS_HEADER = 'Discussions';
|
|||
const CHANNELS_HEADER = 'Channels';
|
||||
const DM_HEADER = 'Direct_Messages';
|
||||
const GROUPS_HEADER = 'Private_Groups';
|
||||
const QUERY_SIZE = 20;
|
||||
|
||||
const filterIsUnread = s => (s.unread > 0 || s.alert) && !s.hideUnreadStatus;
|
||||
const filterIsFavorite = s => s.f;
|
||||
|
@ -140,11 +141,12 @@ class RoomsListView extends React.Component {
|
|||
|
||||
this.gotSubscriptions = false;
|
||||
this.animated = false;
|
||||
this.count = 0;
|
||||
this.state = {
|
||||
searching: false,
|
||||
search: [],
|
||||
loading: true,
|
||||
allChats: [],
|
||||
chatsOrder: [],
|
||||
chats: [],
|
||||
item: {}
|
||||
};
|
||||
|
@ -211,7 +213,7 @@ class RoomsListView extends React.Component {
|
|||
}
|
||||
|
||||
shouldComponentUpdate(nextProps, nextState) {
|
||||
const { allChats, searching, item } = this.state;
|
||||
const { chatsOrder, searching, item } = this.state;
|
||||
// eslint-disable-next-line react/destructuring-assignment
|
||||
const propsUpdated = shouldUpdateProps.some(key => nextProps[key] !== this.props[key]);
|
||||
if (propsUpdated) {
|
||||
|
@ -219,7 +221,7 @@ class RoomsListView extends React.Component {
|
|||
}
|
||||
|
||||
// Compare changes only once
|
||||
const chatsNotEqual = !isEqual(nextState.allChats, allChats);
|
||||
const chatsNotEqual = !isEqual(nextState.chatsOrder, chatsOrder);
|
||||
|
||||
// If they aren't equal, set to update if focused
|
||||
if (chatsNotEqual) {
|
||||
|
@ -290,7 +292,7 @@ class RoomsListView extends React.Component {
|
|||
&& prevProps.showUnread === showUnread
|
||||
)
|
||||
) {
|
||||
this.getSubscriptions(true);
|
||||
this.getSubscriptions();
|
||||
} else if (
|
||||
appState === 'foreground'
|
||||
&& appState !== prevProps.appState
|
||||
|
@ -309,9 +311,7 @@ class RoomsListView extends React.Component {
|
|||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
if (this.querySubscription && this.querySubscription.unsubscribe) {
|
||||
this.querySubscription.unsubscribe();
|
||||
}
|
||||
this.unsubscribeQuery();
|
||||
if (this.unsubscribeFocus) {
|
||||
this.unsubscribeFocus();
|
||||
}
|
||||
|
@ -396,17 +396,8 @@ class RoomsListView extends React.Component {
|
|||
return allData;
|
||||
}
|
||||
|
||||
getSubscriptions = async(force = false) => {
|
||||
if (this.gotSubscriptions && !force) {
|
||||
return;
|
||||
}
|
||||
this.gotSubscriptions = true;
|
||||
|
||||
if (this.querySubscription && this.querySubscription.unsubscribe) {
|
||||
this.querySubscription.unsubscribe();
|
||||
}
|
||||
|
||||
this.setState({ loading: true });
|
||||
getSubscriptions = async() => {
|
||||
this.unsubscribeQuery();
|
||||
|
||||
const {
|
||||
sortBy,
|
||||
|
@ -416,41 +407,49 @@ class RoomsListView extends React.Component {
|
|||
} = this.props;
|
||||
|
||||
const db = database.active;
|
||||
const observable = await db.collections
|
||||
.get('subscriptions')
|
||||
.query(
|
||||
Q.where('archived', false),
|
||||
Q.where('open', true)
|
||||
)
|
||||
.observeWithColumns(['room_updated_at', 'unread', 'alert', 'user_mentions', 'f', 't']);
|
||||
let observable;
|
||||
|
||||
const defaultWhereClause = [
|
||||
Q.where('archived', false),
|
||||
Q.where('open', true)
|
||||
];
|
||||
|
||||
if (sortBy === 'alphabetical') {
|
||||
defaultWhereClause.push(Q.experimentalSortBy(`${ this.useRealName ? 'fname' : 'name' }`, Q.asc));
|
||||
} else {
|
||||
defaultWhereClause.push(Q.experimentalSortBy('room_updated_at', Q.desc));
|
||||
}
|
||||
|
||||
// When we're grouping by something
|
||||
if (this.isGrouping) {
|
||||
observable = await db.collections
|
||||
.get('subscriptions')
|
||||
.query(...defaultWhereClause)
|
||||
.observe();
|
||||
|
||||
// When we're NOT grouping
|
||||
} else {
|
||||
this.count += QUERY_SIZE;
|
||||
observable = await db.collections
|
||||
.get('subscriptions')
|
||||
.query(
|
||||
...defaultWhereClause,
|
||||
Q.experimentalSkip(0),
|
||||
Q.experimentalTake(this.count)
|
||||
)
|
||||
.observe();
|
||||
}
|
||||
|
||||
|
||||
this.querySubscription = observable.subscribe((data) => {
|
||||
let tempChats = [];
|
||||
let chats = [];
|
||||
if (sortBy === 'alphabetical') {
|
||||
chats = orderBy(data, [`${ this.useRealName ? 'fname' : 'name' }`], ['asc']);
|
||||
} else {
|
||||
chats = orderBy(data, ['roomUpdatedAt'], ['desc']);
|
||||
}
|
||||
let chats = data;
|
||||
|
||||
// it's better to map and test all subs altogether then testing them individually
|
||||
const allChats = data.map(item => ({
|
||||
alert: item.alert,
|
||||
unread: item.unread,
|
||||
userMentions: item.userMentions,
|
||||
isRead: this.getIsRead(item),
|
||||
favorite: item.f,
|
||||
lastMessage: item.lastMessage,
|
||||
name: this.getRoomTitle(item),
|
||||
_updatedAt: item.roomUpdatedAt,
|
||||
key: item._id,
|
||||
rid: item.rid,
|
||||
type: item.t,
|
||||
prid: item.prid,
|
||||
uids: item.uids,
|
||||
usernames: item.usernames,
|
||||
visitor: item.visitor
|
||||
}));
|
||||
/**
|
||||
* We trigger re-render only when chats order changes
|
||||
* RoomItem handles its own re-render
|
||||
*/
|
||||
const chatsOrder = data.map(item => item.rid);
|
||||
|
||||
// unread
|
||||
if (showUnread) {
|
||||
|
@ -484,12 +483,18 @@ class RoomsListView extends React.Component {
|
|||
|
||||
this.internalSetState({
|
||||
chats: tempChats,
|
||||
allChats,
|
||||
chatsOrder,
|
||||
loading: false
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
unsubscribeQuery = () => {
|
||||
if (this.querySubscription && this.querySubscription.unsubscribe) {
|
||||
this.querySubscription.unsubscribe();
|
||||
}
|
||||
}
|
||||
|
||||
initSearching = () => {
|
||||
const { openSearchHeader } = this.props;
|
||||
this.internalSetState({ searching: true }, () => {
|
||||
|
@ -548,10 +553,19 @@ class RoomsListView extends React.Component {
|
|||
|
||||
getRoomAvatar = item => RocketChat.getRoomAvatar(item)
|
||||
|
||||
isGroupChat = item => RocketChat.isGroupChat(item)
|
||||
|
||||
isRead = item => RocketChat.isRead(item)
|
||||
|
||||
getUserPresence = uid => RocketChat.getUserPresence(uid)
|
||||
|
||||
getUidDirectMessage = room => RocketChat.getUidDirectMessage(room);
|
||||
|
||||
get isGrouping() {
|
||||
const { showUnread, showFavorites, groupByType } = this.props;
|
||||
return showUnread || showFavorites || groupByType;
|
||||
}
|
||||
|
||||
onPressItem = (item = {}) => {
|
||||
const { navigation, isMasterDetail } = this.props;
|
||||
if (!navigation.isFocused()) {
|
||||
|
@ -743,6 +757,13 @@ class RoomsListView extends React.Component {
|
|||
roomsRequest({ allData: true });
|
||||
}
|
||||
|
||||
onEndReached = () => {
|
||||
// Run only when we're not grouping by anything
|
||||
if (!this.isGrouping) {
|
||||
this.getSubscriptions();
|
||||
}
|
||||
}
|
||||
|
||||
getScrollRef = ref => (this.scroll = ref);
|
||||
|
||||
renderListHeader = () => {
|
||||
|
@ -774,12 +795,6 @@ class RoomsListView extends React.Component {
|
|||
);
|
||||
}
|
||||
|
||||
getIsRead = (item) => {
|
||||
let isUnread = item.archived !== true && item.open === true; // item is not archived and not opened
|
||||
isUnread = isUnread && (item.unread > 0 || item.alert === true); // either its unread count > 0 or its alert
|
||||
return !isUnread;
|
||||
};
|
||||
|
||||
renderItem = ({ item }) => {
|
||||
if (item.separator) {
|
||||
return this.renderSectionHeader(item.rid);
|
||||
|
@ -800,32 +815,19 @@ class RoomsListView extends React.Component {
|
|||
width
|
||||
} = this.props;
|
||||
const id = this.getUidDirectMessage(item);
|
||||
const isGroupChat = RocketChat.isGroupChat(item);
|
||||
|
||||
return (
|
||||
<RoomItem
|
||||
item={item}
|
||||
theme={theme}
|
||||
alert={item.alert}
|
||||
unread={item.unread}
|
||||
hideUnreadStatus={item.hideUnreadStatus}
|
||||
userMentions={item.userMentions}
|
||||
isRead={this.getIsRead(item)}
|
||||
favorite={item.f}
|
||||
avatar={this.getRoomAvatar(item)}
|
||||
lastMessage={item.lastMessage}
|
||||
name={this.getRoomTitle(item)}
|
||||
_updatedAt={item.roomUpdatedAt}
|
||||
key={item._id}
|
||||
id={id}
|
||||
type={item.t}
|
||||
userId={userId}
|
||||
username={username}
|
||||
token={token}
|
||||
rid={item.rid}
|
||||
type={item.t}
|
||||
baseUrl={server}
|
||||
prid={item.prid}
|
||||
showLastMessage={StoreLastMessage}
|
||||
onPress={() => this.onPressItem(item)}
|
||||
onPress={this.onPressItem}
|
||||
testID={`rooms-list-view-item-${ item.name }`}
|
||||
width={isMasterDetail ? MAX_SIDEBAR_WIDTH : width}
|
||||
toggleFav={this.toggleFav}
|
||||
|
@ -833,7 +835,10 @@ class RoomsListView extends React.Component {
|
|||
hideChannel={this.hideChannel}
|
||||
useRealName={useRealName}
|
||||
getUserPresence={this.getUserPresence}
|
||||
isGroupChat={isGroupChat}
|
||||
getRoomTitle={this.getRoomTitle}
|
||||
getRoomAvatar={this.getRoomAvatar}
|
||||
getIsGroupChat={this.isGroupChat}
|
||||
getIsRead={this.isRead}
|
||||
visitor={item.visitor}
|
||||
isFocused={currentItem?.rid === item.rid}
|
||||
/>
|
||||
|
@ -880,6 +885,8 @@ class RoomsListView extends React.Component {
|
|||
/>
|
||||
)}
|
||||
windowSize={9}
|
||||
onEndReached={this.onEndReached}
|
||||
onEndReachedThreshold={0.5}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -7,7 +7,7 @@ import ShareExtension from 'rn-extensions-share';
|
|||
import * as FileSystem from 'expo-file-system';
|
||||
import { connect } from 'react-redux';
|
||||
import * as mime from 'react-native-mime-types';
|
||||
import { isEqual, orderBy } from 'lodash';
|
||||
import isEqual from 'react-fast-compare';
|
||||
import { Q } from '@nozbe/watermelondb';
|
||||
|
||||
import database from '../../lib/database';
|
||||
|
@ -32,7 +32,6 @@ const permission = {
|
|||
message: I18n.t('Read_External_Permission_Message')
|
||||
};
|
||||
|
||||
const LIMIT = 50;
|
||||
const getItemLayout = (data, index) => ({ length: ROW_HEIGHT, offset: ROW_HEIGHT * index, index });
|
||||
const keyExtractor = item => item.rid;
|
||||
|
||||
|
@ -47,7 +46,7 @@ class ShareListView extends React.Component {
|
|||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.data = [];
|
||||
this.chats = [];
|
||||
this.state = {
|
||||
searching: false,
|
||||
searchText: '',
|
||||
|
@ -186,22 +185,36 @@ class ShareListView extends React.Component {
|
|||
this.setState(...args);
|
||||
}
|
||||
|
||||
getSubscriptions = async(server) => {
|
||||
query = (text) => {
|
||||
const db = database.active;
|
||||
const defaultWhereClause = [
|
||||
Q.where('archived', false),
|
||||
Q.where('open', true),
|
||||
Q.experimentalSkip(0),
|
||||
Q.experimentalTake(50),
|
||||
Q.experimentalSortBy('room_updated_at', Q.desc)
|
||||
];
|
||||
if (text) {
|
||||
return db.collections
|
||||
.get('subscriptions')
|
||||
.query(
|
||||
...defaultWhereClause,
|
||||
Q.or(
|
||||
Q.where('name', Q.like(`%${ Q.sanitizeLikeString(text) }%`)),
|
||||
Q.where('fname', Q.like(`%${ Q.sanitizeLikeString(text) }%`))
|
||||
)
|
||||
).fetch();
|
||||
}
|
||||
return db.collections.get('subscriptions').query(...defaultWhereClause).fetch();
|
||||
}
|
||||
|
||||
getSubscriptions = async(server) => {
|
||||
const serversDB = database.servers;
|
||||
|
||||
if (server) {
|
||||
this.data = await db.collections
|
||||
.get('subscriptions')
|
||||
.query(
|
||||
Q.where('archived', false),
|
||||
Q.where('open', true)
|
||||
).fetch();
|
||||
this.data = orderBy(this.data, ['roomUpdatedAt'], ['desc']);
|
||||
|
||||
this.chats = await this.query();
|
||||
const serversCollection = serversDB.collections.get('servers');
|
||||
this.servers = await serversCollection.query().fetch();
|
||||
this.chats = this.data.slice(0, LIMIT);
|
||||
let serverInfo = {};
|
||||
try {
|
||||
serverInfo = await serversCollection.find(server);
|
||||
|
@ -210,8 +223,8 @@ class ShareListView extends React.Component {
|
|||
}
|
||||
|
||||
this.internalSetState({
|
||||
chats: this.chats ? this.chats.slice() : [],
|
||||
servers: this.servers ? this.servers.slice() : [],
|
||||
chats: this.chats ?? [],
|
||||
servers: this.servers ?? [],
|
||||
loading: false,
|
||||
serverInfo
|
||||
});
|
||||
|
@ -253,10 +266,10 @@ class ShareListView extends React.Component {
|
|||
});
|
||||
}
|
||||
|
||||
search = (text) => {
|
||||
const result = this.data.filter(item => item.name.includes(text)) || [];
|
||||
search = async(text) => {
|
||||
const result = await this.query(text);
|
||||
this.internalSetState({
|
||||
searchResults: result.slice(0, LIMIT),
|
||||
searchResults: result,
|
||||
searchText: text
|
||||
});
|
||||
}
|
||||
|
@ -297,9 +310,26 @@ class ShareListView extends React.Component {
|
|||
}
|
||||
|
||||
renderItem = ({ item }) => {
|
||||
const { serverInfo } = this.state;
|
||||
const { useRealName } = serverInfo;
|
||||
const {
|
||||
userId, token, server, theme
|
||||
} = this.props;
|
||||
let description;
|
||||
switch (item.t) {
|
||||
case 'c':
|
||||
description = item.topic || item.description;
|
||||
break;
|
||||
case 'p':
|
||||
description = item.topic || item.description;
|
||||
break;
|
||||
case 'd':
|
||||
description = useRealName ? item.name : item.fname;
|
||||
break;
|
||||
default:
|
||||
description = item.fname;
|
||||
break;
|
||||
}
|
||||
return (
|
||||
<DirectoryItem
|
||||
user={{
|
||||
|
@ -309,11 +339,7 @@ class ShareListView extends React.Component {
|
|||
title={this.getRoomTitle(item)}
|
||||
baseUrl={server}
|
||||
avatar={RocketChat.getRoomAvatar(item)}
|
||||
description={
|
||||
item.t === 'c'
|
||||
? (item.topic || item.description)
|
||||
: item.fname
|
||||
}
|
||||
description={description}
|
||||
type={item.prid ? 'discussion' : item.t}
|
||||
onPress={() => this.shareMessage(item)}
|
||||
testID={`share-extension-item-${ item.name }`}
|
||||
|
|
138
ios/Podfile
138
ios/Podfile
|
@ -1,143 +1,23 @@
|
|||
platform :ios, '11.0'
|
||||
require_relative '../node_modules/react-native/scripts/react_native_pods'
|
||||
require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'
|
||||
require_relative '../node_modules/react-native-unimodules/cocoapods.rb'
|
||||
|
||||
def add_flipper_pods!(versions = {})
|
||||
versions['Flipper'] ||= '~> 0.33.1'
|
||||
versions['DoubleConversion'] ||= '1.1.7'
|
||||
versions['Flipper-Folly'] ||= '~> 2.1'
|
||||
versions['Flipper-Glog'] ||= '0.3.6'
|
||||
versions['Flipper-PeerTalk'] ||= '~> 0.0.4'
|
||||
versions['Flipper-RSocket'] ||= '~> 1.0'
|
||||
|
||||
pod 'FlipperKit', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitLayoutPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/SKIOSNetworkPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitUserDefaultsPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitReactPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
|
||||
# List all transitive dependencies for FlipperKit pods
|
||||
# to avoid them being linked in Release builds
|
||||
pod 'Flipper', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'Flipper-DoubleConversion', versions['DoubleConversion'], :configuration => 'Debug'
|
||||
pod 'Flipper-Folly', versions['Flipper-Folly'], :configuration => 'Debug'
|
||||
pod 'Flipper-Glog', versions['Flipper-Glog'], :configuration => 'Debug'
|
||||
pod 'Flipper-PeerTalk', versions['Flipper-PeerTalk'], :configuration => 'Debug'
|
||||
pod 'Flipper-RSocket', versions['Flipper-RSocket'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/Core', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/CppBridge', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FBCxxFollyDynamicConvert', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FBDefines', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FKPortForwarding', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitHighlightOverlay', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitLayoutTextSearchable', versions['Flipper'], :configuration => 'Debug'
|
||||
pod 'FlipperKit/FlipperKitNetworkPlugin', versions['Flipper'], :configuration => 'Debug'
|
||||
end
|
||||
|
||||
# Post Install processing for Flipper
|
||||
def flipper_post_install(installer)
|
||||
installer.pods_project.targets.each do |target|
|
||||
if target.name == 'YogaKit'
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['SWIFT_VERSION'] = '4.1'
|
||||
end
|
||||
end
|
||||
end
|
||||
file_name = Dir.glob("*.xcodeproj")[0]
|
||||
app_project = Xcodeproj::Project.open(file_name)
|
||||
app_project.native_targets.each do |target|
|
||||
target.build_configurations.each do |config|
|
||||
cflags = config.build_settings['OTHER_CFLAGS'] || '$(inherited) '
|
||||
unless cflags.include? '-DFB_SONARKIT_ENABLED=1'
|
||||
puts 'Adding -DFB_SONARKIT_ENABLED=1 in OTHER_CFLAGS...'
|
||||
cflags << '-DFB_SONARKIT_ENABLED=1'
|
||||
end
|
||||
config.build_settings['OTHER_CFLAGS'] = cflags
|
||||
end
|
||||
app_project.save
|
||||
end
|
||||
installer.pods_project.save
|
||||
def all_pods
|
||||
config = use_native_modules!
|
||||
use_unimodules!
|
||||
use_react_native!(:path => config["reactNativePath"])
|
||||
use_flipper!
|
||||
end
|
||||
|
||||
target 'RocketChatRN' do
|
||||
pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
|
||||
pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
|
||||
pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
|
||||
pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
|
||||
pod 'React', :path => '../node_modules/react-native/'
|
||||
pod 'React-Core', :path => '../node_modules/react-native/'
|
||||
pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
|
||||
pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
|
||||
pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
|
||||
pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
|
||||
pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
|
||||
pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
|
||||
pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
|
||||
pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
|
||||
pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
|
||||
pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
|
||||
pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
|
||||
pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
|
||||
|
||||
pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
|
||||
pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
|
||||
pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
|
||||
pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
|
||||
pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon"
|
||||
pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
|
||||
pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true
|
||||
|
||||
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
|
||||
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
|
||||
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
|
||||
|
||||
use_native_modules!
|
||||
use_unimodules!
|
||||
all_pods
|
||||
end
|
||||
|
||||
target 'ShareRocketChatRN' do
|
||||
pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector"
|
||||
pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec"
|
||||
pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired"
|
||||
pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety"
|
||||
pod 'React', :path => '../node_modules/react-native/'
|
||||
pod 'React-Core', :path => '../node_modules/react-native/'
|
||||
pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules'
|
||||
pod 'React-Core/DevSupport', :path => '../node_modules/react-native/'
|
||||
pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
|
||||
pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
|
||||
pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
|
||||
pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
|
||||
pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
|
||||
pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
|
||||
pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
|
||||
pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
|
||||
pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
|
||||
pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/'
|
||||
|
||||
pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
|
||||
pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
|
||||
pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
|
||||
pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'
|
||||
pod 'ReactCommon/callinvoker', :path => "../node_modules/react-native/ReactCommon"
|
||||
pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon"
|
||||
pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga', :modular_headers => true
|
||||
|
||||
pod 'JitsiMeetSDK', :git => 'https://github.com/RocketChat/jitsi-meet-ios-sdk-releases.git'
|
||||
|
||||
pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
|
||||
pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
|
||||
pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'
|
||||
|
||||
use_native_modules!
|
||||
use_unimodules!
|
||||
all_pods
|
||||
end
|
||||
|
||||
# Enables Flipper.
|
||||
#
|
||||
# Note that if you have use_frameworks! enabled, Flipper will not work and
|
||||
# you should disable these next few lines.
|
||||
add_flipper_pods!
|
||||
post_install do |installer|
|
||||
installer.pods_project.targets.each do |target|
|
||||
target.build_configurations.each do |config|
|
||||
|
@ -145,4 +25,4 @@ post_install do |installer|
|
|||
end
|
||||
end
|
||||
flipper_post_install(installer)
|
||||
end
|
||||
end
|
753
ios/Podfile.lock
753
ios/Podfile.lock
File diff suppressed because it is too large
Load Diff
|
@ -12,26 +12,39 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#import <FirebaseCore/FirebaseCore.h>
|
||||
// The module qualified imports are for CocoaPods and the simple file names
|
||||
// for Swift Package Manager.
|
||||
|
||||
#if !defined(__has_include)
|
||||
#error "Firebase.h won't import anything if your compiler doesn't support __has_include. Please \
|
||||
import the headers individually."
|
||||
#else
|
||||
#if __has_include(<FirebaseCore/FirebaseCore.h>)
|
||||
#import <FirebaseCore/FirebaseCore.h>
|
||||
#elif __has_include("FirebaseCore.h")
|
||||
#import "FirebaseCore.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseAnalytics/FirebaseAnalytics.h>)
|
||||
#import <FirebaseAnalytics/FirebaseAnalytics.h>
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseAuth/FirebaseAuth.h>)
|
||||
#import <FirebaseAuth/FirebaseAuth.h>
|
||||
#elif __has_include("FirebaseAuth.h")
|
||||
#import "FirebaseAuth.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseCrashlytics/FirebaseCrashlytics.h>)
|
||||
#import <FirebaseCrashlytics/FirebaseCrashlytics.h>
|
||||
#elif __has_include("FirebaseCrashlytics.h")
|
||||
#import "FirebaseCrashlytics.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseDatabase/FirebaseDatabase.h>)
|
||||
#import <FirebaseDatabase/FirebaseDatabase.h>
|
||||
#elif __has_include("FirebaseDatabase.h")
|
||||
#import "FirebaseDatabase.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseDynamicLinks/FirebaseDynamicLinks.h>)
|
||||
|
@ -43,14 +56,20 @@
|
|||
Firebase Dynamic Links works as intended."
|
||||
#endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
|
||||
#endif
|
||||
#elif __has_include("FirebaseDynamicLinks.h")
|
||||
#import "FirebaseDynamicLinks.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseFirestore/FirebaseFirestore.h>)
|
||||
#import <FirebaseFirestore/FirebaseFirestore.h>
|
||||
#elif __has_include("FirebaseFirestore.h")
|
||||
#import "FirebaseFirestore.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseFunctions/FirebaseFunctions.h>)
|
||||
#import <FirebaseFunctions/FirebaseFunctions.h>
|
||||
#elif __has_include("FirebaseFunctions.h")
|
||||
#import "FirebaseFunctions.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseInAppMessaging/FirebaseInAppMessaging.h>)
|
||||
|
@ -62,6 +81,8 @@ Firebase Dynamic Links works as intended."
|
|||
Firebase In App Messaging works as intended."
|
||||
#endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
|
||||
#endif
|
||||
#elif __has_include("FirebaseInAppMessaging.h")
|
||||
#import "FirebaseInAppMessaging.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseInstanceID/FirebaseInstanceID.h>)
|
||||
|
@ -77,7 +98,9 @@ Firebase In App Messaging works as intended."
|
|||
Firebase Messaging works as intended."
|
||||
#endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
|
||||
#endif
|
||||
#endif
|
||||
#elif __has_include("FirebaseMessaging.h")
|
||||
#import "FirebaseMessaging.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseMLCommon/FirebaseMLCommon.h>)
|
||||
#import <FirebaseMLCommon/FirebaseMLCommon.h>
|
||||
|
@ -151,10 +174,14 @@ Firebase Performance works as intended."
|
|||
Firebase Remote Config works as intended."
|
||||
#endif // #ifndef FIREBASE_ANALYTICS_SUPPRESS_WARNING
|
||||
#endif
|
||||
#elif __has_include("FirebaseRemoteConfig.h")
|
||||
#import "FirebaseRemoteConfig.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<FirebaseStorage/FirebaseStorage.h>)
|
||||
#import <FirebaseStorage/FirebaseStorage.h>
|
||||
#elif __has_include("FirebaseStorage.h")
|
||||
#import "FirebaseStorage.h"
|
||||
#endif
|
||||
|
||||
#if __has_include(<GoogleMobileAds/GoogleMobileAds.h>)
|
||||
|
|
|
@ -2,14 +2,20 @@
|
|||
[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase)
|
||||
[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase)
|
||||
|
||||
[![Actions Status][gh-abtesting-badge]][gh-actions]
|
||||
[![Actions Status][gh-auth-badge]][gh-actions]
|
||||
[![Actions Status][gh-core-badge]][gh-actions]
|
||||
[![Actions Status][gh-crashlytics-badge]][gh-actions]
|
||||
[![Actions Status][gh-database-badge]][gh-actions]
|
||||
[![Actions Status][gh-datatransport-badge]][gh-actions]
|
||||
[![Actions Status][gh-dynamiclinks-badge]][gh-actions]
|
||||
[![Actions Status][gh-firebasepod-badge]][gh-actions]
|
||||
[![Actions Status][gh-firestore-badge]][gh-actions]
|
||||
[![Actions Status][gh-functions-badge]][gh-actions]
|
||||
[![Actions Status][gh-inappmessaging-badge]][gh-actions]
|
||||
[![Actions Status][gh-interop-badge]][gh-actions]
|
||||
[![Actions Status][gh-messaging-badge]][gh-actions]
|
||||
[![Actions Status][gh-remoteconfig-badge]][gh-actions]
|
||||
[![Actions Status][gh-storage-badge]][gh-actions]
|
||||
[![Actions Status][gh-symbolcollision-badge]][gh-actions]
|
||||
[![Actions Status][gh-zip-badge]][gh-actions]
|
||||
|
@ -92,7 +98,7 @@ Instructions for installing binary frameworks via
|
|||
To develop Firebase software in this repository, ensure that you have at least
|
||||
the following software:
|
||||
|
||||
* Xcode 10.1 (or later)
|
||||
* Xcode 10.3 (or later)
|
||||
* CocoaPods 1.7.2 (or later)
|
||||
* [CocoaPods generate](https://github.com/square/cocoapods-generate)
|
||||
|
||||
|
@ -123,6 +129,10 @@ Firestore has a self contained Xcode project. See
|
|||
|
||||
See [AddNewPod.md](AddNewPod.md).
|
||||
|
||||
### Managing Headers and Imports
|
||||
|
||||
See [HeadersImports.md](HeadersImports.md).
|
||||
|
||||
### Code Formatting
|
||||
|
||||
To ensure that the code is formatted consistently, run the script
|
||||
|
@ -130,21 +140,13 @@ To ensure that the code is formatted consistently, run the script
|
|||
before creating a PR.
|
||||
|
||||
Travis will verify that any code changes are done in a style compliant way. Install
|
||||
`clang-format` and `swiftformat`.
|
||||
These commands will get the right versions:
|
||||
`clang-format` and `swiftformat`:
|
||||
|
||||
```
|
||||
brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb
|
||||
brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb
|
||||
brew install clang-format
|
||||
brew install swiftformat
|
||||
```
|
||||
|
||||
Note: if you already have a newer version of these installed you may need to
|
||||
`brew switch` to this version.
|
||||
|
||||
To update this section, find the versions of clang-format and swiftformat.rb to
|
||||
match the versions in the CI failure logs
|
||||
[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
|
||||
|
||||
### Running Unit Tests
|
||||
|
||||
Select a scheme and press Command-u to build a component and run its unit tests.
|
||||
|
@ -167,12 +169,7 @@ files without real values, but can be replaced with real plist files. To get you
|
|||
2. Create a new Firebase project, if you don't already have one
|
||||
3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
|
||||
identifier (e.g. `com.google.Database-Example`)
|
||||
4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file
|
||||
(e.g. in [Example/Database/App/](Example/Database/App/));
|
||||
|
||||
Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require
|
||||
special Apple capabilities, and you will have to change the sample app to use a unique bundle
|
||||
identifier that you can control in your own Apple Developer account.
|
||||
4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project.
|
||||
|
||||
## Specific Component Instructions
|
||||
See the sections below for any special instructions for those components.
|
||||
|
@ -185,8 +182,16 @@ building and running the FirebaseAuth pod along with various samples and tests.
|
|||
|
||||
### Firebase Database
|
||||
|
||||
To run the Database Integration tests, make your database authentication rules
|
||||
[public](https://firebase.google.com/docs/database/security/quickstart).
|
||||
The Firebase Database Integration tests can be run against a locally running Database Emulator
|
||||
or against a production instance.
|
||||
|
||||
To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before
|
||||
running the integration test.
|
||||
|
||||
To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to
|
||||
`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to
|
||||
[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are
|
||||
running.
|
||||
|
||||
### Firebase Storage
|
||||
|
||||
|
@ -274,14 +279,20 @@ Your use of Firebase is governed by the
|
|||
[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
|
||||
|
||||
[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions
|
||||
[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg
|
||||
[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg
|
||||
[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg
|
||||
[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg
|
||||
[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg
|
||||
[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg
|
||||
[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg
|
||||
[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg
|
||||
[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg
|
||||
[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg
|
||||
[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg
|
||||
[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg
|
||||
[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg
|
||||
[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg
|
||||
[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg
|
||||
[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg
|
||||
[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -90,12 +90,10 @@ NS_SWIFT_NAME(Analytics)
|
|||
/// Must be called on the main thread.
|
||||
///
|
||||
/// Note that screen reporting is enabled automatically and records the class name of the current
|
||||
/// UIViewController for you without requiring you to call this method. If you implement
|
||||
/// viewDidAppear in your UIViewController but do not call [super viewDidAppear:], that screen class
|
||||
/// will not be automatically tracked. The class name can optionally be overridden by calling this
|
||||
/// method in the viewDidAppear callback of your UIViewController and specifying the
|
||||
/// screenClassOverride parameter. setScreenName:screenClass: must be called after
|
||||
/// [super viewDidAppear:].
|
||||
/// UIViewController for you without requiring you to call this method. The class name can
|
||||
/// optionally be overridden by calling this method in the viewDidAppear callback of your
|
||||
/// UIViewController and specifying the screenClassOverride parameter.
|
||||
/// `setScreenName:screenClass:` must be called after `[super viewDidAppear:]`.
|
||||
///
|
||||
/// If your app does not use a distinct UIViewController for each screen, you should call this
|
||||
/// method and specify a distinct screenName each time a new screen is presented to the user.
|
||||
|
@ -103,6 +101,9 @@ NS_SWIFT_NAME(Analytics)
|
|||
/// The screen name and screen class remain in effect until the current UIViewController changes or
|
||||
/// a new call to setScreenName:screenClass: is made.
|
||||
///
|
||||
/// @warning If you override `viewDidAppear:` in your UIViewController but do not call
|
||||
/// `[super viewDidAppear:]`, that screen class will not be tracked.
|
||||
///
|
||||
/// @param screenName The name of the current screen. Should contain 1 to 100 characters. Set to nil
|
||||
/// to clear the current screen name.
|
||||
/// @param screenClassOverride The name of the screen class. Should contain 1 to 100 characters. By
|
||||
|
|
|
@ -366,7 +366,6 @@ static NSString *const kFIREventViewItemList NS_SWIFT_NAME(AnalyticsEventViewIte
|
|||
/// <ul>
|
||||
/// <li>@c kFIRParameterSearchTerm (NSString)</li>
|
||||
/// </ul>
|
||||
/// <b>This constant has been deprecated.</b>
|
||||
static NSString *const kFIREventViewSearchResults NS_SWIFT_NAME(AnalyticsEventViewSearchResults) =
|
||||
@"view_search_results";
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h"
|
||||
#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h"
|
||||
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wdeprecated-implementations"
|
||||
|
|
|
@ -22,20 +22,20 @@
|
|||
#import <AppKit/AppKit.h>
|
||||
#endif
|
||||
|
||||
#import <FirebaseCore/FIRApp.h>
|
||||
#import "FirebaseCore/Sources/Public/FIRApp.h"
|
||||
|
||||
#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h"
|
||||
#import "FirebaseCore/Sources/FIRBundleUtil.h"
|
||||
#import "FirebaseCore/Sources/FIRComponentContainerInternal.h"
|
||||
#import "FirebaseCore/Sources/FIRConfigurationInternal.h"
|
||||
#import "FirebaseCore/Sources/FIRVersion.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRComponentContainerInternal.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRConfigurationInternal.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRLibrary.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRLogger.h"
|
||||
#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
|
||||
|
||||
#import <GoogleUtilities/GULAppEnvironmentUtil.h>
|
||||
#import "GoogleUtilities/Environment/Private/GULAppEnvironmentUtil.h"
|
||||
|
||||
#import <objc/runtime.h>
|
||||
|
||||
|
@ -166,7 +166,7 @@ static dispatch_once_t sFirebaseUserAgentOnceToken;
|
|||
|
||||
if ([name isEqualToString:kFIRDefaultAppName]) {
|
||||
if (sDefaultApp) {
|
||||
// The default app already exixts. Handle duplicate `configure` calls and return.
|
||||
// The default app already exists. Handle duplicate `configure` calls and return.
|
||||
[self appWasConfiguredTwice:sDefaultApp usingOptions:options];
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRAppAssociationRegistration.h"
|
||||
#import "FirebaseCore/Sources/FIRAppAssociationRegistration.h"
|
||||
|
||||
#import <objc/runtime.h>
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
#import "FirebaseCore/Sources/FIRBundleUtil.h"
|
||||
|
||||
#import <GoogleUtilities/GULAppEnvironmentUtil.h>
|
||||
#import "GoogleUtilities/Environment/Private/GULAppEnvironmentUtil.h"
|
||||
|
||||
@implementation FIRBundleUtil
|
||||
|
||||
|
@ -49,15 +49,19 @@
|
|||
|
||||
+ (BOOL)hasBundleIdentifierPrefix:(NSString *)bundleIdentifier inBundles:(NSArray *)bundles {
|
||||
for (NSBundle *bundle in bundles) {
|
||||
// This allows app extensions that have the app's bundle as their prefix to pass this test.
|
||||
NSString *applicationBundleIdentifier =
|
||||
[GULAppEnvironmentUtil isAppExtension]
|
||||
? [self bundleIdentifierByRemovingLastPartFrom:bundle.bundleIdentifier]
|
||||
: bundle.bundleIdentifier;
|
||||
|
||||
if ([applicationBundleIdentifier isEqualToString:bundleIdentifier]) {
|
||||
if ([bundle.bundleIdentifier isEqualToString:bundleIdentifier]) {
|
||||
return YES;
|
||||
}
|
||||
|
||||
if ([GULAppEnvironmentUtil isAppExtension]) {
|
||||
// A developer could be using the same `FIROptions` for both their app and extension. Since
|
||||
// extensions have a suffix added to the bundleID, we consider a matching prefix as valid.
|
||||
NSString *appBundleIDFromExtension =
|
||||
[self bundleIdentifierByRemovingLastPartFrom:bundle.bundleIdentifier];
|
||||
if ([appBundleIDFromExtension isEqualToString:bundleIdentifier]) {
|
||||
return YES;
|
||||
}
|
||||
}
|
||||
}
|
||||
return NO;
|
||||
}
|
||||
|
|
|
@ -15,8 +15,8 @@
|
|||
*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <FirebaseCore/FIRComponent.h>
|
||||
#import <FirebaseCore/FIRComponentContainer.h>
|
||||
#import "FirebaseCore/Sources/Private/FIRComponent.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRComponentContainer.h"
|
||||
|
||||
@class FIRApp;
|
||||
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#import "FirebaseCore/Sources/Private/FIRComponentType.h"
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRComponentContainerInternal.h"
|
||||
#import "FirebaseCore/Sources/FIRComponentContainerInternal.h"
|
||||
|
||||
@implementation FIRComponentType
|
||||
|
||||
|
|
|
@ -12,9 +12,9 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRConfigurationInternal.h"
|
||||
#import "FirebaseCore/Sources/FIRConfigurationInternal.h"
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRAnalyticsConfiguration.h"
|
||||
#import "FirebaseCore/Sources/FIRAnalyticsConfiguration.h"
|
||||
|
||||
extern void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel);
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <FirebaseCore/FIRConfiguration.h>
|
||||
#import "FirebaseCore/Sources/Public/FIRConfiguration.h"
|
||||
|
||||
@class FIRAnalyticsConfiguration;
|
||||
|
|
@ -16,12 +16,12 @@
|
|||
|
||||
#import "FirebaseCore/Sources/Private/FIRCoreDiagnosticsConnector.h"
|
||||
|
||||
#import <FirebaseCoreDiagnosticsInterop/FIRCoreDiagnosticsInterop.h>
|
||||
#import "Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h"
|
||||
|
||||
#import <FirebaseCore/FIROptions.h>
|
||||
#import "FirebaseCore/Sources/Public/FIROptions.h"
|
||||
|
||||
#import "FirebaseCore/Sources/FIRDiagnosticsData.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRDiagnosticsData.h"
|
||||
#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
|
||||
|
||||
// Define the interop class symbol declared as an extern in FIRCoreDiagnosticsInterop.
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <FirebaseCoreDiagnosticsInterop/FIRCoreDiagnosticsData.h>
|
||||
#import "Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
|
@ -14,9 +14,9 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRDiagnosticsData.h"
|
||||
#import "FirebaseCore/Sources/FIRDiagnosticsData.h"
|
||||
|
||||
#import <FirebaseCore/FIRApp.h>
|
||||
#import "FirebaseCore/Sources/Public/FIRApp.h"
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
|
||||
#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
|
||||
|
|
|
@ -13,8 +13,8 @@
|
|||
// limitations under the License.
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h"
|
||||
#import <GoogleUtilities/GULHeartbeatDateStorage.h>
|
||||
#import <GoogleUtilities/GULLogger.h>
|
||||
#import "GoogleUtilities/Environment/Private/GULHeartbeatDateStorage.h"
|
||||
#import "GoogleUtilities/Logger/Private/GULLogger.h"
|
||||
|
||||
const static long secondsInDay = 86400;
|
||||
@implementation FIRHeartbeatInfo : NSObject
|
||||
|
|
|
@ -14,9 +14,9 @@
|
|||
|
||||
#import "FirebaseCore/Sources/Private/FIRLogger.h"
|
||||
|
||||
#import <FirebaseCore/FIRLoggerLevel.h>
|
||||
#import <GoogleUtilities/GULAppEnvironmentUtil.h>
|
||||
#import <GoogleUtilities/GULLogger.h>
|
||||
#import "FirebaseCore/Sources/Public/FIRLoggerLevel.h"
|
||||
#import "GoogleUtilities/Environment/Private/GULAppEnvironmentUtil.h"
|
||||
#import "GoogleUtilities/Logger/Private/GULLogger.h"
|
||||
|
||||
#import "FirebaseCore/Sources/FIRVersion.h"
|
||||
|
||||
|
|
|
@ -90,40 +90,40 @@ NSString *const kFIRExceptionBadModification =
|
|||
|
||||
static FIROptions *sDefaultOptions = nil;
|
||||
static NSDictionary *sDefaultOptionsDictionary = nil;
|
||||
static dispatch_once_t sDefaultOptionsOnceToken;
|
||||
static dispatch_once_t sDefaultOptionsDictionaryOnceToken;
|
||||
|
||||
#pragma mark - Public only for internal class methods
|
||||
|
||||
+ (FIROptions *)defaultOptions {
|
||||
if (sDefaultOptions != nil) {
|
||||
return sDefaultOptions;
|
||||
}
|
||||
dispatch_once(&sDefaultOptionsOnceToken, ^{
|
||||
NSDictionary *defaultOptionsDictionary = [self defaultOptionsDictionary];
|
||||
if (defaultOptionsDictionary != nil) {
|
||||
sDefaultOptions =
|
||||
[[FIROptions alloc] initInternalWithOptionsDictionary:defaultOptionsDictionary];
|
||||
}
|
||||
});
|
||||
|
||||
NSDictionary *defaultOptionsDictionary = [self defaultOptionsDictionary];
|
||||
if (defaultOptionsDictionary == nil) {
|
||||
return nil;
|
||||
}
|
||||
|
||||
sDefaultOptions = [[FIROptions alloc] initInternalWithOptionsDictionary:defaultOptionsDictionary];
|
||||
return sDefaultOptions;
|
||||
}
|
||||
|
||||
#pragma mark - Private class methods
|
||||
|
||||
+ (NSDictionary *)defaultOptionsDictionary {
|
||||
if (sDefaultOptionsDictionary != nil) {
|
||||
return sDefaultOptionsDictionary;
|
||||
}
|
||||
NSString *plistFilePath = [FIROptions plistFilePathWithName:kServiceInfoFileName];
|
||||
if (plistFilePath == nil) {
|
||||
return nil;
|
||||
}
|
||||
sDefaultOptionsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistFilePath];
|
||||
if (sDefaultOptionsDictionary == nil) {
|
||||
FIRLogError(kFIRLoggerCore, @"I-COR000011",
|
||||
@"The configuration file is not a dictionary: "
|
||||
@"'%@.%@'.",
|
||||
kServiceInfoFileName, kServiceInfoFileType);
|
||||
}
|
||||
dispatch_once(&sDefaultOptionsDictionaryOnceToken, ^{
|
||||
NSString *plistFilePath = [FIROptions plistFilePathWithName:kServiceInfoFileName];
|
||||
if (plistFilePath == nil) {
|
||||
return;
|
||||
}
|
||||
sDefaultOptionsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistFilePath];
|
||||
if (sDefaultOptionsDictionary == nil) {
|
||||
FIRLogError(kFIRLoggerCore, @"I-COR000011",
|
||||
@"The configuration file is not a dictionary: "
|
||||
@"'%@.%@'.",
|
||||
kServiceInfoFileName, kServiceInfoFileType);
|
||||
}
|
||||
});
|
||||
|
||||
return sDefaultOptionsDictionary;
|
||||
}
|
||||
|
||||
|
@ -144,6 +144,8 @@ static NSDictionary *sDefaultOptionsDictionary = nil;
|
|||
+ (void)resetDefaultOptions {
|
||||
sDefaultOptions = nil;
|
||||
sDefaultOptionsDictionary = nil;
|
||||
sDefaultOptionsOnceToken = 0;
|
||||
sDefaultOptionsDictionaryOnceToken = 0;
|
||||
}
|
||||
|
||||
#pragma mark - Private instance methods
|
||||
|
|
|
@ -14,8 +14,19 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM.
|
||||
#import "FIRApp.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRApp.h>
|
||||
#endif
|
||||
|
||||
// The has_include is a workaround so the old IID needed for the FIS tests can find FIRErrors.h
|
||||
#if __has_include("FirebaseCore/Sources/Private/FIRErrors.h")
|
||||
#import "FirebaseCore/Sources/Private/FIRErrors.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRErrors.h>
|
||||
#endif
|
||||
|
||||
@class FIRComponentContainer;
|
||||
@protocol FIRLibrary;
|
||||
|
|
|
@ -15,8 +15,14 @@
|
|||
*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// The has_include is a workaround so the old IID needed for the FIS tests can find the headers.
|
||||
#if __has_include("FirebaseCore/Sources/Private/FIRComponentType.h")
|
||||
#import "FirebaseCore/Sources/Private/FIRComponentType.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRLibrary.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRComponentType.h>
|
||||
#import <FirebaseCore/FIRLibrary.h>
|
||||
#endif
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
|
|
|
@ -32,7 +32,8 @@ typedef NS_ENUM(NSInteger, FIRErrorCode) {
|
|||
FIRErrorCodeInvalidAppID = -101,
|
||||
|
||||
/**
|
||||
* Error code for failing to configure a specific service.
|
||||
* Error code for failing to configure a specific service. It's deprecated, but
|
||||
* still used after copybara.
|
||||
*/
|
||||
FIRErrorCodeConfigFailed = -114,
|
||||
};
|
||||
|
|
|
@ -19,7 +19,12 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// The has_include is a workaround so the old IID needed for the FIS tests can find the headers.
|
||||
#if __has_include("FirebaseCore/Sources/Private/FIRComponent.h")
|
||||
#import "FirebaseCore/Sources/Private/FIRComponent.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRComponent.h>
|
||||
#endif
|
||||
|
||||
@class FIRApp;
|
||||
|
||||
|
|
|
@ -16,7 +16,12 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM.
|
||||
#import "FIRLoggerLevel.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRLoggerLevel.h>
|
||||
#endif
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
|
|
|
@ -14,7 +14,12 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM.
|
||||
#import "FIROptions.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIROptions.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Keys for the strings in the plist file.
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
// Copyright 2020 Google LLC
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// An umbrella header, for any other libraries in this repo to access Firebase Public and Private
|
||||
// headers. Any package manager complexity should be handled here.
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
@import FirebaseCore;
|
||||
#else
|
||||
#import <FirebaseCore/FirebaseCore.h>
|
||||
#endif
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRComponent.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRComponentContainer.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRDependency.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRLibrary.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRLogger.h"
|
||||
#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <FirebaseCore/FIRLoggerLevel.h>
|
||||
#import "FIRLoggerLevel.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
+ (BOOL)isAppExtension;
|
||||
|
||||
/// @return Returns @YES when is run on iOS version greater or equal to 7.0
|
||||
+ (BOOL)isIOS7OrHigher;
|
||||
+ (BOOL)isIOS7OrHigher DEPRECATED_MSG_ATTRIBUTE(
|
||||
"Always `YES` because only iOS 8 and higher supported. The method will be removed.");
|
||||
|
||||
@end
|
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* Copyright 2018 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
@import GoogleUtilities_Logger;
|
||||
#else
|
||||
#import <GoogleUtilities/GULLoggerLevel.h>
|
||||
#endif
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* The services used in the logger.
|
||||
*/
|
||||
typedef NSString *const GULLoggerService;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
/**
|
||||
* Initialize GULLogger.
|
||||
*/
|
||||
extern void GULLoggerInitializeASL(void);
|
||||
|
||||
/**
|
||||
* Override log level to Debug.
|
||||
*/
|
||||
void GULLoggerForceDebug(void);
|
||||
|
||||
/**
|
||||
* Turn on logging to STDERR.
|
||||
*/
|
||||
extern void GULLoggerEnableSTDERR(void);
|
||||
|
||||
/**
|
||||
* Changes the default logging level of GULLoggerLevelNotice to a user-specified level.
|
||||
* The default level cannot be set above GULLoggerLevelNotice if the app is running from App Store.
|
||||
* (required) log level (one of the GULLoggerLevel enum values).
|
||||
*/
|
||||
extern void GULSetLoggerLevel(GULLoggerLevel loggerLevel);
|
||||
|
||||
/**
|
||||
* Checks if the specified logger level is loggable given the current settings.
|
||||
* (required) log level (one of the GULLoggerLevel enum values).
|
||||
*/
|
||||
extern BOOL GULIsLoggableLevel(GULLoggerLevel loggerLevel);
|
||||
|
||||
/**
|
||||
* Register version to include in logs.
|
||||
* (required) version
|
||||
*/
|
||||
extern void GULLoggerRegisterVersion(const char *version);
|
||||
|
||||
/**
|
||||
* Logs a message to the Xcode console and the device log. If running from AppStore, will
|
||||
* not log any messages with a level higher than GULLoggerLevelNotice to avoid log spamming.
|
||||
* (required) log level (one of the GULLoggerLevel enum values).
|
||||
* (required) service name of type GULLoggerService.
|
||||
* (required) message code starting with "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) variable arguments list obtained from calling va_start, used when message is a format
|
||||
* string.
|
||||
*/
|
||||
extern void GULLogBasic(GULLoggerLevel level,
|
||||
GULLoggerService service,
|
||||
BOOL forceLog,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable
|
||||
// See: http://stackoverflow.com/q/29095469
|
||||
#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX
|
||||
va_list args_ptr
|
||||
#else
|
||||
va_list _Nullable args_ptr
|
||||
#endif
|
||||
);
|
||||
|
||||
/**
|
||||
* The following functions accept the following parameters in order:
|
||||
* (required) service name of type GULLoggerService.
|
||||
* (required) message code starting from "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* See go/firebase-log-proposal for details.
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) the list of arguments to substitute into the format string.
|
||||
* Example usage:
|
||||
* GULLogError(kGULLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name);
|
||||
*/
|
||||
extern void GULLogError(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
extern void GULLogWarning(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
extern void GULLogNotice(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
extern void GULLogInfo(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
extern void GULLogDebug(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif // __cplusplus
|
||||
|
||||
@interface GULLoggerWrapper : NSObject
|
||||
|
||||
/**
|
||||
* Objective-C wrapper for GULLogBasic to allow weak linking to GULLogger
|
||||
* (required) log level (one of the GULLoggerLevel enum values).
|
||||
* (required) service name of type GULLoggerService.
|
||||
* (required) message code starting with "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) variable arguments list obtained from calling va_start, used when message is a format
|
||||
* string.
|
||||
*/
|
||||
|
||||
+ (void)logWithLevel:(GULLoggerLevel)level
|
||||
withService:(GULLoggerService)service
|
||||
withCode:(NSString *)messageCode
|
||||
withMessage:(NSString *)message
|
||||
withArgs:(va_list)args;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -2,14 +2,20 @@
|
|||
[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase)
|
||||
[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase)
|
||||
|
||||
[![Actions Status][gh-abtesting-badge]][gh-actions]
|
||||
[![Actions Status][gh-auth-badge]][gh-actions]
|
||||
[![Actions Status][gh-core-badge]][gh-actions]
|
||||
[![Actions Status][gh-crashlytics-badge]][gh-actions]
|
||||
[![Actions Status][gh-database-badge]][gh-actions]
|
||||
[![Actions Status][gh-datatransport-badge]][gh-actions]
|
||||
[![Actions Status][gh-dynamiclinks-badge]][gh-actions]
|
||||
[![Actions Status][gh-firebasepod-badge]][gh-actions]
|
||||
[![Actions Status][gh-firestore-badge]][gh-actions]
|
||||
[![Actions Status][gh-functions-badge]][gh-actions]
|
||||
[![Actions Status][gh-inappmessaging-badge]][gh-actions]
|
||||
[![Actions Status][gh-interop-badge]][gh-actions]
|
||||
[![Actions Status][gh-messaging-badge]][gh-actions]
|
||||
[![Actions Status][gh-remoteconfig-badge]][gh-actions]
|
||||
[![Actions Status][gh-storage-badge]][gh-actions]
|
||||
[![Actions Status][gh-symbolcollision-badge]][gh-actions]
|
||||
[![Actions Status][gh-zip-badge]][gh-actions]
|
||||
|
@ -92,7 +98,7 @@ Instructions for installing binary frameworks via
|
|||
To develop Firebase software in this repository, ensure that you have at least
|
||||
the following software:
|
||||
|
||||
* Xcode 10.1 (or later)
|
||||
* Xcode 10.3 (or later)
|
||||
* CocoaPods 1.7.2 (or later)
|
||||
* [CocoaPods generate](https://github.com/square/cocoapods-generate)
|
||||
|
||||
|
@ -123,6 +129,10 @@ Firestore has a self contained Xcode project. See
|
|||
|
||||
See [AddNewPod.md](AddNewPod.md).
|
||||
|
||||
### Managing Headers and Imports
|
||||
|
||||
See [HeadersImports.md](HeadersImports.md).
|
||||
|
||||
### Code Formatting
|
||||
|
||||
To ensure that the code is formatted consistently, run the script
|
||||
|
@ -130,21 +140,13 @@ To ensure that the code is formatted consistently, run the script
|
|||
before creating a PR.
|
||||
|
||||
Travis will verify that any code changes are done in a style compliant way. Install
|
||||
`clang-format` and `swiftformat`.
|
||||
These commands will get the right versions:
|
||||
`clang-format` and `swiftformat`:
|
||||
|
||||
```
|
||||
brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb
|
||||
brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb
|
||||
brew install clang-format
|
||||
brew install swiftformat
|
||||
```
|
||||
|
||||
Note: if you already have a newer version of these installed you may need to
|
||||
`brew switch` to this version.
|
||||
|
||||
To update this section, find the versions of clang-format and swiftformat.rb to
|
||||
match the versions in the CI failure logs
|
||||
[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
|
||||
|
||||
### Running Unit Tests
|
||||
|
||||
Select a scheme and press Command-u to build a component and run its unit tests.
|
||||
|
@ -167,12 +169,7 @@ files without real values, but can be replaced with real plist files. To get you
|
|||
2. Create a new Firebase project, if you don't already have one
|
||||
3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
|
||||
identifier (e.g. `com.google.Database-Example`)
|
||||
4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file
|
||||
(e.g. in [Example/Database/App/](Example/Database/App/));
|
||||
|
||||
Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require
|
||||
special Apple capabilities, and you will have to change the sample app to use a unique bundle
|
||||
identifier that you can control in your own Apple Developer account.
|
||||
4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project.
|
||||
|
||||
## Specific Component Instructions
|
||||
See the sections below for any special instructions for those components.
|
||||
|
@ -185,8 +182,16 @@ building and running the FirebaseAuth pod along with various samples and tests.
|
|||
|
||||
### Firebase Database
|
||||
|
||||
To run the Database Integration tests, make your database authentication rules
|
||||
[public](https://firebase.google.com/docs/database/security/quickstart).
|
||||
The Firebase Database Integration tests can be run against a locally running Database Emulator
|
||||
or against a production instance.
|
||||
|
||||
To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before
|
||||
running the integration test.
|
||||
|
||||
To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to
|
||||
`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to
|
||||
[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are
|
||||
running.
|
||||
|
||||
### Firebase Storage
|
||||
|
||||
|
@ -274,14 +279,20 @@ Your use of Firebase is governed by the
|
|||
[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
|
||||
|
||||
[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions
|
||||
[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg
|
||||
[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg
|
||||
[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg
|
||||
[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg
|
||||
[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg
|
||||
[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg
|
||||
[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg
|
||||
[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg
|
||||
[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg
|
||||
[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg
|
||||
[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg
|
||||
[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg
|
||||
[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg
|
||||
[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg
|
||||
[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg
|
||||
[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg
|
||||
[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg
|
||||
|
|
|
@ -17,17 +17,14 @@
|
|||
#import <objc/runtime.h>
|
||||
#include <sys/utsname.h>
|
||||
|
||||
#import <GoogleDataTransport/GDTCORConsoleLogger.h>
|
||||
#import <GoogleDataTransport/GDTCOREvent.h>
|
||||
#import <GoogleDataTransport/GDTCORTargets.h>
|
||||
#import <GoogleDataTransport/GDTCORTransport.h>
|
||||
#import "GoogleDataTransport/GDTCORLibrary/Internal/GoogleDataTransportInternal.h"
|
||||
|
||||
#import <GoogleUtilities/GULAppEnvironmentUtil.h>
|
||||
#import <GoogleUtilities/GULHeartbeatDateStorage.h>
|
||||
#import <GoogleUtilities/GULLogger.h>
|
||||
#import "GoogleUtilities/Environment/Private/GULAppEnvironmentUtil.h"
|
||||
#import "GoogleUtilities/Environment/Private/GULHeartbeatDateStorage.h"
|
||||
#import "GoogleUtilities/Logger/Private/GULLogger.h"
|
||||
|
||||
#import <FirebaseCoreDiagnosticsInterop/FIRCoreDiagnosticsData.h>
|
||||
#import <FirebaseCoreDiagnosticsInterop/FIRCoreDiagnosticsInterop.h>
|
||||
#import "Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h"
|
||||
#import "Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsInterop.h"
|
||||
|
||||
#import <nanopb/pb.h>
|
||||
#import <nanopb/pb_decode.h>
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
// Copyright 2020 Google LLC
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// An umbrella header, for any other libraries in this repo to access Firebase Public and Private
|
||||
// headers. Any package manager complexity should be handled here.
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
@import GoogleDataTransport;
|
||||
#else
|
||||
#import <GoogleDataTransport/GoogleDataTransport.h>
|
||||
#endif
|
47
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULAppEnvironmentUtil.h
generated
Normal file
47
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULAppEnvironmentUtil.h
generated
Normal file
|
@ -0,0 +1,47 @@
|
|||
/*
|
||||
* Copyright 2017 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface GULAppEnvironmentUtil : NSObject
|
||||
|
||||
/// Indicates whether the app is from Apple Store or not. Returns NO if the app is on simulator,
|
||||
/// development environment or sideloaded.
|
||||
+ (BOOL)isFromAppStore;
|
||||
|
||||
/// Indicates whether the app is a Testflight app. Returns YES if the app has sandbox receipt.
|
||||
/// Returns NO otherwise.
|
||||
+ (BOOL)isAppStoreReceiptSandbox;
|
||||
|
||||
/// Indicates whether the app is on simulator or not at runtime depending on the device
|
||||
/// architecture.
|
||||
+ (BOOL)isSimulator;
|
||||
|
||||
/// The current device model. Returns an empty string if device model cannot be retrieved.
|
||||
+ (NSString *)deviceModel;
|
||||
|
||||
/// The current operating system version. Returns an empty string if the system version cannot be
|
||||
/// retrieved.
|
||||
+ (NSString *)systemVersion;
|
||||
|
||||
/// Indicates whether it is running inside an extension or an app.
|
||||
+ (BOOL)isAppExtension;
|
||||
|
||||
/// @return Returns @YES when is run on iOS version greater or equal to 7.0
|
||||
+ (BOOL)isIOS7OrHigher DEPRECATED_MSG_ATTRIBUTE(
|
||||
"Always `YES` because only iOS 8 and higher supported. The method will be removed.");
|
||||
|
||||
@end
|
49
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULHeartbeatDateStorage.h
generated
Normal file
49
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULHeartbeatDateStorage.h
generated
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// Stores either a date or a dictionary to a specified file.
|
||||
@interface GULHeartbeatDateStorage : NSObject
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@property(nonatomic, readonly) NSURL *fileURL;
|
||||
|
||||
/**
|
||||
* Default initializer.
|
||||
* @param fileName The name of the file to store the date information.
|
||||
* exist, it will be created if needed.
|
||||
*/
|
||||
- (instancetype)initWithFileName:(NSString *)fileName;
|
||||
|
||||
/**
|
||||
* Reads the date from the specified file for the given tag.
|
||||
* @return Returns date if exists, otherwise `nil`.
|
||||
*/
|
||||
- (nullable NSDate *)heartbeatDateForTag:(NSString *)tag;
|
||||
|
||||
/**
|
||||
* Saves the date for the specified tag in the specified file.
|
||||
* @return YES on success, NO otherwise.
|
||||
*/
|
||||
- (BOOL)setHearbeatDate:(NSDate *)date forTag:(NSString *)tag;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
79
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULKeychainStorage.h
generated
Normal file
79
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULKeychainStorage.h
generated
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class FBLPromise<ValueType>;
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// The class provides a convenient abstraction on top of the iOS Keychain API to save data.
|
||||
@interface GULKeychainStorage : NSObject
|
||||
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
/** Initializes the keychain storage with Keychain Service name.
|
||||
* @param service A Keychain Service name that will be used to store and retrieve objects. See also
|
||||
* `kSecAttrService`.
|
||||
*/
|
||||
- (instancetype)initWithService:(NSString *)service;
|
||||
|
||||
/**
|
||||
* Get an object by key.
|
||||
* @param key The key.
|
||||
* @param objectClass The expected object class required by `NSSecureCoding`.
|
||||
* @param accessGroup The Keychain Access Group.
|
||||
*
|
||||
* @return Returns a promise. It is resolved with an object stored by key if exists. It is resolved
|
||||
* with `nil` when the object not found. It fails on a Keychain error.
|
||||
*/
|
||||
- (FBLPromise<id<NSSecureCoding>> *)getObjectForKey:(NSString *)key
|
||||
objectClass:(Class)objectClass
|
||||
accessGroup:(nullable NSString *)accessGroup;
|
||||
|
||||
/**
|
||||
* Saves the given object by the given key.
|
||||
* @param object The object to store.
|
||||
* @param key The key to store the object. If there is an existing object by the key, it will be
|
||||
* overridden.
|
||||
* @param accessGroup The Keychain Access Group.
|
||||
*
|
||||
* @return Returns which is resolved with `[NSNull null]` on success.
|
||||
*/
|
||||
- (FBLPromise<NSNull *> *)setObject:(id<NSSecureCoding>)object
|
||||
forKey:(NSString *)key
|
||||
accessGroup:(nullable NSString *)accessGroup;
|
||||
|
||||
/**
|
||||
* Removes the object by the given key.
|
||||
* @param key The key to store the object. If there is an existing object by the key, it will be
|
||||
* overridden.
|
||||
* @param accessGroup The Keychain Access Group.
|
||||
*
|
||||
* @return Returns which is resolved with `[NSNull null]` on success.
|
||||
*/
|
||||
- (FBLPromise<NSNull *> *)removeObjectForKey:(NSString *)key
|
||||
accessGroup:(nullable NSString *)accessGroup;
|
||||
|
||||
#if TARGET_OS_OSX
|
||||
/// If not `nil`, then only this keychain will be used to save and read data (see
|
||||
/// `kSecMatchSearchList` and `kSecUseKeychain`. It is mostly intended to be used by unit tests.
|
||||
@property(nonatomic, nullable) SecKeychainRef keychainRef;
|
||||
#endif // TARGET_OSX
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
61
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULKeychainUtils.h
generated
Normal file
61
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULKeychainUtils.h
generated
Normal file
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
FOUNDATION_EXPORT NSString *const kGULKeychainUtilsErrorDomain;
|
||||
|
||||
/// Helper functions to access Keychain.
|
||||
@interface GULKeychainUtils : NSObject
|
||||
|
||||
/** Fetches a keychain item data matching to the provided query.
|
||||
* @param query A dictionary with Keychain query parameters. See docs for `SecItemCopyMatching` for
|
||||
* details.
|
||||
* @param outError A pointer to `NSError` instance or `NULL`. The instance at `outError` will be
|
||||
* assigned with an error if there is.
|
||||
* @returns Data for the first Keychain Item matching the provided query or `nil` if there is not
|
||||
* such an item (`outError` will be `nil` in this case) or an error occurred.
|
||||
*/
|
||||
+ (nullable NSData *)getItemWithQuery:(NSDictionary *)query
|
||||
error:(NSError *_Nullable *_Nullable)outError;
|
||||
|
||||
/** Stores data to a Keychain Item matching to the provided query. An existing Keychain Item
|
||||
* matching the query parameters will be updated or a new will be created.
|
||||
* @param item A Keychain Item data to store.
|
||||
* @param query A dictionary with Keychain query parameters. See docs for `SecItemAdd` and
|
||||
* `SecItemUpdate` for details.
|
||||
* @param outError A pointer to `NSError` instance or `NULL`. The instance at `outError` will be
|
||||
* assigned with an error if there is.
|
||||
* @returns `YES` when data was successfully stored, `NO` otherwise.
|
||||
*/
|
||||
+ (BOOL)setItem:(NSData *)item
|
||||
withQuery:(NSDictionary *)query
|
||||
error:(NSError *_Nullable *_Nullable)outError;
|
||||
|
||||
/** Removes a Keychain Item matching to the provided query.
|
||||
* @param query A dictionary with Keychain query parameters. See docs for `SecItemDelete` for
|
||||
* details.
|
||||
* @param outError A pointer to `NSError` instance or `NULL`. The instance at `outError` will be
|
||||
* assigned with an error if there is.
|
||||
* @returns `YES` if the item was removed successfully or doesn't exist, `NO` otherwise.
|
||||
*/
|
||||
+ (BOOL)removeItemWithQuery:(NSDictionary *)query error:(NSError *_Nullable *_Nullable)outError;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
36
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULSecureCoding.h
generated
Normal file
36
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Environment/Private/GULSecureCoding.h
generated
Normal file
|
@ -0,0 +1,36 @@
|
|||
// Copyright 2019 Google
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/** The class wraps `NSKeyedArchiver` and `NSKeyedUnarchiver` API to provide a unified secure coding
|
||||
* methods for iOS versions before and after 11.
|
||||
*/
|
||||
@interface GULSecureCoding : NSObject
|
||||
|
||||
+ (nullable id)unarchivedObjectOfClasses:(NSSet<Class> *)classes
|
||||
fromData:(NSData *)data
|
||||
error:(NSError **)outError;
|
||||
|
||||
+ (nullable id)unarchivedObjectOfClass:(Class)class
|
||||
fromData:(NSData *)data
|
||||
error:(NSError **)outError;
|
||||
|
||||
+ (nullable NSData *)archivedDataWithRootObject:(id<NSCoding>)object error:(NSError **)outError;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
163
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Logger/Private/GULLogger.h
generated
Normal file
163
ios/Pods/FirebaseCoreDiagnostics/GoogleUtilities/Logger/Private/GULLogger.h
generated
Normal file
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* Copyright 2018 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
@import GoogleUtilities_Logger;
|
||||
#else
|
||||
#import <GoogleUtilities/GULLoggerLevel.h>
|
||||
#endif
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* The services used in the logger.
|
||||
*/
|
||||
typedef NSString *const GULLoggerService;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
/**
|
||||
* Initialize GULLogger.
|
||||
*/
|
||||
extern void GULLoggerInitializeASL(void);
|
||||
|
||||
/**
|
||||
* Override log level to Debug.
|
||||
*/
|
||||
void GULLoggerForceDebug(void);
|
||||
|
||||
/**
|
||||
* Turn on logging to STDERR.
|
||||
*/
|
||||
extern void GULLoggerEnableSTDERR(void);
|
||||
|
||||
/**
|
||||
* Changes the default logging level of GULLoggerLevelNotice to a user-specified level.
|
||||
* The default level cannot be set above GULLoggerLevelNotice if the app is running from App Store.
|
||||
* (required) log level (one of the GULLoggerLevel enum values).
|
||||
*/
|
||||
extern void GULSetLoggerLevel(GULLoggerLevel loggerLevel);
|
||||
|
||||
/**
|
||||
* Checks if the specified logger level is loggable given the current settings.
|
||||
* (required) log level (one of the GULLoggerLevel enum values).
|
||||
*/
|
||||
extern BOOL GULIsLoggableLevel(GULLoggerLevel loggerLevel);
|
||||
|
||||
/**
|
||||
* Register version to include in logs.
|
||||
* (required) version
|
||||
*/
|
||||
extern void GULLoggerRegisterVersion(const char *version);
|
||||
|
||||
/**
|
||||
* Logs a message to the Xcode console and the device log. If running from AppStore, will
|
||||
* not log any messages with a level higher than GULLoggerLevelNotice to avoid log spamming.
|
||||
* (required) log level (one of the GULLoggerLevel enum values).
|
||||
* (required) service name of type GULLoggerService.
|
||||
* (required) message code starting with "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) variable arguments list obtained from calling va_start, used when message is a format
|
||||
* string.
|
||||
*/
|
||||
extern void GULLogBasic(GULLoggerLevel level,
|
||||
GULLoggerService service,
|
||||
BOOL forceLog,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable
|
||||
// See: http://stackoverflow.com/q/29095469
|
||||
#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX
|
||||
va_list args_ptr
|
||||
#else
|
||||
va_list _Nullable args_ptr
|
||||
#endif
|
||||
);
|
||||
|
||||
/**
|
||||
* The following functions accept the following parameters in order:
|
||||
* (required) service name of type GULLoggerService.
|
||||
* (required) message code starting from "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* See go/firebase-log-proposal for details.
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) the list of arguments to substitute into the format string.
|
||||
* Example usage:
|
||||
* GULLogError(kGULLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name);
|
||||
*/
|
||||
extern void GULLogError(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
extern void GULLogWarning(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
extern void GULLogNotice(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
extern void GULLogInfo(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
extern void GULLogDebug(GULLoggerService service,
|
||||
BOOL force,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
...) NS_FORMAT_FUNCTION(4, 5);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif // __cplusplus
|
||||
|
||||
@interface GULLoggerWrapper : NSObject
|
||||
|
||||
/**
|
||||
* Objective-C wrapper for GULLogBasic to allow weak linking to GULLogger
|
||||
* (required) log level (one of the GULLoggerLevel enum values).
|
||||
* (required) service name of type GULLoggerService.
|
||||
* (required) message code starting with "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) variable arguments list obtained from calling va_start, used when message is a format
|
||||
* string.
|
||||
*/
|
||||
|
||||
+ (void)logWithLevel:(GULLoggerLevel)level
|
||||
withService:(GULLoggerService)service
|
||||
withCode:(NSString *)messageCode
|
||||
withMessage:(NSString *)message
|
||||
withArgs:(va_list)args;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
61
ios/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h
generated
Normal file
61
ios/Pods/FirebaseCoreDiagnostics/Interop/CoreDiagnostics/Public/FIRCoreDiagnosticsData.h
generated
Normal file
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* Copyright 2019 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/** If present, is a BOOL wrapped in an NSNumber. */
|
||||
#define kFIRCDIsDataCollectionDefaultEnabledKey @"FIRCDIsDataCollectionDefaultEnabledKey"
|
||||
|
||||
/** If present, is an int32_t wrapped in an NSNumber. */
|
||||
#define kFIRCDConfigurationTypeKey @"FIRCDConfigurationTypeKey"
|
||||
|
||||
/** If present, is an NSString. */
|
||||
#define kFIRCDSdkNameKey @"FIRCDSdkNameKey"
|
||||
|
||||
/** If present, is an NSString. */
|
||||
#define kFIRCDSdkVersionKey @"FIRCDSdkVersionKey"
|
||||
|
||||
/** If present, is an int32_t wrapped in an NSNumber. */
|
||||
#define kFIRCDllAppsCountKey @"FIRCDllAppsCountKey"
|
||||
|
||||
/** If present, is an NSString. */
|
||||
#define kFIRCDGoogleAppIDKey @"FIRCDGoogleAppIDKey"
|
||||
|
||||
/** If present, is an NSString. */
|
||||
#define kFIRCDBundleIDKey @"FIRCDBundleID"
|
||||
|
||||
/** If present, is a BOOL wrapped in an NSNumber. */
|
||||
#define kFIRCDUsingOptionsFromDefaultPlistKey @"FIRCDUsingOptionsFromDefaultPlistKey"
|
||||
|
||||
/** If present, is an NSString. */
|
||||
#define kFIRCDLibraryVersionIDKey @"FIRCDLibraryVersionIDKey"
|
||||
|
||||
/** If present, is an NSString. */
|
||||
#define kFIRCDFirebaseUserAgentKey @"FIRCDFirebaseUserAgentKey"
|
||||
|
||||
/** Defines the interface of a data object needed to log diagnostics data. */
|
||||
@protocol FIRCoreDiagnosticsData <NSObject>
|
||||
|
||||
@required
|
||||
|
||||
/** A dictionary containing data (non-exhaustive) to be logged in diagnostics. */
|
||||
@property(nonatomic) NSDictionary<NSString *, id> *diagnosticObjects;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -16,20 +16,18 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "FIRCoreDiagnosticsData.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/** This class represents a future data object, determined at instantiation time. */
|
||||
@interface GDTCORDataFuture : NSObject <NSSecureCoding>
|
||||
/** Allows the interoperation of FirebaseCore and FirebaseCoreDiagnostics. */
|
||||
@protocol FIRCoreDiagnosticsInterop <NSObject>
|
||||
|
||||
/** If not nil, this data future was instantiated with this file URL. */
|
||||
@property(nullable, readonly, nonatomic) NSURL *fileURL;
|
||||
|
||||
/** Initializes an instance with the given the fileURL.
|
||||
/** Sends the given diagnostics data.
|
||||
*
|
||||
* @param fileURL The fileURL containing the data to return in -data.
|
||||
* @return An instance of this class.
|
||||
* @param diagnosticsData The diagnostics data object to send.
|
||||
*/
|
||||
- (instancetype)initWithFileURL:(NSURL *)fileURL;
|
||||
+ (void)sendDiagnosticsData:(id<FIRCoreDiagnosticsData>)diagnosticsData;
|
||||
|
||||
@end
|
||||
|
|
@ -2,14 +2,20 @@
|
|||
[![License](https://img.shields.io/cocoapods/l/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase)
|
||||
[![Platform](https://img.shields.io/cocoapods/p/Firebase.svg?style=flat)](https://cocoapods.org/pods/Firebase)
|
||||
|
||||
[![Actions Status][gh-abtesting-badge]][gh-actions]
|
||||
[![Actions Status][gh-auth-badge]][gh-actions]
|
||||
[![Actions Status][gh-core-badge]][gh-actions]
|
||||
[![Actions Status][gh-crashlytics-badge]][gh-actions]
|
||||
[![Actions Status][gh-database-badge]][gh-actions]
|
||||
[![Actions Status][gh-datatransport-badge]][gh-actions]
|
||||
[![Actions Status][gh-dynamiclinks-badge]][gh-actions]
|
||||
[![Actions Status][gh-firebasepod-badge]][gh-actions]
|
||||
[![Actions Status][gh-firestore-badge]][gh-actions]
|
||||
[![Actions Status][gh-functions-badge]][gh-actions]
|
||||
[![Actions Status][gh-inappmessaging-badge]][gh-actions]
|
||||
[![Actions Status][gh-interop-badge]][gh-actions]
|
||||
[![Actions Status][gh-messaging-badge]][gh-actions]
|
||||
[![Actions Status][gh-remoteconfig-badge]][gh-actions]
|
||||
[![Actions Status][gh-storage-badge]][gh-actions]
|
||||
[![Actions Status][gh-symbolcollision-badge]][gh-actions]
|
||||
[![Actions Status][gh-zip-badge]][gh-actions]
|
||||
|
@ -92,7 +98,7 @@ Instructions for installing binary frameworks via
|
|||
To develop Firebase software in this repository, ensure that you have at least
|
||||
the following software:
|
||||
|
||||
* Xcode 10.1 (or later)
|
||||
* Xcode 10.3 (or later)
|
||||
* CocoaPods 1.7.2 (or later)
|
||||
* [CocoaPods generate](https://github.com/square/cocoapods-generate)
|
||||
|
||||
|
@ -123,6 +129,10 @@ Firestore has a self contained Xcode project. See
|
|||
|
||||
See [AddNewPod.md](AddNewPod.md).
|
||||
|
||||
### Managing Headers and Imports
|
||||
|
||||
See [HeadersImports.md](HeadersImports.md).
|
||||
|
||||
### Code Formatting
|
||||
|
||||
To ensure that the code is formatted consistently, run the script
|
||||
|
@ -130,21 +140,13 @@ To ensure that the code is formatted consistently, run the script
|
|||
before creating a PR.
|
||||
|
||||
Travis will verify that any code changes are done in a style compliant way. Install
|
||||
`clang-format` and `swiftformat`.
|
||||
These commands will get the right versions:
|
||||
`clang-format` and `swiftformat`:
|
||||
|
||||
```
|
||||
brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c6f1cbd/Formula/clang-format.rb
|
||||
brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/c13eda8/Formula/swiftformat.rb
|
||||
brew install clang-format
|
||||
brew install swiftformat
|
||||
```
|
||||
|
||||
Note: if you already have a newer version of these installed you may need to
|
||||
`brew switch` to this version.
|
||||
|
||||
To update this section, find the versions of clang-format and swiftformat.rb to
|
||||
match the versions in the CI failure logs
|
||||
[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
|
||||
|
||||
### Running Unit Tests
|
||||
|
||||
Select a scheme and press Command-u to build a component and run its unit tests.
|
||||
|
@ -167,12 +169,7 @@ files without real values, but can be replaced with real plist files. To get you
|
|||
2. Create a new Firebase project, if you don't already have one
|
||||
3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
|
||||
identifier (e.g. `com.google.Database-Example`)
|
||||
4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file
|
||||
(e.g. in [Example/Database/App/](Example/Database/App/));
|
||||
|
||||
Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require
|
||||
special Apple capabilities, and you will have to change the sample app to use a unique bundle
|
||||
identifier that you can control in your own Apple Developer account.
|
||||
4. Download the resulting `GoogleService-Info.plist` and add it to the Xcode project.
|
||||
|
||||
## Specific Component Instructions
|
||||
See the sections below for any special instructions for those components.
|
||||
|
@ -185,8 +182,16 @@ building and running the FirebaseAuth pod along with various samples and tests.
|
|||
|
||||
### Firebase Database
|
||||
|
||||
To run the Database Integration tests, make your database authentication rules
|
||||
[public](https://firebase.google.com/docs/database/security/quickstart).
|
||||
The Firebase Database Integration tests can be run against a locally running Database Emulator
|
||||
or against a production instance.
|
||||
|
||||
To run against a local emulator instance, invoke `./scripts/run_database_emulator.sh start` before
|
||||
running the integration test.
|
||||
|
||||
To run against a production instance, provide a valid GoogleServices-Info.plist and copy it to
|
||||
`FirebaseDatabase/Tests/Resources/GoogleService-Info.plist`. Your Security Rule must be set to
|
||||
[public](https://firebase.google.com/docs/database/security/quickstart) while your tests are
|
||||
running.
|
||||
|
||||
### Firebase Storage
|
||||
|
||||
|
@ -274,14 +279,20 @@ Your use of Firebase is governed by the
|
|||
[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
|
||||
|
||||
[gh-actions]: https://github.com/firebase/firebase-ios-sdk/actions
|
||||
[gh-abtesting-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/abtesting/badge.svg
|
||||
[gh-auth-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/auth/badge.svg
|
||||
[gh-core-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/core/badge.svg
|
||||
[gh-crashlytics-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/crashlytics/badge.svg
|
||||
[gh-database-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/database/badge.svg
|
||||
[gh-datatransport-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/datatransport/badge.svg
|
||||
[gh-dynamiclinks-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/dynamiclinks/badge.svg
|
||||
[gh-firebasepod-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firebasepod/badge.svg
|
||||
[gh-firestore-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/firestore/badge.svg
|
||||
[gh-functions-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/functions/badge.svg
|
||||
[gh-inappmessaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/inappmessaging/badge.svg
|
||||
[gh-interop-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/interop/badge.svg
|
||||
[gh-messaging-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/messaging/badge.svg
|
||||
[gh-remoteconfig-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/remoteconfig/badge.svg
|
||||
[gh-storage-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/storage/badge.svg
|
||||
[gh-symbolcollision-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/symbolcollision/badge.svg
|
||||
[gh-zip-badge]: https://github.com/firebase/firebase-ios-sdk/workflows/zip/badge.svg
|
||||
|
|
|
@ -1,202 +0,0 @@
|
|||
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
|
@ -1,251 +0,0 @@
|
|||
# Firebase iOS Open Source Development [![Build Status](https://travis-ci.org/firebase/firebase-ios-sdk.svg?branch=master)](https://travis-ci.org/firebase/firebase-ios-sdk)
|
||||
|
||||
This repository contains a subset of the Firebase iOS SDK source. It currently
|
||||
includes FirebaseCore, FirebaseABTesting, FirebaseAuth, FirebaseDatabase,
|
||||
FirebaseFirestore, FirebaseFunctions, FirebaseInstanceID, FirebaseInAppMessaging,
|
||||
FirebaseInAppMessagingDisplay, FirebaseMessaging, FirebaseRemoteConfig, and
|
||||
FirebaseStorage.
|
||||
|
||||
The repository also includes GoogleUtilities source. The
|
||||
[GoogleUtilities](GoogleUtilities/README.md) pod is
|
||||
a set of utilities used by Firebase and other Google products.
|
||||
|
||||
Firebase is an app development platform with tools to help you build, grow and
|
||||
monetize your app. More information about Firebase can be found at
|
||||
[https://firebase.google.com](https://firebase.google.com).
|
||||
|
||||
## Installation
|
||||
|
||||
See the three subsections for details about three different installation methods.
|
||||
1. [Standard pod install](README.md#standard-pod-install)
|
||||
1. [Installing from the GitHub repo](README.md#installing-from-github)
|
||||
1. [Experimental Carthage](README.md#carthage-ios-only)
|
||||
|
||||
### Standard pod install
|
||||
|
||||
Go to
|
||||
[https://firebase.google.com/docs/ios/setup](https://firebase.google.com/docs/ios/setup).
|
||||
|
||||
### Installing from GitHub
|
||||
|
||||
For releases starting with 5.0.0, the source for each release is also deployed
|
||||
to CocoaPods master and available via standard
|
||||
[CocoaPods Podfile syntax](https://guides.cocoapods.org/syntax/podfile.html#pod).
|
||||
|
||||
These instructions can be used to access the Firebase repo at other branches,
|
||||
tags, or commits.
|
||||
|
||||
#### Background
|
||||
|
||||
See
|
||||
[the Podfile Syntax Reference](https://guides.cocoapods.org/syntax/podfile.html#pod)
|
||||
for instructions and options about overriding pod source locations.
|
||||
|
||||
#### Accessing Firebase Source Snapshots
|
||||
|
||||
All of the official releases are tagged in this repo and available via CocoaPods. To access a local
|
||||
source snapshot or unreleased branch, use Podfile directives like the following:
|
||||
|
||||
To access FirebaseFirestore via a branch:
|
||||
```
|
||||
pod 'FirebaseCore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
|
||||
pod 'FirebaseFirestore', :git => 'https://github.com/firebase/firebase-ios-sdk.git', :branch => 'master'
|
||||
```
|
||||
|
||||
To access FirebaseMessaging via a checked out version of the firebase-ios-sdk repo do:
|
||||
|
||||
```
|
||||
pod 'FirebaseCore', :path => '/path/to/firebase-ios-sdk'
|
||||
pod 'FirebaseMessaging', :path => '/path/to/firebase-ios-sdk'
|
||||
```
|
||||
|
||||
### Carthage (iOS only)
|
||||
|
||||
Instructions for the experimental Carthage distribution are at
|
||||
[Carthage](Carthage.md).
|
||||
|
||||
### Rome
|
||||
|
||||
Instructions for installing binary frameworks via
|
||||
[Rome](https://github.com/CocoaPods/Rome) are at [Rome](Rome.md).
|
||||
|
||||
## Development
|
||||
|
||||
To develop Firebase software in this repository, ensure that you have at least
|
||||
the following software:
|
||||
|
||||
* Xcode 10.1 (or later)
|
||||
* CocoaPods 1.7.2 (or later)
|
||||
* [CocoaPods generate](https://github.com/square/cocoapods-generate)
|
||||
|
||||
For the pod that you want to develop:
|
||||
|
||||
`pod gen Firebase{name here}.podspec --local-sources=./ --auto-open --platforms=ios`
|
||||
|
||||
Note: If the CocoaPods cache is out of date, you may need to run
|
||||
`pod repo update` before the `pod gen` command.
|
||||
|
||||
Note: Set the `--platforms` option to `macos` or `tvos` to develop/test for
|
||||
those platforms. Since 10.2, Xcode does not properly handle multi-platform
|
||||
CocoaPods workspaces.
|
||||
|
||||
Firestore has a self contained Xcode project. See
|
||||
[Firestore/README.md](Firestore/README.md).
|
||||
|
||||
### Development for Catalyst
|
||||
* `pod gen {name here}.podspec --local-sources=./ --auto-open --platforms=ios`
|
||||
* Check the Mac box in the App-iOS Build Settings
|
||||
* Sign the App in the Settings Signing & Capabilities tab
|
||||
* Click Pods in the Project Manager
|
||||
* Add Signing to the iOS host app and unit test targets
|
||||
* Select the Unit-unit scheme
|
||||
* Run it to build and test
|
||||
|
||||
### Adding a New Firebase Pod
|
||||
|
||||
See [AddNewPod.md](AddNewPod.md).
|
||||
|
||||
### Code Formatting
|
||||
|
||||
To ensure that the code is formatted consistently, run the script
|
||||
[./scripts/style.sh](https://github.com/firebase/firebase-ios-sdk/blob/master/scripts/style.sh)
|
||||
before creating a PR.
|
||||
|
||||
Travis will verify that any code changes are done in a style compliant way. Install
|
||||
`clang-format` and `swiftformat`.
|
||||
These commands will get the right versions:
|
||||
|
||||
```
|
||||
brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/e3496d9/Formula/clang-format.rb
|
||||
brew upgrade https://raw.githubusercontent.com/Homebrew/homebrew-core/7963c3d/Formula/swiftformat.rb
|
||||
```
|
||||
|
||||
Note: if you already have a newer version of these installed you may need to
|
||||
`brew switch` to this version.
|
||||
|
||||
To update this section, find the versions of clang-format and swiftformat.rb to
|
||||
match the versions in the CI failure logs
|
||||
[here](https://github.com/Homebrew/homebrew-core/tree/master/Formula).
|
||||
|
||||
### Running Unit Tests
|
||||
|
||||
Select a scheme and press Command-u to build a component and run its unit tests.
|
||||
|
||||
#### Viewing Code Coverage
|
||||
|
||||
First, make sure that [xcov](https://github.com/nakiostudio/xcov) is installed with `gem install xcov`.
|
||||
|
||||
After running the `AllUnitTests_iOS` scheme in Xcode, execute
|
||||
`xcov --workspace Firebase.xcworkspace --scheme AllUnitTests_iOS --output_directory xcov_output`
|
||||
at Example/ in the terminal. This will aggregate the coverage, and you can run `open xcov_output/index.html` to see the results.
|
||||
|
||||
### Running Sample Apps
|
||||
In order to run the sample apps and integration tests, you'll need valid
|
||||
`GoogleService-Info.plist` files for those samples. The Firebase Xcode project contains dummy plist
|
||||
files without real values, but can be replaced with real plist files. To get your own
|
||||
`GoogleService-Info.plist` files:
|
||||
|
||||
1. Go to the [Firebase Console](https://console.firebase.google.com/)
|
||||
2. Create a new Firebase project, if you don't already have one
|
||||
3. For each sample app you want to test, create a new Firebase app with the sample app's bundle
|
||||
identifier (e.g. `com.google.Database-Example`)
|
||||
4. Download the resulting `GoogleService-Info.plist` and replace the appropriate dummy plist file
|
||||
(e.g. in [Example/Database/App/](Example/Database/App/));
|
||||
|
||||
Some sample apps like Firebase Messaging ([Example/Messaging/App](Example/Messaging/App)) require
|
||||
special Apple capabilities, and you will have to change the sample app to use a unique bundle
|
||||
identifier that you can control in your own Apple Developer account.
|
||||
|
||||
## Specific Component Instructions
|
||||
See the sections below for any special instructions for those components.
|
||||
|
||||
### Firebase Auth
|
||||
|
||||
If you're doing specific Firebase Auth development, see
|
||||
[the Auth Sample README](Example/Auth/README.md) for instructions about
|
||||
building and running the FirebaseAuth pod along with various samples and tests.
|
||||
|
||||
### Firebase Database
|
||||
|
||||
To run the Database Integration tests, make your database authentication rules
|
||||
[public](https://firebase.google.com/docs/database/security/quickstart).
|
||||
|
||||
### Firebase Storage
|
||||
|
||||
To run the Storage Integration tests, follow the instructions in
|
||||
[FIRStorageIntegrationTests.m](Example/Storage/Tests/Integration/FIRStorageIntegrationTests.m).
|
||||
|
||||
#### Push Notifications
|
||||
|
||||
Push notifications can only be delivered to specially provisioned App IDs in the developer portal.
|
||||
In order to actually test receiving push notifications, you will need to:
|
||||
|
||||
1. Change the bundle identifier of the sample app to something you own in your Apple Developer
|
||||
account, and enable that App ID for push notifications.
|
||||
2. You'll also need to
|
||||
[upload your APNs Provider Authentication Key or certificate to the Firebase Console](https://firebase.google.com/docs/cloud-messaging/ios/certs)
|
||||
at **Project Settings > Cloud Messaging > [Your Firebase App]**.
|
||||
3. Ensure your iOS device is added to your Apple Developer portal as a test device.
|
||||
|
||||
#### iOS Simulator
|
||||
|
||||
The iOS Simulator cannot register for remote notifications, and will not receive push notifications.
|
||||
In order to receive push notifications, you'll have to follow the steps above and run the app on a
|
||||
physical device.
|
||||
|
||||
## Community Supported Efforts
|
||||
|
||||
We've seen an amazing amount of interest and contributions to improve the Firebase SDKs, and we are
|
||||
very grateful! We'd like to empower as many developers as we can to be able to use Firebase and
|
||||
participate in the Firebase community.
|
||||
|
||||
### tvOS, macOS, and Catalyst
|
||||
Thanks to contributions from the community, FirebaseABTesting, FirebaseAuth, FirebaseCore,
|
||||
FirebaseDatabase, FirebaseMessaging, FirebaseFirestore,
|
||||
FirebaseFunctions, FirebaseRemoteConfig, and FirebaseStorage now compile, run unit tests, and work on
|
||||
tvOS, macOS, and Catalyst.
|
||||
|
||||
For tvOS, checkout the [Sample](Example/tvOSSample).
|
||||
|
||||
Keep in mind that macOS, Catalyst and tvOS are not officially supported by Firebase, and this
|
||||
repository is actively developed primarily for iOS. While we can catch basic unit test issues with
|
||||
Travis, there may be some changes where the SDK no longer works as expected on macOS or tvOS. If you
|
||||
encounter this, please [file an issue](https://github.com/firebase/firebase-ios-sdk/issues).
|
||||
|
||||
To install, add a subset of the following to the Podfile:
|
||||
|
||||
```
|
||||
pod 'Firebase/ABTesting'
|
||||
pod 'Firebase/Auth'
|
||||
pod 'Firebase/Database'
|
||||
pod 'Firebase/Firestore'
|
||||
pod 'Firebase/Functions'
|
||||
pod 'Firebase/Messaging'
|
||||
pod 'Firebase/RemoteConfig'
|
||||
pod 'Firebase/Storage'
|
||||
```
|
||||
|
||||
#### Additional Catalyst Notes
|
||||
|
||||
* FirebaseAuth and FirebaseMessaging require adding `Keychain Sharing Capability`
|
||||
to Build Settings.
|
||||
* FirebaseFirestore requires signing the
|
||||
[gRPC Resource target](https://github.com/firebase/firebase-ios-sdk/issues/3500#issuecomment-518741681).
|
||||
|
||||
## Roadmap
|
||||
|
||||
See [Roadmap](ROADMAP.md) for more about the Firebase iOS SDK Open Source
|
||||
plans and directions.
|
||||
|
||||
## Contributing
|
||||
|
||||
See [Contributing](CONTRIBUTING.md) for more information on contributing to the Firebase
|
||||
iOS SDK.
|
||||
|
||||
## License
|
||||
|
||||
The contents of this repository is licensed under the
|
||||
[Apache License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0).
|
||||
|
||||
Your use of Firebase is governed by the
|
||||
[Terms of Service for Firebase Services](https://firebase.google.com/terms/).
|
173
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRAppInternal.h
generated
Normal file
173
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRAppInternal.h
generated
Normal file
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
* Copyright 2017 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM.
|
||||
#import "FIRApp.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRApp.h>
|
||||
#endif
|
||||
|
||||
// The has_include is a workaround so the old IID needed for the FIS tests can find FIRErrors.h
|
||||
#if __has_include("FirebaseCore/Sources/Private/FIRErrors.h")
|
||||
#import "FirebaseCore/Sources/Private/FIRErrors.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRErrors.h>
|
||||
#endif
|
||||
|
||||
@class FIRComponentContainer;
|
||||
@protocol FIRLibrary;
|
||||
|
||||
/**
|
||||
* The internal interface to FIRApp. This is meant for first-party integrators, who need to receive
|
||||
* FIRApp notifications, log info about the success or failure of their configuration, and access
|
||||
* other internal functionality of FIRApp.
|
||||
*
|
||||
* TODO(b/28296561): Restructure this header.
|
||||
*/
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
typedef NS_ENUM(NSInteger, FIRConfigType) {
|
||||
FIRConfigTypeCore = 1,
|
||||
FIRConfigTypeSDK = 2,
|
||||
};
|
||||
|
||||
extern NSString *const kFIRDefaultAppName;
|
||||
extern NSString *const kFIRAppReadyToConfigureSDKNotification;
|
||||
extern NSString *const kFIRAppDeleteNotification;
|
||||
extern NSString *const kFIRAppIsDefaultAppKey;
|
||||
extern NSString *const kFIRAppNameKey;
|
||||
extern NSString *const kFIRGoogleAppIDKey;
|
||||
|
||||
/**
|
||||
* The format string for the User Defaults key used for storing the data collection enabled flag.
|
||||
* This includes formatting to append the Firebase App's name.
|
||||
*/
|
||||
extern NSString *const kFIRGlobalAppDataCollectionEnabledDefaultsKeyFormat;
|
||||
|
||||
/**
|
||||
* The plist key used for storing the data collection enabled flag.
|
||||
*/
|
||||
extern NSString *const kFIRGlobalAppDataCollectionEnabledPlistKey;
|
||||
|
||||
/**
|
||||
* A notification fired containing diagnostic information when SDK errors occur.
|
||||
*/
|
||||
extern NSString *const kFIRAppDiagnosticsNotification;
|
||||
|
||||
/** @var FIRAuthStateDidChangeInternalNotification
|
||||
@brief The name of the @c NSNotificationCenter notification which is posted when the auth state
|
||||
changes (e.g. a new token has been produced, a user logs in or out). The object parameter of
|
||||
the notification is a dictionary possibly containing the key:
|
||||
@c FIRAuthStateDidChangeInternalNotificationTokenKey (the new access token.) If it does not
|
||||
contain this key it indicates a sign-out event took place.
|
||||
*/
|
||||
extern NSString *const FIRAuthStateDidChangeInternalNotification;
|
||||
|
||||
/** @var FIRAuthStateDidChangeInternalNotificationTokenKey
|
||||
@brief A key present in the dictionary object parameter of the
|
||||
@c FIRAuthStateDidChangeInternalNotification notification. The value associated with this
|
||||
key will contain the new access token.
|
||||
*/
|
||||
extern NSString *const FIRAuthStateDidChangeInternalNotificationTokenKey;
|
||||
|
||||
/** @var FIRAuthStateDidChangeInternalNotificationAppKey
|
||||
@brief A key present in the dictionary object parameter of the
|
||||
@c FIRAuthStateDidChangeInternalNotification notification. The value associated with this
|
||||
key will contain the FIRApp associated with the auth instance.
|
||||
*/
|
||||
extern NSString *const FIRAuthStateDidChangeInternalNotificationAppKey;
|
||||
|
||||
/** @var FIRAuthStateDidChangeInternalNotificationUIDKey
|
||||
@brief A key present in the dictionary object parameter of the
|
||||
@c FIRAuthStateDidChangeInternalNotification notification. The value associated with this
|
||||
key will contain the new user's UID (or nil if there is no longer a user signed in).
|
||||
*/
|
||||
extern NSString *const FIRAuthStateDidChangeInternalNotificationUIDKey;
|
||||
|
||||
@interface FIRApp ()
|
||||
|
||||
/**
|
||||
* A flag indicating if this is the default app (has the default app name).
|
||||
*/
|
||||
@property(nonatomic, readonly) BOOL isDefaultApp;
|
||||
|
||||
/*
|
||||
* The container of interop SDKs for this app.
|
||||
*/
|
||||
@property(nonatomic) FIRComponentContainer *container;
|
||||
|
||||
/**
|
||||
* Creates an error for failing to configure a subspec service. This method is called by each
|
||||
* FIRApp notification listener.
|
||||
*/
|
||||
+ (NSError *)errorForSubspecConfigurationFailureWithDomain:(NSString *)domain
|
||||
errorCode:(FIRErrorCode)code
|
||||
service:(NSString *)service
|
||||
reason:(NSString *)reason;
|
||||
/**
|
||||
* Checks if the default app is configured without trying to configure it.
|
||||
*/
|
||||
+ (BOOL)isDefaultAppConfigured;
|
||||
|
||||
/**
|
||||
* Registers a given third-party library with the given version number to be reported for
|
||||
* analytics.
|
||||
*
|
||||
* @param name Name of the library.
|
||||
* @param version Version of the library.
|
||||
*/
|
||||
+ (void)registerLibrary:(nonnull NSString *)name withVersion:(nonnull NSString *)version;
|
||||
|
||||
/**
|
||||
* Registers a given internal library with the given version number to be reported for
|
||||
* analytics.
|
||||
*
|
||||
* @param library Optional parameter for component registration.
|
||||
* @param name Name of the library.
|
||||
* @param version Version of the library.
|
||||
*/
|
||||
+ (void)registerInternalLibrary:(nonnull Class<FIRLibrary>)library
|
||||
withName:(nonnull NSString *)name
|
||||
withVersion:(nonnull NSString *)version;
|
||||
|
||||
/**
|
||||
* A concatenated string representing all the third-party libraries and version numbers.
|
||||
*/
|
||||
+ (NSString *)firebaseUserAgent;
|
||||
|
||||
/**
|
||||
* Used by each SDK to send logs about SDK configuration status to Clearcut.
|
||||
*
|
||||
* @note This API is a no-op, please remove calls to it.
|
||||
*/
|
||||
- (void)sendLogsWithServiceName:(NSString *)serviceName
|
||||
version:(NSString *)version
|
||||
error:(NSError *)error;
|
||||
|
||||
/**
|
||||
* Can be used by the unit tests in eack SDK to reset FIRApp. This method is thread unsafe.
|
||||
*/
|
||||
+ (void)resetApps;
|
||||
|
||||
/**
|
||||
* Can be used by the unit tests in each SDK to set customized options.
|
||||
*/
|
||||
- (instancetype)initInstanceWithName:(NSString *)name options:(FIROptions *)options;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,91 @@
|
|||
/*
|
||||
* Copyright 2018 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class FIRApp;
|
||||
@class FIRComponentContainer;
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// Provides a system to clean up cached instances returned from the component system.
|
||||
NS_SWIFT_NAME(ComponentLifecycleMaintainer)
|
||||
@protocol FIRComponentLifecycleMaintainer
|
||||
/// The associated app will be deleted, clean up any resources as they are about to be deallocated.
|
||||
- (void)appWillBeDeleted:(FIRApp *)app;
|
||||
@end
|
||||
|
||||
typedef _Nullable id (^FIRComponentCreationBlock)(FIRComponentContainer *container,
|
||||
BOOL *isCacheable)
|
||||
NS_SWIFT_NAME(ComponentCreationBlock);
|
||||
|
||||
@class FIRDependency;
|
||||
|
||||
/// Describes the timing of instantiation. Note: new components should default to lazy unless there
|
||||
/// is a strong reason to be eager.
|
||||
typedef NS_ENUM(NSInteger, FIRInstantiationTiming) {
|
||||
FIRInstantiationTimingLazy,
|
||||
FIRInstantiationTimingAlwaysEager,
|
||||
FIRInstantiationTimingEagerInDefaultApp
|
||||
} NS_SWIFT_NAME(InstantiationTiming);
|
||||
|
||||
/// A component that can be used from other Firebase SDKs.
|
||||
NS_SWIFT_NAME(Component)
|
||||
@interface FIRComponent : NSObject
|
||||
|
||||
/// The protocol describing functionality provided from the Component.
|
||||
@property(nonatomic, strong, readonly) Protocol *protocol;
|
||||
|
||||
/// The timing of instantiation.
|
||||
@property(nonatomic, readonly) FIRInstantiationTiming instantiationTiming;
|
||||
|
||||
/// An array of dependencies for the component.
|
||||
@property(nonatomic, copy, readonly) NSArray<FIRDependency *> *dependencies;
|
||||
|
||||
/// A block to instantiate an instance of the component with the appropriate dependencies.
|
||||
@property(nonatomic, copy, readonly) FIRComponentCreationBlock creationBlock;
|
||||
|
||||
// There's an issue with long NS_SWIFT_NAMES that causes compilation to fail, disable clang-format
|
||||
// for the next two methods.
|
||||
// clang-format off
|
||||
|
||||
/// Creates a component with no dependencies that will be lazily initialized.
|
||||
+ (instancetype)componentWithProtocol:(Protocol *)protocol
|
||||
creationBlock:(FIRComponentCreationBlock)creationBlock
|
||||
NS_SWIFT_NAME(init(_:creationBlock:));
|
||||
|
||||
/// Creates a component to be registered with the component container.
|
||||
///
|
||||
/// @param protocol - The protocol describing functionality provided by the component.
|
||||
/// @param instantiationTiming - When the component should be initialized. Use .lazy unless there's
|
||||
/// a good reason to be instantiated earlier.
|
||||
/// @param dependencies - Any dependencies the `implementingClass` has, optional or required.
|
||||
/// @param creationBlock - A block to instantiate the component with a container, and if
|
||||
/// @return A component that can be registered with the component container.
|
||||
+ (instancetype)componentWithProtocol:(Protocol *)protocol
|
||||
instantiationTiming:(FIRInstantiationTiming)instantiationTiming
|
||||
dependencies:(NSArray<FIRDependency *> *)dependencies
|
||||
creationBlock:(FIRComponentCreationBlock)creationBlock
|
||||
NS_SWIFT_NAME(init(_:instantiationTiming:dependencies:creationBlock:));
|
||||
|
||||
// clang-format on
|
||||
|
||||
/// Unavailable.
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
50
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentContainer.h
generated
Normal file
50
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentContainer.h
generated
Normal file
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright 2018 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// The has_include is a workaround so the old IID needed for the FIS tests can find the headers.
|
||||
#if __has_include("FirebaseCore/Sources/Private/FIRComponentType.h")
|
||||
#import "FirebaseCore/Sources/Private/FIRComponentType.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRLibrary.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRComponentType.h>
|
||||
#import <FirebaseCore/FIRLibrary.h>
|
||||
#endif
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// A type-safe macro to retrieve a component from a container. This should be used to retrieve
|
||||
/// components instead of using the container directly.
|
||||
#define FIR_COMPONENT(type, container) \
|
||||
[FIRComponentType<id<type>> instanceForProtocol:@protocol(type) inContainer:container]
|
||||
|
||||
@class FIRApp;
|
||||
|
||||
/// A container that holds different components that are registered via the
|
||||
/// `registerAsComponentRegistrant:` call. These classes should conform to `FIRComponentRegistrant`
|
||||
/// in order to properly register components for Core.
|
||||
NS_SWIFT_NAME(FirebaseComponentContainer)
|
||||
@interface FIRComponentContainer : NSObject
|
||||
|
||||
/// A weak reference to the app that an instance of the container belongs to.
|
||||
@property(nonatomic, weak, readonly) FIRApp *app;
|
||||
|
||||
/// Unavailable. Use the `container` property on `FIRApp`.
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
34
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentType.h
generated
Normal file
34
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRComponentType.h
generated
Normal file
|
@ -0,0 +1,34 @@
|
|||
/*
|
||||
* Copyright 2018 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@class FIRComponentContainer;
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// Do not use directly. A placeholder type in order to provide a macro that will warn users of
|
||||
/// mis-matched protocols.
|
||||
NS_SWIFT_NAME(ComponentType)
|
||||
@interface FIRComponentType<__covariant T> : NSObject
|
||||
|
||||
/// Do not use directly. A factory method to retrieve an instance that provides a specific
|
||||
/// functionality.
|
||||
+ (T)instanceForProtocol:(Protocol *)protocol inContainer:(FIRComponentContainer *)container;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -14,17 +14,22 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <GoogleDataTransport/GDTCORUploadPackage.h>
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
@interface GDTCORUploadPackage ()
|
||||
@class FIRDiagnosticsData;
|
||||
@class FIROptions;
|
||||
|
||||
/** The storage object this upload package will use to resolve event hashes to files. */
|
||||
@property(nonatomic) id<GDTCORStorageProtocol> storage;
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/** A handler that will receive callbacks for certain events. */
|
||||
@property(nonatomic) id<NSSecureCoding, GDTCORUploadPackageProtocol> handler;
|
||||
/** Connects FIRCore with the CoreDiagnostics library. */
|
||||
@interface FIRCoreDiagnosticsConnector : NSObject
|
||||
|
||||
/** Checks if the package is expired and calls -packageExpired: on the handler if necessary. */
|
||||
- (void)checkIfPackageIsExpired;
|
||||
/** Logs FirebaseCore related data.
|
||||
*
|
||||
* @param options The options object containing data to log.
|
||||
*/
|
||||
+ (void)logCoreTelemetryWithOptions:(FIROptions *)options;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
45
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRDependency.h
generated
Normal file
45
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRDependency.h
generated
Normal file
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
* Copyright 2018 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// A dependency on a specific protocol's functionality.
|
||||
NS_SWIFT_NAME(Dependency)
|
||||
@interface FIRDependency : NSObject
|
||||
|
||||
/// The protocol describing functionality being depended on.
|
||||
@property(nonatomic, strong, readonly) Protocol *protocol;
|
||||
|
||||
/// A flag to specify if the dependency is required or not.
|
||||
@property(nonatomic, readonly) BOOL isRequired;
|
||||
|
||||
/// Initializes a dependency that is required. Calls `initWithProtocol:isRequired` with `YES` for
|
||||
/// the required parameter.
|
||||
/// Creates a required dependency on the specified protocol's functionality.
|
||||
+ (instancetype)dependencyWithProtocol:(Protocol *)protocol;
|
||||
|
||||
/// Creates a dependency on the specified protocol's functionality and specify if it's required for
|
||||
/// the class's functionality.
|
||||
+ (instancetype)dependencyWithProtocol:(Protocol *)protocol isRequired:(BOOL)required;
|
||||
|
||||
/// Use `dependencyWithProtocol:isRequired:` instead.
|
||||
- (instancetype)init NS_UNAVAILABLE;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright 2017 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/** Error codes in Firebase error domain. */
|
||||
typedef NS_ENUM(NSInteger, FIRErrorCode) {
|
||||
/**
|
||||
* Unknown error.
|
||||
*/
|
||||
FIRErrorCodeUnknown = 0,
|
||||
/**
|
||||
* Loading data from the GoogleService-Info.plist file failed. This is a fatal error and should
|
||||
* not be ignored. Further calls to the API will fail and/or possibly cause crashes.
|
||||
*/
|
||||
FIRErrorCodeInvalidPlistFile = -100,
|
||||
|
||||
/**
|
||||
* Validating the Google App ID format failed.
|
||||
*/
|
||||
FIRErrorCodeInvalidAppID = -101,
|
||||
|
||||
/**
|
||||
* Error code for failing to configure a specific service. It's deprecated, but
|
||||
* still used after copybara.
|
||||
*/
|
||||
FIRErrorCodeConfigFailed = -114,
|
||||
};
|
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Copyright 2017 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#include "FIRErrorCode.h"
|
||||
|
||||
extern NSString *const kFirebaseErrorDomain;
|
||||
extern NSString *const kFirebaseConfigErrorDomain;
|
||||
extern NSString *const kFirebaseCoreErrorDomain;
|
||||
extern NSString *const kFirebasePerfErrorDomain;
|
39
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h
generated
Normal file
39
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIRHeartbeatInfo.h
generated
Normal file
|
@ -0,0 +1,39 @@
|
|||
// Copyright 2019 Google
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface FIRHeartbeatInfo : NSObject
|
||||
|
||||
// Enum representing the different heartbeat codes.
|
||||
typedef NS_ENUM(NSInteger, FIRHeartbeatInfoCode) {
|
||||
FIRHeartbeatInfoCodeNone = 0,
|
||||
FIRHeartbeatInfoCodeSDK = 1,
|
||||
FIRHeartbeatInfoCodeGlobal = 2,
|
||||
FIRHeartbeatInfoCodeCombined = 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* Get heartbeat code requred for the sdk.
|
||||
* @param heartbeatTag String representing the sdk heartbeat tag.
|
||||
* @return Heartbeat code indicating whether or not an sdk/global heartbeat
|
||||
* needs to be sent
|
||||
*/
|
||||
+ (FIRHeartbeatInfoCode)heartbeatCodeForTag:(NSString *)heartbeatTag;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright 2018 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef FIRLibrary_h
|
||||
#define FIRLibrary_h
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
// The has_include is a workaround so the old IID needed for the FIS tests can find the headers.
|
||||
#if __has_include("FirebaseCore/Sources/Private/FIRComponent.h")
|
||||
#import "FirebaseCore/Sources/Private/FIRComponent.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRComponent.h>
|
||||
#endif
|
||||
|
||||
@class FIRApp;
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/// Provide an interface to register a library for userAgent logging and availability to others.
|
||||
NS_SWIFT_NAME(Library)
|
||||
@protocol FIRLibrary
|
||||
|
||||
/// Returns one or more FIRComponents that will be registered in
|
||||
/// FIRApp and participate in dependency resolution and injection.
|
||||
+ (NSArray<FIRComponent *> *)componentsToRegister;
|
||||
|
||||
@optional
|
||||
/// Implement this method if the library needs notifications for lifecycle events. This method is
|
||||
/// called when the developer calls `FirebaseApp.configure()`.
|
||||
+ (void)configureWithApp:(FIRApp *)app;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
||||
|
||||
#endif /* FIRLibrary_h */
|
|
@ -0,0 +1,156 @@
|
|||
/*
|
||||
* Copyright 2017 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM.
|
||||
#import "FIRLoggerLevel.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIRLoggerLevel.h>
|
||||
#endif
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
/**
|
||||
* The Firebase services used in Firebase logger.
|
||||
*/
|
||||
typedef NSString *const FIRLoggerService;
|
||||
|
||||
extern FIRLoggerService kFIRLoggerABTesting;
|
||||
extern FIRLoggerService kFIRLoggerAdMob;
|
||||
extern FIRLoggerService kFIRLoggerAnalytics;
|
||||
extern FIRLoggerService kFIRLoggerAuth;
|
||||
extern FIRLoggerService kFIRLoggerCrash;
|
||||
extern FIRLoggerService kFIRLoggerCore;
|
||||
extern FIRLoggerService kFIRLoggerMLKit;
|
||||
extern FIRLoggerService kFIRLoggerPerf;
|
||||
extern FIRLoggerService kFIRLoggerRemoteConfig;
|
||||
|
||||
/**
|
||||
* The key used to store the logger's error count.
|
||||
*/
|
||||
extern NSString *const kFIRLoggerErrorCountKey;
|
||||
|
||||
/**
|
||||
* The key used to store the logger's warning count.
|
||||
*/
|
||||
extern NSString *const kFIRLoggerWarningCountKey;
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif // __cplusplus
|
||||
|
||||
/**
|
||||
* Enables or disables Analytics debug mode.
|
||||
* If set to YES, the logging level for Analytics will be set to FIRLoggerLevelDebug.
|
||||
* Enabling the debug mode has no effect if the app is running from App Store.
|
||||
* (required) analytics debug mode flag.
|
||||
*/
|
||||
void FIRSetAnalyticsDebugMode(BOOL analyticsDebugMode);
|
||||
|
||||
/**
|
||||
* Changes the default logging level of FIRLoggerLevelNotice to a user-specified level.
|
||||
* The default level cannot be set above FIRLoggerLevelNotice if the app is running from App Store.
|
||||
* (required) log level (one of the FIRLoggerLevel enum values).
|
||||
*/
|
||||
void FIRSetLoggerLevel(FIRLoggerLevel loggerLevel);
|
||||
|
||||
/**
|
||||
* Checks if the specified logger level is loggable given the current settings.
|
||||
* (required) log level (one of the FIRLoggerLevel enum values).
|
||||
* (required) whether or not this function is called from the Analytics component.
|
||||
*/
|
||||
BOOL FIRIsLoggableLevel(FIRLoggerLevel loggerLevel, BOOL analyticsComponent);
|
||||
|
||||
/**
|
||||
* Logs a message to the Xcode console and the device log. If running from AppStore, will
|
||||
* not log any messages with a level higher than FIRLoggerLevelNotice to avoid log spamming.
|
||||
* (required) log level (one of the FIRLoggerLevel enum values).
|
||||
* (required) service name of type FIRLoggerService.
|
||||
* (required) message code starting with "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) variable arguments list obtained from calling va_start, used when message is a format
|
||||
* string.
|
||||
*/
|
||||
extern void FIRLogBasic(FIRLoggerLevel level,
|
||||
FIRLoggerService service,
|
||||
NSString *messageCode,
|
||||
NSString *message,
|
||||
// On 64-bit simulators, va_list is not a pointer, so cannot be marked nullable
|
||||
// See: http://stackoverflow.com/q/29095469
|
||||
#if __LP64__ && TARGET_OS_SIMULATOR || TARGET_OS_OSX
|
||||
va_list args_ptr
|
||||
#else
|
||||
va_list _Nullable args_ptr
|
||||
#endif
|
||||
);
|
||||
|
||||
/**
|
||||
* The following functions accept the following parameters in order:
|
||||
* (required) service name of type FIRLoggerService.
|
||||
* (required) message code starting from "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* See go/firebase-log-proposal for details.
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) the list of arguments to substitute into the format string.
|
||||
* Example usage:
|
||||
* FIRLogError(kFIRLoggerCore, @"I-COR000001", @"Configuration of %@ failed.", app.name);
|
||||
*/
|
||||
extern void FIRLogError(FIRLoggerService service, NSString *messageCode, NSString *message, ...)
|
||||
NS_FORMAT_FUNCTION(3, 4);
|
||||
extern void FIRLogWarning(FIRLoggerService service, NSString *messageCode, NSString *message, ...)
|
||||
NS_FORMAT_FUNCTION(3, 4);
|
||||
extern void FIRLogNotice(FIRLoggerService service, NSString *messageCode, NSString *message, ...)
|
||||
NS_FORMAT_FUNCTION(3, 4);
|
||||
extern void FIRLogInfo(FIRLoggerService service, NSString *messageCode, NSString *message, ...)
|
||||
NS_FORMAT_FUNCTION(3, 4);
|
||||
extern void FIRLogDebug(FIRLoggerService service, NSString *messageCode, NSString *message, ...)
|
||||
NS_FORMAT_FUNCTION(3, 4);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif // __cplusplus
|
||||
|
||||
@interface FIRLoggerWrapper : NSObject
|
||||
|
||||
/**
|
||||
* Objective-C wrapper for FIRLogBasic to allow weak linking to FIRLogger
|
||||
* (required) log level (one of the FIRLoggerLevel enum values).
|
||||
* (required) service name of type FIRLoggerService.
|
||||
* (required) message code starting with "I-" which means iOS, followed by a capitalized
|
||||
* three-character service identifier and a six digit integer message ID that is unique
|
||||
* within the service.
|
||||
* An example of the message code is @"I-COR000001".
|
||||
* (required) message string which can be a format string.
|
||||
* (optional) variable arguments list obtained from calling va_start, used when message is a format
|
||||
* string.
|
||||
*/
|
||||
|
||||
+ (void)logWithLevel:(FIRLoggerLevel)level
|
||||
withService:(FIRLoggerService)service
|
||||
withCode:(NSString *)messageCode
|
||||
withMessage:(NSString *)message
|
||||
withArgs:(va_list)args;
|
||||
|
||||
@end
|
||||
|
||||
NS_ASSUME_NONNULL_END
|
119
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIROptionsInternal.h
generated
Normal file
119
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FIROptionsInternal.h
generated
Normal file
|
@ -0,0 +1,119 @@
|
|||
/*
|
||||
* Copyright 2017 Google
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
// TODO(paulb777): Investigate if there's a common strategy for both Cocoapods and Swift PM.
|
||||
#import "FIROptions.h"
|
||||
#else
|
||||
#import <FirebaseCore/FIROptions.h>
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Keys for the strings in the plist file.
|
||||
*/
|
||||
extern NSString *const kFIRAPIKey;
|
||||
extern NSString *const kFIRTrackingID;
|
||||
extern NSString *const kFIRGoogleAppID;
|
||||
extern NSString *const kFIRClientID;
|
||||
extern NSString *const kFIRGCMSenderID;
|
||||
extern NSString *const kFIRAndroidClientID;
|
||||
extern NSString *const kFIRDatabaseURL;
|
||||
extern NSString *const kFIRStorageBucket;
|
||||
extern NSString *const kFIRBundleID;
|
||||
extern NSString *const kFIRProjectID;
|
||||
|
||||
/**
|
||||
* Keys for the plist file name
|
||||
*/
|
||||
extern NSString *const kServiceInfoFileName;
|
||||
|
||||
extern NSString *const kServiceInfoFileType;
|
||||
|
||||
/**
|
||||
* This header file exposes the initialization of FIROptions to internal use.
|
||||
*/
|
||||
@interface FIROptions ()
|
||||
|
||||
/**
|
||||
* resetDefaultOptions and initInternalWithOptionsDictionary: are exposed only for unit tests.
|
||||
*/
|
||||
+ (void)resetDefaultOptions;
|
||||
|
||||
/**
|
||||
* Initializes the options with dictionary. The above strings are the keys of the dictionary.
|
||||
* This is the designated initializer.
|
||||
*/
|
||||
- (instancetype)initInternalWithOptionsDictionary:(NSDictionary *)serviceInfoDictionary;
|
||||
|
||||
/**
|
||||
* defaultOptions and defaultOptionsDictionary are exposed in order to be used in FIRApp and
|
||||
* other first party services.
|
||||
*/
|
||||
+ (FIROptions *)defaultOptions;
|
||||
|
||||
+ (NSDictionary *)defaultOptionsDictionary;
|
||||
|
||||
/**
|
||||
* Indicates whether or not Analytics collection was explicitly enabled via a plist flag or at
|
||||
* runtime.
|
||||
*/
|
||||
@property(nonatomic, readonly) BOOL isAnalyticsCollectionExplicitlySet;
|
||||
|
||||
/**
|
||||
* Whether or not Analytics Collection was enabled. Analytics Collection is enabled unless
|
||||
* explicitly disabled in GoogleService-Info.plist.
|
||||
*/
|
||||
@property(nonatomic, readonly) BOOL isAnalyticsCollectionEnabled;
|
||||
|
||||
/**
|
||||
* Whether or not Analytics Collection was completely disabled. If YES, then
|
||||
* isAnalyticsCollectionEnabled will be NO.
|
||||
*/
|
||||
@property(nonatomic, readonly) BOOL isAnalyticsCollectionDeactivated;
|
||||
|
||||
/**
|
||||
* The version ID of the client library, e.g. @"1100000".
|
||||
*/
|
||||
@property(nonatomic, readonly, copy) NSString *libraryVersionID;
|
||||
|
||||
/**
|
||||
* The flag indicating whether this object was constructed with the values in the default plist
|
||||
* file.
|
||||
*/
|
||||
@property(nonatomic) BOOL usingOptionsFromDefaultPlist;
|
||||
|
||||
/**
|
||||
* Whether or not Measurement was enabled. Measurement is enabled unless explicitly disabled in
|
||||
* GoogleService-Info.plist.
|
||||
*/
|
||||
@property(nonatomic, readonly) BOOL isMeasurementEnabled;
|
||||
|
||||
/**
|
||||
* Whether or not Analytics was enabled in the developer console.
|
||||
*/
|
||||
@property(nonatomic, readonly) BOOL isAnalyticsEnabled;
|
||||
|
||||
/**
|
||||
* Whether or not SignIn was enabled in the developer console.
|
||||
*/
|
||||
@property(nonatomic, readonly) BOOL isSignInEnabled;
|
||||
|
||||
/**
|
||||
* Whether or not editing is locked. This should occur after FIROptions has been set on a FIRApp.
|
||||
*/
|
||||
@property(nonatomic, getter=isEditingLocked) BOOL editingLocked;
|
||||
|
||||
@end
|
31
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FirebaseCoreInternal.h
generated
Normal file
31
ios/Pods/FirebaseInstallations/FirebaseCore/Sources/Private/FirebaseCoreInternal.h
generated
Normal file
|
@ -0,0 +1,31 @@
|
|||
// Copyright 2020 Google LLC
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// An umbrella header, for any other libraries in this repo to access Firebase Public and Private
|
||||
// headers. Any package manager complexity should be handled here.
|
||||
|
||||
#if SWIFT_PACKAGE
|
||||
@import FirebaseCore;
|
||||
#else
|
||||
#import <FirebaseCore/FirebaseCore.h>
|
||||
#endif
|
||||
|
||||
#import "FirebaseCore/Sources/Private/FIRAppInternal.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRComponent.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRComponentContainer.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRDependency.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRHeartbeatInfo.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRLibrary.h"
|
||||
#import "FirebaseCore/Sources/Private/FIRLogger.h"
|
||||
#import "FirebaseCore/Sources/Private/FIROptionsInternal.h"
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <FirebaseInstallations/FIRInstallationsErrors.h>
|
||||
#import "FirebaseInstallations/Source/Library/Public/FIRInstallationsErrors.h"
|
||||
|
||||
@class FIRInstallationsHTTPError;
|
||||
|
||||
|
|
|
@ -14,9 +14,9 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsErrorUtil.h"
|
||||
#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h"
|
||||
|
||||
#import "FIRInstallationsHTTPError.h"
|
||||
#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h"
|
||||
|
||||
NSString *const kFirebaseInstallationsErrorDomain = @"com.firebase.installations";
|
||||
|
||||
|
|
|
@ -14,8 +14,8 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsHTTPError.h"
|
||||
#import "FIRInstallationsErrorUtil.h"
|
||||
#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsHTTPError.h"
|
||||
#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h"
|
||||
|
||||
@implementation FIRInstallationsHTTPError
|
||||
|
||||
|
@ -41,9 +41,10 @@
|
|||
+ (NSDictionary *)userInfoWithHTTPResponse:(NSHTTPURLResponse *)HTTPResponse
|
||||
data:(nullable NSData *)data {
|
||||
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
|
||||
NSString *failureReason = [NSString
|
||||
stringWithFormat:@"The server responded with an error. HTTP response: %@\nResponse body: %@",
|
||||
HTTPResponse, responseString];
|
||||
NSString *failureReason =
|
||||
[NSString stringWithFormat:@"The server responded with an error: \n - URL: %@ \n - HTTP "
|
||||
@"status code: %ld \n - Response body: %@",
|
||||
HTTPResponse.URL, (long)HTTPResponse.statusCode, responseString];
|
||||
return @{NSLocalizedFailureReasonErrorKey : failureReason};
|
||||
}
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallations.h"
|
||||
#import "FirebaseInstallations/Source/Library/Public/FIRInstallations.h"
|
||||
|
||||
#if __has_include(<FBLPromises/FBLPromises.h>)
|
||||
#import <FBLPromises/FBLPromises.h>
|
||||
|
@ -22,21 +22,16 @@
|
|||
#import "FBLPromises.h"
|
||||
#endif
|
||||
|
||||
#import <FirebaseCore/FIRAppInternal.h>
|
||||
#import <FirebaseCore/FIRComponent.h>
|
||||
#import <FirebaseCore/FIRComponentContainer.h>
|
||||
#import <FirebaseCore/FIRLibrary.h>
|
||||
#import <FirebaseCore/FIRLogger.h>
|
||||
#import <FirebaseCore/FIROptions.h>
|
||||
#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h"
|
||||
|
||||
#import "FIRInstallationsAuthTokenResultInternal.h"
|
||||
#import "FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h"
|
||||
|
||||
#import "FIRInstallationsErrorUtil.h"
|
||||
#import "FIRInstallationsIDController.h"
|
||||
#import "FIRInstallationsItem.h"
|
||||
#import "FIRInstallationsLogger.h"
|
||||
#import "FIRInstallationsStoredAuthToken.h"
|
||||
#import "FIRInstallationsVersion.h"
|
||||
#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h"
|
||||
#import "FirebaseInstallations/Source/Library/FIRInstallationsItem.h"
|
||||
#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h"
|
||||
#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsIDController.h"
|
||||
#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h"
|
||||
#import "FirebaseInstallations/Source/Library/Public/FIRInstallationsVersion.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
|
@ -89,10 +84,12 @@ NS_ASSUME_NONNULL_BEGIN
|
|||
projectID:appOptions.projectID
|
||||
GCMSenderID:appOptions.GCMSenderID
|
||||
accessGroup:appOptions.appGroupID];
|
||||
|
||||
// `prefetchAuthToken` is disabled due to b/156746574.
|
||||
return [self initWithAppOptions:appOptions
|
||||
appName:appName
|
||||
installationsIDController:IDController
|
||||
prefetchAuthToken:YES];
|
||||
prefetchAuthToken:NO];
|
||||
}
|
||||
|
||||
/// The initializer is supposed to be used by tests to inject `installationsStore`.
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsAuthTokenResultInternal.h"
|
||||
#import "FirebaseInstallations/Source/Library/FIRInstallationsAuthTokenResultInternal.h"
|
||||
|
||||
@implementation FIRInstallationsAuthTokenResult
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import <FirebaseInstallations/FIRInstallationsAuthTokenResult.h>
|
||||
#import "FirebaseInstallations/Source/Library/Public/FIRInstallationsAuthTokenResult.h"
|
||||
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import "FIRInstallationsStatus.h"
|
||||
#import "FirebaseInstallations/Source/Library/InstallationsIDController/FIRInstallationsStatus.h"
|
||||
|
||||
@class FIRInstallationsStoredItem;
|
||||
@class FIRInstallationsStoredAuthToken;
|
||||
|
|
|
@ -14,10 +14,10 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsItem.h"
|
||||
#import "FirebaseInstallations/Source/Library/FIRInstallationsItem.h"
|
||||
|
||||
#import "FIRInstallationsStoredAuthToken.h"
|
||||
#import "FIRInstallationsStoredItem.h"
|
||||
#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredAuthToken.h"
|
||||
#import "FirebaseInstallations/Source/Library/InstallationsStore/FIRInstallationsStoredItem.h"
|
||||
|
||||
@implementation FIRInstallationsItem
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
|
||||
#import <Foundation/Foundation.h>
|
||||
|
||||
#import <FirebaseCore/FIRLogger.h>
|
||||
#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h"
|
||||
|
||||
extern FIRLoggerService kFIRLoggerInstallations;
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsLogger.h"
|
||||
#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h"
|
||||
|
||||
FIRLoggerService kFIRLoggerInstallations = @"[Firebase/Installations]";
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsVersion.h"
|
||||
#import "FirebaseInstallations/Source/Library/Public/FIRInstallationsVersion.h"
|
||||
|
||||
// Convert the macro to a string
|
||||
#define STR(x) STR_EXPAND(x)
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsIIDStore.h"
|
||||
#import "FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDStore.h"
|
||||
|
||||
#if __has_include(<FBLPromises/FBLPromises.h>)
|
||||
#import <FBLPromises/FBLPromises.h>
|
||||
|
@ -23,7 +23,7 @@
|
|||
#endif
|
||||
|
||||
#import <CommonCrypto/CommonDigest.h>
|
||||
#import "FIRInstallationsErrorUtil.h"
|
||||
#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h"
|
||||
|
||||
static NSString *const kFIRInstallationsIIDKeyPairPublicTagPrefix =
|
||||
@"com.google.iid.keypair.public-";
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsIIDTokenStore.h"
|
||||
#import "FirebaseInstallations/Source/Library/IIDMigration/FIRInstallationsIIDTokenStore.h"
|
||||
|
||||
#if __has_include(<FBLPromises/FBLPromises.h>)
|
||||
#import <FBLPromises/FBLPromises.h>
|
||||
|
@ -22,9 +22,9 @@
|
|||
#import "FBLPromises.h"
|
||||
#endif
|
||||
|
||||
#import <GoogleUtilities/GULKeychainUtils.h>
|
||||
#import "GoogleUtilities/Environment/Private/GULKeychainUtils.h"
|
||||
|
||||
#import "FIRInstallationsErrorUtil.h"
|
||||
#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h"
|
||||
|
||||
static NSString *const kFIRInstallationsIIDTokenKeychainId = @"com.google.iid-tokens";
|
||||
|
||||
|
|
|
@ -14,9 +14,9 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#import "FIRInstallationsAPIService.h"
|
||||
#import "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsAPIService.h"
|
||||
|
||||
#import <FirebaseInstallations/FIRInstallationsVersion.h>
|
||||
#import "FirebaseInstallations/Source/Library/Public/FIRInstallationsVersion.h"
|
||||
|
||||
#if __has_include(<FBLPromises/FBLPromises.h>)
|
||||
#import <FBLPromises/FBLPromises.h>
|
||||
|
@ -24,11 +24,10 @@
|
|||
#import "FBLPromises.h"
|
||||
#endif
|
||||
|
||||
#import <FirebaseCore/FIRAppInternal.h>
|
||||
#import <FirebaseCore/FIRHeartbeatInfo.h>
|
||||
#import "FIRInstallationsErrorUtil.h"
|
||||
#import "FIRInstallationsItem+RegisterInstallationAPI.h"
|
||||
#import "FIRInstallationsLogger.h"
|
||||
#import "FirebaseCore/Sources/Private/FirebaseCoreInternal.h"
|
||||
#import "FirebaseInstallations/Source/Library/Errors/FIRInstallationsErrorUtil.h"
|
||||
#import "FirebaseInstallations/Source/Library/FIRInstallationsLogger.h"
|
||||
#import "FirebaseInstallations/Source/Library/InstallationsAPI/FIRInstallationsItem+RegisterInstallationAPI.h"
|
||||
|
||||
NSString *const kFIRInstallationsAPIBaseURL = @"https://firebaseinstallations.googleapis.com";
|
||||
NSString *const kFIRInstallationsAPIKey = @"X-Goog-Api-Key";
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue